Log4Net多个记录器 [英] Log4Net Multiple loggers

查看:92
本文介绍了Log4Net多个记录器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我在其他主题(最相似的是: Log4Net:多个记录器),但没有适用的答案.

First of all, I have seen a lot of answers and tips in others topics (most similar: Log4Net: Multiple loggers), but there is no applicable answer.

我希望有2个具有不同文件附加程序的记录器,并限制每个记录器都写入根记录器.这是控制台应用程序.整个代码如下:

I want to have 2 loggers with different file appenders and restrict each to write into root logger. It is Console app. Whole code below:

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

和App.config文件:

And App.config file:

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

控制台输出:

Logger: Async
Appenders: FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderA

文件已创建,但它们均为空. 当我在根目录中指定附加程序时,例如:

Files have been created, but both of them are empty. When I specify appenders in root, like:

<root>
    <level value="All"/>
    <appender-ref ref="FileInfoAppenderA"/>
    <appender-ref ref="FileInfoAppenderS"/>
</root>

然后,控制台:

log4net:ERROR [RollingFileAppender] Attempted to append to closed appender named [FileInfoAppenderS]
Logger: Async
Appenders: FileInfoAppenderA, FileInfoAppenderS
Logger: Sync
Appenders: FileInfoAppenderA, FileInfoAppenderS

并且仅在AsyncTest.log中:

And only in AsyncTest.log:

2014-04-11 17:26:58,142 - started async
2014-04-11 17:26:58,151 - started sync

我做错了什么?

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

UPD (10/21/2014): With latest log4net available via Nuget I have following console output:

Logger: Async
Appenders: FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderA

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

And both of files (AsyncTest.log, SyncTest.log) are empty.

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

UPD (08/4/2015): Solution is to use lower case when setting the attributes for everything in log4net section. So, I just should have changed following lines in app.config:

......
<logger name="Sync" additivity="false">
......
<logger name="Async" additivity="false">
......

请注意不同之处:属性名称"为小写.

Note the difference: attribute 'name' is in lower case.

推荐答案

您的示例中有几种错别字.首先是您不关闭配置标签,而为什么只进入一个文件,是因为您调用:

You have several typos on your example. First is you don't close the configuration tag, and why you're getting only in one file, is because you call:

logger.Info("started async");

然后您出人意料地做到了:

and after that you surprisingly do:

logger.Info("started sync");

由于您实际上并未登录,因此您将无法写入第二个文件.

You will not get writing in the second file because you actually don't log to it.

在控制台中,我从您的代码中得到

And in console I get from your code:

Logger: Async
Appenders: FileInfoAppenderS, FileInfoAppenderA
Logger: Sync
Appenders: FileInfoAppenderS, FileInfoAppenderA

对于将来的信息,您通过将可加性设置为false来正确完成操作,因为这意味着记录器将不会从根记录器继承.至于声明:

For future information, you did correctly by putting additivity to false, because this means that the loggers will not inherit from root logger. As about the statement:

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

I want to have 2 loggers with different file appenders and restrict each to write into root logger

我不明白.例如,如果您希望记录器在拥有控制台附加程序的root记录器中写入这些文件,则只需删除可加性,它们就会写入控制台和它们自己的文件.还经过测试,效果很好.

I do not understand it. If you want that your loggers write to these files while root logger having a console appender for example, just remove additivity and they will write to console and their own files. Also tested and it works very well.

我已阅读您的评论.现在,我添加我正在使用的代码并获得所需的内容:

I have read your comment. Now I add the code that I'm using and getting what you need:

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

和app.config:

And the 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>

Log4net版本:1.2.13.0和.NET 4.0 请告诉我您是否想要的东西.

Log4net version: 1.2.13.0 with .NET 4.0 Tell me please if you get what you want.

这篇关于Log4Net多个记录器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆