log4Net过滤多输出混乱

时间:2015-11-20 17:12:03

标签: log4net log4net-appender log4net-filter

尝试了解log4net过滤。 阅读完文档之后,我仍然难以理解某些方面。

例如,我有这个配置文件:

<?php

namespace App\Http\Controllers;

use App\Repos\UserRepositoryInterface;

class UserController extends Controller
{

    private $users;

    public function __construct(UserRepositoryInterface $users)
    {
        $this->users = $users;
    }

}

我的期望是:

  • RollingFileAppender的范围为[INFO:FATAL] Root有一个 DEBUG的级别,所以它会让DEBUG和&#34;更大&#34;通过。哪一个 意味着所有RollingFileAppender的范围都会通过。
  • LogFileAppender没有指定范围,因此它将使用DEBUG或更高版本的Root。
  • EventLogAppender只会向Windows事件系统发送WARN或更高的事件消息 - - 他们只会 是来自班级的消息&#34; WindowsService1.MyMonitor&#34;。

然而,似乎所有消息传递被过滤到WARN级别! 包括我的滚动日志文件和日志文件&#34; log-file.txt&#34;

这似乎应该很简单 - 不知道为什么我对此感到困惑。 希望有人能赐教。 请随意使用蜡笔和图片因为我认为我需要它们。 感谢。

更新
在我的Program.cs中,我有:

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

在每个完成日志记录的课程中:

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

更新2 现在在另一台电脑上。不得不重新创建所有内容并使用log4net调试来协助 但仍然无法获得所需的输出。

基本上希望WARN及以上消息转到一个文件和事件记录器。这些消息将是所有INFO及以上消息的子集。 INFO及以上消息 - 超集 - 将进入滚动的appender并最终覆盖自己。但警告和错误将始终保持不变。

所以这里是一个简单服务的所有文件的返工。如果我在private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 上设置WARN,那么所有INFO都会被抑制。

Program.cs的

appender-ref ref=EventLogAppender

Service1.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);
        }
    }
}

的App.config

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");
        }
    }
}

Log4net.config

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

感谢您的帮助

1 个答案:

答案 0 :(得分: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