2012-01-03 93 views
0

我一直在試驗log4net,因爲它似乎不支持我的項目需要的特定日誌記錄功能。 總之,我希望能夠在代碼中控制日誌文件路徑。這條路將不斷變化。特定用例是一組文件系統觀察者,並且每個實例需要單獨的日誌文件。日誌文件路徑可以隨時更改(正常)

可以這樣做嗎?

我想能夠在代碼中指定一個控制日誌記錄目標的變量。

例如:

var log4NetLogger1 = new Log4NetLogger("LogFileAppender1"); 

log4NetLogger1.InformationEvent("Log message 1"); 

var log4NetLogger2 = new Log4NetLogger("LogFileAppender2"); 

log4NetLogger2.InformationEvent("Log message 2"); 

在上述例子中,我傳遞一個字符串log4net的包裝,在配置相匹配的附加目的地名稱。這個想法是,log4net包裝程序通過使用GetLogger修改使用的appender來更改日誌記錄目標。

_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>