Log4Net多个记录器

Lao*_*aoR 15 logging rollingfileappender log4net-configuration

首先,我在其他主题中看到了很多答案和提示(最相似的是:Log4Net:多个记录器),但没有适用的答案.

我希望有2个记录器具有不同的文件追加器,并限制每个记录器写入根记录器.它是控制台应用程序.以下全部代码:

using System;
using System.Diagnostics;
using System.Linq;
using log4net;

namespace Test_log4net
{
class Program
{
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();

        ILog logger = LogManager.GetLogger("Async");
        logger.Info("started async");
        Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));


        ILog logger2 = LogManager.GetLogger("Sync");
        logger2.Info("started sync"); //changed: from logger -> to logger2 on 10/21/2014
        Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));

        Console.ReadKey();
    }       
}
}
Run Code Online (Sandbox Code Playgroud)

和App.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<log4net>
    <root>
        <level value="All"/>
    </root>

    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender">
        <file value="D:\\temp\\AsyncTest.log"/>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG"/>
            <levelMax value="FATAL"/>
        </filter>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="100MB"/>
        <staticLogFileName value="true"/>
        <datePattern value="yyyyMMdd"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%d - %m%n"/>
        </layout>
    </appender>

    <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender">
        <file value="D:\\temp\\SyncTest.log"/>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="DEBUG"/>
            <levelMax value="FATAL"/>
        </filter>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="100MB"/>
        <staticLogFileName value="true"/>
        <datePattern value="yyyyMMdd"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%d - %m%n"/>
        </layout>
    </appender>

    <logger Name="Sync" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="FileInfoAppenderS"/>
    </logger>

    <logger Name="Async" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="FileInfoAppenderA"/>
    </logger>

</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

和控制台输出:

Logger: Async
Appenders: FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderA
Run Code Online (Sandbox Code Playgroud)

已创建文件,但它们都是空的.当我在root中指定appender时,例如:

<root>
    <level value="All"/>
    <appender-ref ref="FileInfoAppenderA"/>
    <appender-ref ref="FileInfoAppenderS"/>
</root>
Run Code Online (Sandbox Code Playgroud)

然后,控制台:

log4net:ERROR [RollingFileAppender] Attempted to append to closed appender named [FileInfoAppenderS]
Logger: Async
Appenders: FileInfoAppenderA, FileInfoAppenderS
Logger: Sync
Appenders: FileInfoAppenderA, FileInfoAppenderS
Run Code Online (Sandbox Code Playgroud)

并且仅在AsyncTest.log中:

2014-04-11 17:26:58,142 - started async
2014-04-11 17:26:58,151 - started sync
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

UPD(10/21/2014):通过Nuget提供最新的log4net我有以下控制台输出:

Logger: Async
Appenders: FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderA
Run Code Online (Sandbox Code Playgroud)

两个文件(AsyncTest.log,SyncTest.log)都是空的.

UPD(08/4/2015):解决方案是在log4net部分设置所有内容的属性时使用小写.所以,我应该更改app.config中的以下行:

......
<logger name="Sync" additivity="false">
......
<logger name="Async" additivity="false">
......
Run Code Online (Sandbox Code Playgroud)

注意区别:属性'name'是小写的.

XMi*_*ght 19

你的例子有几个拼写错误.首先,您不要关闭配置标记,以及为什么只获取一个文件,因为您调用:

logger.Info("started async");
Run Code Online (Sandbox Code Playgroud)

之后你出人意料地做了:

logger.Info("started sync");
Run Code Online (Sandbox Code Playgroud)

你不会在第二个文件中写入,因为你实际上没有登录它.

在控制台中我从你的代码中得到:

Logger: Async
Appenders: FileInfoAppenderS, FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderS, FileInfoAppenderA
Run Code Online (Sandbox Code Playgroud)

对于将来的信息,您通过将additivity置为false来正确执行,因为这意味着记录器不会从root logger继承.关于声明:

我希望有2个记录器具有不同的文件追加器,并限制每个记录器写入根记录器

我不明白.如果你想让你的记录器写入这些文件,而root logger例如有一个控制台appender,只需删除additivity,他们就会写入控制台和他们自己的文件.也经过测试,效果很好.

我看过你的评论.现在我添加我正在使用的代码并获得您需要的代码:

class Program
{
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();

        ILog logger = LogManager.GetLogger("Async");
        logger.Info("started async");
        Console.WriteLine("Logger: {0}", (logger as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));


        ILog logger2 = LogManager.GetLogger("Sync");
        logger2.Info("started sync");
        Console.WriteLine("Logger: {0}", (logger2 as log4net.Core.LogImpl).Logger.Name);
        Console.WriteLine("Appenders: {0}", string.Join(", ", (logger2 as log4net.Core.LogImpl).Logger.Repository.GetAppenders().ToList().Select(appendr => appendr.Name)));

        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

和app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <log4net>
    <appender name="FileInfoAppenderA" type="log4net.Appender.RollingFileAppender">
      <file value="C:\\temp\\AsyncTest.log"/>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG"/>
        <levelMax value="FATAL"/>
      </filter>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="100MB"/>
      <staticLogFileName value="true"/>
      <datePattern value="yyyyMMdd"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d - %m%n"/>
      </layout>
    </appender>

      <appender name="FileInfoAppenderS" type="log4net.Appender.RollingFileAppender">
        <file value="C:\\temp\\SyncTest.log"/>
        <filter type="log4net.Filter.LevelRangeFilter">
          <levelMin value="DEBUG"/>
          <levelMax value="FATAL"/>
        </filter>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="100MB"/>
        <staticLogFileName value="true"/>
        <datePattern value="yyyyMMdd"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%d - %m%n"/>
        </layout>
      </appender>

    <root>
      <level value="INFO"/>
    </root>

    <logger name="Sync" additivity="false">
      <level value="INFO"/>
      <appender-ref ref="FileInfoAppenderS"/>
    </logger>

    <logger name="Async" additivity="false">
      <level value="INFO"/>
      <appender-ref ref="FileInfoAppenderA"/>
    </logger>
  </log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

Log4net版本:1.2.13.0 with .NET 4.0如果你得到你想要的,请告诉我.