2013-05-30 2 views
7

Я недавно пришел через log4net благодаря пользователю здесь. В любом случае, я хочу автоматически записывать каждый файл Console.Write() и Debug.Write() в один файл журнала, который я настроил. Кроме того, я использую многие библиотеки классов, в которых также есть операторы консоли/Debug, которые ничего не знают о log4net. Могут ли они также автоматически регистрироваться в файле журнала в зависимости от конфигурации? Возможно ли это?log4net Logging Debug.WriteLine и Console.WriteLine

То, что я хочу войти в прокатном лог-файл:

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

Instantiate Logger:

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> 

ответ

7

Вы можете перенаправить Debug.WriteLine (в отладочных строит) и Trace.WriteLine в log4net, написав обычай TraceListener, который регистрируется в 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 вы могли бы перенаправить на свой собственный TextWriter по телефону Console.SetOut, и ваш заказ TextWriter может войти в log4net.

+0

Joe, я принимаю ваш ответ, поскольку он отвечает на мой вопрос относительно вывода Debug и Console.WriteLines в log4net. Тем не менее, мне было проще добавить log4net в каждый проект и изменить операторы отладки. Спасибо. – JMooney

+0

Кто-нибудь испытывает тупики? – dmarlow