2015-11-20 71 views
0

嘗試瞭解log4net過濾。 閱讀文檔後,有些方面對我來說依然難以捉摸。log4Net過濾多輸出混淆

例如,我有這個配置文件:

<?xml version="1.0" encoding="utf-8" ?> 

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="..\Logs\CurrentLog" /> 
    <appendToFile value="true" /> 

    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10000" /> 
    <staticLogFileName value="true" /> 

    <filter type="log4net.Filter.LevelRangeFilter"> 
     <acceptOnMatch value="true" /> 
     <levelMin value="INFO" /> 
     <levelMax value="FATAL" /> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%-5level %date [%thread] %-22.22c{1} - %m%n" /> 
    </layout> 
    </appender> 

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <file value="log-file.txt" /> 

    <appendToFile value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <header value="Service Logging -- Start" /> 
     <footer value="Service Logging -- End" /> 
     <conversionPattern value="%date [%thread] %-5level %logger [%ndc] 
       &lt;%property{auth}&gt; - %message%newline" /> 
    </layout> 

    </appender> 


    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
    <applicationName value="WindowsService1.exe" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger 
         [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <!-- Set the default logging level and add the active appenders --> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </root> 

    <!-- Specify the level for specific categories (「namespace.class」)--> 
    <logger name="WindowsService1.MyMonitor"> 
    <level value="WARN" /> 
    <appender-ref ref="EventLogAppender" /> 
    </logger> 

</log4net> 

我的期望是:

  • 的RollingFileAppender進行了一系列[INFO:FATAL]的根具有 級調試,因此它會讓DEBUG和「更大」通過。哪個 意味着所有的RollingFileAppender的範圍都會經過。
  • LogFileAppender沒有指定範圍,所以它將使用DEBUG或更大的Root。
  • EventLogAppender只會向Windows事件系統發送WARN或更高的事件消息 - - 它們只會從類「WindowsService1.MyMonitor」中發送 消息。

然而,看起來全部消息被過濾到WARN級別! 包括我的滾動日誌文件和日誌文件「log-file.txt」

這似乎應該很簡單 - 不知道爲什麼我很困惑它。 希望有人能啓發我。 請隨意使用蠟筆和圖片,因爲我認爲我需要它們。 謝謝。

UPDATE
在我的Program.cs我:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

而且在測井完成每個類:

private static readonly ILog log = 
      LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

更新2 在不同的計算機現在。必須重新創建所有內容並使用log4net調試進行協助。
但仍然無法獲得所需的輸出。

基本上希望WARN和上面的消息去一個文件和事件記錄器。這些消息將成爲所有INFO和以上消息的子集。 INFO和上述消息 - 超集 - 將進入滾動appender並最終覆蓋自己。但警告和錯誤將始終保持。

所以這裏是一個簡單服務的所有文件的返工。如果我在appender-ref ref=EventLogAppender上設置WARN,那麼所有的INFO都會被抑制。

的Program.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

// Ref: http://www.c-sharpcorner.com/UploadFile/naresh.avari/develop-and-install-a-windows-service-in-C-Sharp/ 
// 
// use 'sc' to install/delete the service 
// run 'sc' as administrator 
// sc create "MySillyService" binpath= "C:\whatever\something.exe" 
// sc delete "MySillyService" 

namespace SimpleService1 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 

      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service1() 
      }; 
      ServiceBase.Run(ServicesToRun); 
     } 
    } 
} 

Service1.cs

namespace SimpleService1 
{ 
    public partial class Service1 : ServiceBase 
    { 
     private static readonly ILog log = 
      LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

     private Timer timer1; 
     private int counter = 0; 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      timer1 = new Timer(); 
      timer1.Interval = 4000; 
      timer1.Elapsed += new ElapsedEventHandler(timer1_Tick); 
      timer1.Enabled = true; 
      log.Info("my service is started"); 
     } 

     private void timer1_Tick(object sender, ElapsedEventArgs e) 
     { 
      counter++; 
      if (counter%2 == 0) 
      { 
       log.Info(String.Format("Counter({0:D}) is now even", counter)); 
      } 
      else 
      { 
       log.Error(String.Format("Counter({0:D}) is now even", counter)); 
      } 
     } 

     protected override void OnStop() 
     { 
      timer1.Enabled = false; 
      log.Info("my service was stopped"); 
     } 
    } 
} 

應用。配置

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 

    <appSettings> 
    <add key="log4net.Internal.Debug" value="true"/> 
    </appSettings> 
    <system.diagnostics> 
    <trace autoflush="true"> 
     <listeners> 
     <add 
      name="textWriterTraceListener" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="C:\tmp\log4net.txt" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 
</configuration> 

Log4net.config

<?xml version="1.0" encoding="utf-8" ?> 

<!-- 
    Ref: http://mitch-wheat.blogspot.com/2007/04/log4net-net-logging-tool.html 
    I keep this config file in a separate directory and copy it with a 
    post-build event: 
    copy /Y $(SolutionDir)Logger\Log4Net.config $(TargetDir)Log4Net.config 
    --> 
<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="..\Logs\CurrentLog" /> 
    <appendToFile value="true" /> 

    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10000" /> 
    <staticLogFileName value="true" /> 

    <filter type="log4net.Filter.LevelRangeFilter"> 
     <acceptOnMatch value="true" /> 
     <levelMin value="INFO" /> 
     <levelMax value="FATAL" /> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%-5level %date [%thread] %-22.22c{1} - %m%n" /> 
    </layout> 
    </appender> 

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <file value="log-file.txt" /> 

    <appendToFile value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <header value="Service Logging -- Start - " /> 
     <footer value="Service Logging -- End - " /> 
     <conversionPattern value="%date [%thread] %-5level %logger [%ndc] 
       &lt;%property{auth}&gt; - %message%newline" /> 
    </layout> 

    </appender> 


    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
    <applicationName value="Service1" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger 
         [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <!-- Set the default logging level and add the active appenders --> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </root> 

    <!-- Specify the level for specific categories (�namespace.class�)--> 
    <logger name="SimpleService1.Service1"> 
    <level value="WARN" /> 
    <appender-ref ref="EventLogAppender" /> 
    </logger> 

</log4net> 

感謝您的幫助

+0

我不能重現此 - 信息記錄正在使用此配置啓用的,我看到它在文件中。你如何加載log4net配置? – stuartd

+0

@stuartd - 我更新了它。要添加更多的說明 - 這是一個Windows服務。但是這不應該有所作爲 - 對吧? –

+0

你能告訴你如何創建你的記錄器嗎? – stuartd

回答

0

終於想通了細微之處爲需要得到這個工作。這是有興趣的人的配置。

<?xml version="1.0" encoding="utf-8" ?> 

<!-- 

    I keep this config file in a separate directory and copy it with a 
    post-build event: 
    copy /Y $(SolutionDir)Logger\Log4Net.config $(TargetDir)Log4Net.config 
    --> 
<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="..\Logs\CurrentLog" /> 
    <appendToFile value="true" /> 

    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10000" /> 
    <staticLogFileName value="true" /> 

    <filter type="log4net.Filter.LevelRangeFilter"> 
     <acceptOnMatch value="true" /> 
     <levelMin value="INFO" /> 
     <levelMax value="FATAL" /> 
    </filter> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%-5level %date [%thread] %-22.22c{1} - %m%n" /> 
    </layout> 
    </appender> 

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <file value="log-file.txt" /> 
    <appendToFile value="true" /> 

      <filter type="log4net.Filter.LevelRangeFilter"> 
     <acceptOnMatch value="true" /> 
     <levelMin value="WARN" /> 
     <levelMax value="FATAL" /> 
    </filter> 

    <layout type="log4net.Layout.PatternLayout"> 
     <header value="Service Logging -- Start - " /> 
     <footer value="Service Logging -- End - " /> 
     <conversionPattern value="%date [%thread] %-5level %logger [%ndc] 
       &lt;%property{auth}&gt; - %message%newline" /> 
    </layout> 
    </appender> 


    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
    <!-- Put whatever name you want to display in the event log 
     for 'applicationName value=XX' 
    --> 
    <applicationName value="ServiceSkippy" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <acceptOnMatch value="true" /> 
     <levelMin value="WARN" /> 
     <levelMax value="FATAL" /> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger 
         [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 

    <!-- put namespace of service application in following name --> 
    <logger name="ServiceWithLog4Net"> 

    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="RollingFileAppender" /> 
    <appender-ref ref="EventLogAppender" /> 

    </logger> 

</log4net> 

-Skippy