Log4Net - 如何添加仅用于特定代码段的第二个记录器

Jon*_*lis 38 .net c# logging log4net visual-studio-2010

我正在使用Log4Net 2.0,我根据需要工作,但是为特定的日志语句添加另一个记录器.所有日志记录都是针对单个文件追加器完成的.我想要做的更改是第三方应用程序触发包含调试/错误信息的事件,我可以捕获这些信息,虽然有用但我觉得它污染了正常的应用程序日志文件,而是宁愿将它存储在自己的日志中文件.

我想要的最终结果是一个名为log-file.txt来自应用程序的所有日志记录的文件,除了第三方日志记录.并且第二个文件log-file-3rdparty.txt仅使用第三方应用程序进行日志记录.我的问题是设置Log4Net有2个单独的记录器.我已经尝试创建第二个LogFileAppender并将其添加到root,但是所有这一切都将相同的日志记录语句放入两个记录器中.

在整个应用程序中,我们目前拥有GetLogger语句,如下所示.理想情况下,这需要保持不变,因此现有的日志记录不会改变.我需要一个不受此语句影响的新记录器,而是纯粹为第三方记录实例化.

private readonly ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

而App.Config如下.

< log4net>
<logger name="MyApp.Logging">
  <level value="DEBUG"/>
</logger>

<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
</root>

<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
  <param name="File" value="log-file.txt" />
  <param name="AppendToFile" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="Header" value="&#13;&#10;[Application started]&#13;&#10;" />
    <param name="Footer" value="[Application Finished]&#13;&#10;"/>
    <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
  </layout>
</appender>
</ log4net>
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?

编辑

如果它有任何区别.第三方日志事件捕获在同一个类中,我的一些应用程序日志事件也被触发,这是因为该类负责控制第三方软件.这是一个问题吗?我确实有一些想法,log4net可以区分基于类名创建的记录器,如果是这样的话,我是否需要重构第三方记录到自己的类?

Ste*_*gli 90

您可以轻松创建这样的特殊记录器:

ILog specialLogger = LogManager.GetLogger("SpecialLogger");
Run Code Online (Sandbox Code Playgroud)

然后,您可以将系统配置为使用此记录器的专用appender:

<logger name="SpecialLogger" additivity="false">
   <level value="ALL" />
   <appender-ref ref="SpecialLogFileAppender" />
</logger>
<root>
   <level value="ALL" />
   <appender-ref ref="LogFileAppender" />
</root>
Run Code Online (Sandbox Code Playgroud)

  • 我错过了记录器配置中的`additivity ="false"`属性.谷歌搜索30分钟找到这个 - 投了票. (4认同)