以编程方式配置 log4net,但额外的日志记录到控制台
Posted
技术标签:
【中文标题】以编程方式配置 log4net,但额外的日志记录到控制台【英文标题】:Configuring log4net programmatically, but extra logging going to console 【发布时间】:2021-10-18 02:11:09 【问题描述】:我已从Can you configure log4net in code instead of using a config file? 获取代码并将其放入我的小型 NET5 应用程序中。到目前为止,日志文件似乎还可以,但是由于我没有配置任何进入控制台的附加程序,而只有一个滚动文件附加程序,所以我没想到会有任何东西进入控制台。然而,这正是正在发生的事情——我的消息将发送到控制台,尽管格式不同,它也没有使用我的模式布局。
这是我目前需要设置的:
private void SetupLog4Net()
var hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();
hierarchy.Root.Level = Level.Debug;
var patternLayout = new PatternLayout
ConversionPattern = "%dateyyyy-MM-dd HH:mm:ss.fff [%logger] %message%newline%exception",
;
patternLayout.ActivateOptions();
var rollingFileAppender = new RollingFileAppender
AppendToFile = true,
File = @"Logs/uav.log",
Layout = patternLayout,
MaxSizeRollBackups = 5,
MaxFileSize = 1_000_000,
RollingStyle = RollingFileAppender.RollingMode.Size,
StaticLogFileName = true,
Encoding = System.Text.Encoding.UTF8,
;
rollingFileAppender.ActivateOptions();
hierarchy.Root.AddAppender(rollingFileAppender);
hierarchy.Root.Level = Level.Info;
hierarchy.Configured = true;
BasicConfigurator.Configure(hierarchy);
这被称为 Main 所做的第一件事中的第一件事(构造应用程序对象,这是通过构造函数调用的),然后我们才开始做任何其他事情。
然后,稍后,当我们调用记录内容时,例如,
var logger = LogManager.GetLogger(this.GetType());
logger.Info(message.Message, message.Exception);
我得到如下输出:
1780 [6] INFO MyClass.MainApp (null) - Ready
我什至无法理解其中的一半,但有意义不是重点 - 清除这个 appender 是。对实际配置的评论与 cmets 一样好,但主要问题是如何删除该控制台输出。
在 Linux 上使用 Log4NET 2.0.12 和 .NET 5.0.400
【问题讨论】:
如果您在 .NET 5 中使用 SeriLog,那就太好了。它比现代更现代,您可以在那里为 seriLog 使用更多功能。 infoworld.com/article/3624022/… 我不记得说过我正在构建一个 ASP 应用程序。我不是。另外,我在多种语言中使用 Log4* 系列,通常不会有这个问题,并且希望尽可能保持一致。此外,这个“答案”对可能搜索这个的普通人没有帮助。 问:问题是您收到一条无关的日志消息,上面写着“准备就绪”......并且您想抑制它。其他一切都按您的预期工作。正确的?问:您能否向我们展示更多的“无关信息”?也许这可能会给我们一个线索,它们来自哪里……以及如何关闭它们。 “就绪”消息是一条有效消息,但我只希望它出现在“Logs/uav.log”日志文件中。它显示在那里,但也显示在控制台上。事实上,进入日志文件的所有内容(正确!)也在控制台上以不同的格式复制,而目标是控制台为空。 嘿伙计,尝试删除行“BasicConfigurator.Configure(hierarchy);”如果您不写信给控制台,我认为您不需要它。 【参考方案1】:根据log4net配置页面,调用BasicConfigurator.Configure()方法会“设置一个简单的配置登录到控制台。”
看到您已经以编程方式将内容配置为写入文件,因此无需包含以下行:
BasicConfigurator.Configure();
【讨论】:
【参考方案2】:好的:所以您的 REAL 问题是“如何禁用 Log4Net 控制台日志记录?”
记住:在 Java 中,“log4j”是“记录器”。然而,在 .Net 中,Log4net 与 Microsoft.Extensions.Logging 共存。所以有“额外的东西”,可能会产生“惊喜”。 .Net 本身(例如 Net 5,nee “.Net Core”)也可能产生“惊喜”。
具体来说,这里讨论了几种解决方案:
How do I disable log4net status messages to the console?
一个。将
log4net.Config.BasicConfigurator.Configure();
更改为log4net.Config.XmlConfigurator.Configure();
b.设置调试 = 假
c。在您的应用配置文件中修改“log4net.Internal.Debug”(例如 “appsettings.json”)
<appSettings> <add key="log4net.Internal.Debug" value="false"/>
另请参阅 Log4Net 常见问题解答:
http://logging.apache.org/log4net/release/faq.html
内部调试消息被写入控制台和 System.Diagnostics.Trace 系统。如果应用程序没有 控制台记录的消息将丢失。请注意,一个 应用程序可以通过设置重定向控制台流 System.Console.Out.
由于 log4net 内部调试消息被写入 System.Diagnostics.Trace 系统可以重定向那些 消息到本地文件。
【讨论】:
以上是关于以编程方式配置 log4net,但额外的日志记录到控制台的主要内容,如果未能解决你的问题,请参考以下文章