log4net 다중 로거
-
21-12-2019 - |
문제
우선, 나는 다른 사람들에게 많은 답변과 팁을 보았습니다 (가장 비슷한 : 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>
.
행운을 빕니다!