以编程方式配置 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,但额外的日志记录到控制台的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式强制 log4net 释放日志文件以便可以访问它?

扩展 log4net - 向每个日志添加额外数据

日志记录工具 log4net 的配置与使用

Log4Net之记录日志到数据库

可以将 log4net 配置为以自己的身份运行吗?

.Net Log4Net配置多文件日志记录