log4net 日志 Debug.WriteLine 和 Console.WriteLine

8

我最近在这里的一个用户介绍下了log4net。无论如何,我希望将每个Console.Write()和Debug.Write()都自动记录到我配置的单个日志文件中。此外,我使用许多类库,它们也有与log4net无关的Console/Debug语句。这些是否可以根据配置自动记录到日志文件中?这些都可能吗?

我想在滚动日志文件中记录的内容:

Console.WriteLine("console statement");
Debug.WriteLine("debug statement");

实例化日志记录器:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static void InitializeLogger()
{
    XmlConfigurator.Configure();
}

整个 app.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="SubToolsPortServerTest.log"/>
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="2" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>
      </layout>
    </appender>

    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </root>
  </log4net>
</configuration>
1个回答

8

您可以通过编写自定义TraceListenerDebug.WriteLine(在调试构建中)和Trace.WriteLine重定向到log4net,以记录日志。一个简单实现的要点如下:

public class Log4NetTraceListener : TraceListener
{
    ILog _logger = ...;

    public override void WriteLine(string message)
    {
        _logger.Info(message);
    }
}

您可以在应用程序的配置文件中进行如下配置:

例如:

<system.diagnostics>
  ...
    <listeners>
      <add name="traceListener" type="MyNamespace.Log4NetTraceListener,MyAssembly" />
    </listeners>
   ...
</system.diagnostics>

更完整的实现可能支持配置日志记录器名称、要使用的日志记录级别以及可能对消息进行一些内部缓冲。

对于Console.WriteLine,您可以通过调用Console.SetOut将其重定向到自己的自定义TextWriter,并且您的自定义TextWriter可以记录到log4net。


Joe,我接受你的答案,因为它回答了我的问题,即如何将Debug和Console.WriteLines输出到log4net。然而,我发现在每个项目中添加log4net并更改调试语句更容易。谢谢。 - juicebyjustin
有人在做这个时遇到死锁的情况吗? - dmarlow

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