2017-02-27 3 views
0

동일한 예약 된 프로세스의 여러 인스턴스가있는 여러 파일에 로깅을 시도하고 대상 매개 변수가 런타임 매개 변수를 기반으로 선택됩니다.동일한 프로세스가 여러 파일에 서로 다른 로깅

하나의 인스턴스가 실행 중일 때 다른 하나는 로그 할 수 없으므로 빈 파일 만 생성됩니다. 여기

은 샘플 시나리오입니다 :

  • schedlued 작업 program.exe A 시작하고 여전히B_{currentDate}.log
  • 에 로깅을 시작한다 및 를 실행 program.exe A 동안 A_{currentDate}.log
  • schedlued 작업에 로그인 program.exe B 시작하기 시작

둘 다 끝나면, 첫 번째 파일이 비어있는 동안 두 번째 파일은 비어 있습니다. 두 번째 파일에 로그 할 항목이 100 % 확실하므로 예상 결과가 아닙니다. 기본적으로 실행되는 첫 번째 인스턴스가 다른 모든 인스턴스를 로깅하지 못하게하는 것처럼 보입니다.

동일한 프로그램에 대해 약 20 개의 예약 된 작업이 있다고 가정하면 몇 가지 중요한 로그가 누락되어 많은 문제가 발생합니다. 초기화 각 인스턴스에 대한 코드 여기

<appender name="A_appender" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="A_%property{Date}.log" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

<appender name="B_appender" type="log4net.Appender.FileAppender"> 
    <file type="log4net.Util.PatternString" value="B_%property{Date}.log" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
    <layout type="log4net.Layout.PatternLayout">   
     <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

... 

<logger name="A.Logger"> 
    <appender-ref ref="A_appender" /> 
    <level value="DEBUG" /> 
</logger> 

<logger name="B.Logger"> 
    <appender-ref ref="B_appender" /> 
    <level value="DEBUG" /> 
</logger> 

... 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="ConsoleAppender" /> 
</root> 

과 :

protected Module(string logName) 
{ 
    ThreadContext.Properties["Date"] = GlobalContext.Properties["Date"] = DateTime.Now.ToString("yyyyMMdd");    
    XmlConfigurator.Configure(new System.IO.FileInfo(properties.get("log4net.config.file"))); 
    log = LogManager.GetLogger(logName); 
    ... 
} 

누군가가 나를 도울 수는

여기 log4net.config 파일의 단편입니까?

답변

0

내게는 두 프로세스가 모두 파일 열기 (appender A와 appender B 모두)를 유지하려고 시도하는 것이므로 두 프로세스가 실행되지 않도록 먼저 시작합니다. 하나 또는 다른 appender에 대한 참조를 잡을 수는 있지만, 어느 appender에게만 로깅하는 경우에도 두 appender 모두를 생성합니다.

두 프로세스가 같은 날짜에 실행되는 것처럼 들리므로 고유하고 파일 이름에 고유 한 각 프로세스에 대해 두 번째 GlobalContext 속성을 설정해야 할 수 있습니다.

+0

귀하의 제안에 따라, 제 구성에서 하나의 appender를 제외하고 모든 것을 제거했습니다. 이 appender는 이제'% property {FileName} _ % property {Date} .log'와 같이 씁니다. 그러면 모든 파일이 단일 인스턴스에 의해 잠겨지지 않습니다. – STT

관련 문제