2015-11-20 70 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