Dot-Net

log4net 日誌記錄 Debug.WriteLine 和 Console.WriteLine

  • May 30, 2013

感謝這裡的一位使用者,我最近遇到了 log4net。無論如何,我想將每個 Console.Write() 和 Debug.Write() 自動記錄到我配置的單個日誌文件中。此外,我使用許多類庫,它們也有對 log4net 一無所知的控制台/調試語句。這些也可以根據配置自動記錄到日誌文件嗎?這有可能嗎?

我想在滾動日誌文件中記錄的內容:

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>

您可以通過編寫一個記錄到 log4net的自定義來重定向Debug.WriteLine(在調試版本中)和log4net。一個簡單的實現的主要部分看起來像:Trace.WriteLine``TraceListener

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重定向到您自己的自定義,並且您的自定義可以登錄到 log4net。TextWriter``Console.SetOut``TextWriter

引用自:https://stackoverflow.com/questions/16838881