문제

우선, 나는 다른 사람들에게 많은 답변과 팁을 보았습니다 (가장 비슷한 : 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();
    }       
}
}
.

및 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>
.

및 콘솔 출력 :

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

파일이 작성되었지만 둘 다 비어 있습니다. 루트에 Appenders를 지정할 때 다음과 같이 다음과 같이 지정하십시오.

<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에서만 :

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

내가 뭘 잘못하고 있는가?

UPD (10/21/2014) : nuGet을 통해 사용 가능한 최신 log4net을 사용하여 콘솔 출력 다음을 수행합니다.

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

및 둘 다 파일 (asynctest.log, synctest.log)이 비어 있습니다.

UPD (08/4/2015) : 솔루션은 log4net 섹션의 모든 것에 대한 속성을 설정할 때 소문자를 사용하는 것입니다. 그래서, 나는 단지 app.config에서 다음 줄을 바꿨어야합니다.

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

에 유의하십시오 : difference : 속성 'name'은 소문자입니다.

도움이 되었습니까?

해결책

예제에 여러 가지 오타가 있습니다. 먼저 구성 태그를 닫지 않으며 하나의 파일에서만 가져 오는 이유는 다음과 같습니다.

logger.Info("started async");
.

그리고 그 후에는 놀랍게도 :

logger.Info("started sync");
.

실제로 로그인하지 않기 때문에 두 번째 파일에 쓰는 것이 좋습니다.

및 콘솔에서 코드에서 얻을 수 있습니다 :

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

향후 정보는 추가 기능을 거짓으로 올려 놓으면 올바르게 수행되었으므로 로거가 루트 로거에서 상속되지 않음을 의미합니다. 진술에 관해서는 :

다른 파일 부록기가있는 2 개의 로거가 있고 각각을 루트 로거에 기록하려면 각각을 제한하고 싶습니다.

나는 그것을 이해하지 못한다. 예를 들어 콘솔 Appender를 사용하는 루트 로거가있는 동안 로거 가이 파일 에이 파일에 쓸 수있게하려면 추가 기능을 제거하고 콘솔 및 해당 파일에 쓸 수 있습니다. 또한 테스트하고 잘 작동합니다.

귀하의 코멘트를 읽었습니다. 이제는 사용하고있는 코드를 추가하고 필요한 것을 얻습니다.

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 :

<?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.NET 4.0이있는 1.2.13.0 당신이 원하는 것을 얻으면 제게 말해주십시오.

다른 팁

이 구성은 나를 위해 작동했습니다 :

<log4net>
<root name="EventLog">
<level value="ALL"/>
<appender-ref ref="EventLogAppender"/>
</root>

<logger name="FileLogger" additivity="false">
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />

...appenders
</logger>
.

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top