2012-01-03 3 views
0

Я экспериментировал с log4net, поскольку, похоже, он не поддерживает определенную функцию ведения журнала, которую мне нужен. Короче говоря, я хочу иметь возможность контролировать путь к файлу журнала в коде. Этот путь будет постоянно меняться. Конкретный вариант использования - это набор наблюдателей файловой системы, и для каждого экземпляра требуется отдельный файл журнала.Может ли путь к файлу журнала изменяться «на лету» (reguarly)

Можно ли это сделать?

Я хочу, чтобы иметь возможность указать переменную, которая управляет назначением записи в коде.

Например:

var log4NetLogger1 = new Log4NetLogger("LogFileAppender1"); 

log4NetLogger1.InformationEvent("Log message 1"); 

var log4NetLogger2 = new Log4NetLogger("LogFileAppender2"); 

log4NetLogger2.InformationEvent("Log message 2"); 

В приведенном выше примере, я передаю строку в log4net обертку, который соответствует имени Appender в конфигурации. Идея состоит в том, что обертка log4net изменяет цель ведения журнала, изменяя приложение, используемое через GetLogger.

_log = log4net.LogManager.GetLogger(appenderName); 

В результате создается два разных файла журнала, но сообщение журнала записывается в оба. Похоже, что какой-то аспект конфигурации log4net является глобальным, и я не могу изменить путь журнала на лету таким образом.

Файл конфигурации:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/> 
    </configSections> 

    <log4net> 

    <root> 
     <appender-ref ref="LogFileAppender1"/> 
     <appender-ref ref="LogFileAppender2"/> 
    </root> 

    <appender name="LogFileAppender1" type="log4net.Appender.RollingFileAppender"> 
     <threshold value="INFO"/> 
     <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog1.txt"/> 
     <param name="AppendToFile" value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="10MB"/> 
     <staticLogFileName value="true"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/> 
     </layout> 
    </appender> 

    <appender name="LogFileAppender2" type="log4net.Appender.RollingFileAppender"> 
     <threshold value="INFO"/> 
     <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog2.txt"/> 
     <param name="AppendToFile" value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="10MB"/> 
     <staticLogFileName value="true"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/> 
     </layout> 
    </appender> 

    </log4net> 

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 

Полный класс обертку:

using System; 
using log4net; 

namespace Log4NetRunner 
{ 
    public enum LoggingLevel 
    { 
     Information, 
     Warning, 
     Error 
    } 

    public class Log4NetLogger 
    { 
     private readonly ILog _log; 

     public Log4NetLogger(Type type) 
     { 
      if (_log == null) 
      { 
       _log = log4net.LogManager.GetLogger(type); 
      } 
     } 

     public Log4NetLogger(string appenderName) 
     { 
      if (_log == null) 
      { 

       _log = log4net.LogManager.GetLogger(appenderName); 
      } 
     } 

     public void FatalErrorEvent(string messageText) 
     { 
      SendLog(messageText, LoggingLevel.Error); 
     } 

     public void WarningEvent(string messageText) 
     { 
      SendLog(messageText, LoggingLevel.Warning); 
     } 

     public void InformationEvent(string messageText) 
     { 
      SendLog(messageText, LoggingLevel.Information); 
     } 

     private void SendLog(string messageText, LoggingLevel logLevel) 
     { 
      ILog logger = _log; 

      switch (logLevel) 
      { 
       case LoggingLevel.Error: 
        logger.Error(messageText); 
        break; 
       case LoggingLevel.Warning: 
        logger.Warn(messageText); 
        break; 
       case LoggingLevel.Information: 
        logger.Info(messageText); 
        break; 
       default: 
        logger.Error("Unknown Logging level: " + messageText); 
        break; 
      } 
     } 
    } 
} 

ответ

0

Да, может, вам просто необходимо использовать раздел Лесорубы в конфигурации.

http://www.beefycode.com/post/Log4Net-Tutorial-pt-5-Using-Logger-Objects.aspx

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/> 
    </configSections> 

    <log4net> 

    <root> 
     <!--<appender-ref ref="LogFileAppender1"/> 
     <appender-ref ref="LogFileAppender2"/>--> 
    </root> 

    <logger name="Logger1"> 
     <level value="ALL" /> 
     <appender-ref ref="LogFileAppender1" /> 
    </logger> 

    <logger name="Logger2"> 
     <level value="ALL" /> 
     <appender-ref ref="LogFileAppender2" /> 
    </logger> 

    <appender name="LogFileAppender1" type="log4net.Appender.RollingFileAppender"> 
     <threshold value="INFO"/> 
     <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog1.txt"/> 
     <param name="AppendToFile" value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="10MB"/> 
     <staticLogFileName value="true"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/> 
     </layout> 
    </appender> 

    <appender name="LogFileAppender2" type="log4net.Appender.RollingFileAppender"> 
     <threshold value="INFO"/> 
     <param name="File" value="C:\Tmp\EDP_TEST\LOG_DESTINATION\TestLog2.txt"/> 
     <param name="AppendToFile" value="true"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="10MB"/> 
     <staticLogFileName value="true"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n"/> 
     </layout> 
    </appender> 

    </log4net> 

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> 
Смежные вопросы