首页 > 解决方案 > 以编程方式配置 log4net,但额外的日志记录到控制台

问题描述

我从Can you configure log4net in code 而不是使用配置文件中获取了代码?并将其放入我的小 NET5 应用程序中。到目前为止,日志文件似乎还可以,但是由于我没有配置任何进入控制台的附加程序,而只有一个滚动文件附加程序,所以我没想到会有任何东西进入控制台。然而,这正是正在发生的事情——我的消息将发送到控制台,尽管格式不同,它也没有使用我的模式布局。

这就是我目前的设置:

    private void SetupLog4Net()
    {
        var hierarchy = (Hierarchy)LogManager.GetRepository();
        hierarchy.Root.RemoveAllAppenders();
        hierarchy.Root.Level = Level.Debug;
        
        var patternLayout = new PatternLayout
        {
            ConversionPattern = "%date{yyyy-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 才是。对实际配置的评论可以作为评论,但主要问题是如何删除该控制台输出。

在 Linux 上使用 Log4NET 2.0.12 和 .NET 5.0.400

标签: c#configurationlog4net

解决方案


好的:所以您真正的问题是“如何禁用 Log4Net 控制台日志记录?”

  1. 请记住:在 Java 中,“log4j”是“记录器”。然而,在 .Net 中,Log4net 与 Microsoft.Extensions.Logging 共存。所以有“额外的东西”,可能会产生“惊喜”。.Net 本身(例如 Net 5,nee “.Net Core”)也可能产生“惊喜”。

  2. 具体来说,这里讨论了几种解决方案:

如何禁用控制台的 log4net 状态消息?

一个。更改log4net.Config.BasicConfigurator.Configure();log4net.Config.XmlConfigurator.Configure();

湾。设置调试 = 假

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 系统,因此可以将这些消息重定向到本地文件。


推荐阅读