Log4Net日志在控制台窗口中显示

5

我和大多数人使用Log4net的问题不同。我有一个基本的滚动日志附加器,在我的代码后台中使用INFO、WARN和ERROR级别。我在app.config中关闭了调试模式,但它仍然会将日志数据推送到控制台窗口,除了滚动日志附加器之外。

我该如何停止这种行为?这让查看控制台窗口变得非常困难。

我的配置:

<log4net debug="false">
  <appender name="RollingFileAppender"
            type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString"
          value="milliondollars.log"/>
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Composite"/>
    <filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
      <levelMin value="INFO" />
      <levelMax value="FATAL" />
    </filter>
    <datePattern value="yyyyMMdd"/>
    <maxSizeRollBackups value="100"/>
    <maximumFileSize value="15MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %-5level %logger: %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingFileAppender" />
  </root>
</log4net>

我在一个全新的控制台项目中使用了上述配置,但它仍然只有一个appender,并且仍然将日志发送到控制台窗口。这是怎么回事? :/ - Tom Whitaker
这里缺少的部分是创建记录器实例的代码,他可能遇到了和我类似的问题。https://dev59.com/8VfUa4cB1Zd3GeqPLtEG#18122298 - Paul C
3个回答

2

好的,看起来你不想透露更多的细节...

我可以想到以下可能的原因:

  • 您在任何<logger><root>部分下列出了控制台 appender
  • 您以编程方式注册控制台 appender
  • 您有一个日志记录器包装器,在记录日志之前始终运行 Console.Write 行。

我的 assembly.cs 文件中有以下代码: [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]我的日志记录器是这样初始化的: private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);很遗憾,这三个想法都不行 :/ - Tom Whitaker
是的,只有上面粘贴的配置中的一个引用。 - Tom Whitaker
@Tom Whitaker - 我使用了您提供的配置文件和设置。我可以看到milliondollars.log文件已创建,并且测试日志行已经记录。同时,控制台窗口中没有任何内容。您能否尝试从头开始创建一个简单的项目,看看是否有相同的问题? - Alex Aza
你的第一条解决方案解决了我的问题!我之前使用了 <root><appender-ref="console" />,但是没有在 <appender/> 中定义它! - Exegesis

1

根据您提供的额外信息,我可以看到几件事情。首先,您正在记录所有消息(包括DEBUG消息)。只是没有显示log4net调试信息。至于为什么要写到控制台窗口,我建议查看记录器消息的包装器。也许您正在那里写入控制台。

此外,在调试模式下执行程序。查看哪行在写入您的控制台。


我检查了一下,Logger类只是调用log.Info或log.Error。 - Tom Whitaker
@Tom Whitaker - 听起来很疯狂,但你确定你正在从正确的配置文件中提取吗?也许你有一个旧的配置文件存储在其他地方,而不是你认为正在读取的那个。 - IAmTimCorey
2
啊啊啊。这是问题吗?// 配置日志记录 log4net.Config.BasicConfigurator.Configure(); - Tom Whitaker
现在已经修改为:log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("log4net.config"));现在它可以正常工作了,谢谢大家。 - Tom Whitaker

0

我的问题是在创建记录器实例时使用了这个;

        log4net.Config.BasicConfigurator.Configure();
        ILog log = log4net.LogManager.GetLogger(typeof(Program));

我花了一点时间才弄清楚,它忽略了我的配置并使用默认值进行初始化。按照其他人的建议将其替换为以下内容,现在它可以正常工作;

    private static readonly log4net.ILog log = log4net.LogManager.GetLogger
   (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

来源:http://elegantcode.com/2007/12/07/getting-started-with-log4net/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接