2016-08-12 3 views
1

장기간 비동기 작업을 트리거하는 웹 요청을 받아들이는 Windows 서비스가 있습니다. 나는 각 작업이 다른 디렉토리 (요청 ID와 작업을 트리거 한 사용자에 의해 결정되는 이름)로 로그를 출력하기를 원합니다. 각 디렉토리 안에는 여러 개의 로그 파일이 있습니다.여러 폴더에 로깅

Common.Logging 및 log4net을 사용하고 있습니다. 그러나 log4net 구성을 (아래 주어진대로) 디렉토리를 변경하기 위해 재설정해야하고, 다른 작업이 아직 실행중인 동안 작업이 트리거되는 경우이 작업은 제대로 작동하지 않습니다. 두 작업의 로그가 생성 된 최신 디렉토리로 변경됩니다.

protected ILog CreateLoggerInstance(string loggerName, string logFolder) 
    { 
     logFolder += "/"; 
     // This is a hack to avoid creation of a folder called (null), because of limitation in log4net. 
     // More details: https://github.com/net-commons/common-logging/issues/81 
     log4net.GlobalContext.Properties["LogsDirectory"] = logFolder; 

     this.LogInstance = LogManager.GetLogger(loggerName); 
     this.LogInstance.GlobalVariablesContext.Set("LogsDirectory", logFolder); 
     LogManager.Reset(); 
     this.LogInstance = LogManager.GetLogger(loggerName); 

     this.LogFolder = logFolder; 
     return this.LogInstance; 
    } 

특정 로거에 대해서만 로그를 설정하는 방법이 있습니까? 또는 Reset()을 피할 수 있습니까? 또한이 특정 코드는 log4net을 언급하는 유일한 곳입니다. 따라서 각 로그 세트에 대해 여러 폴더를 만들 수 있다면 NLog로 이동할 수 있습니다.

편집 : - https://github.com/NLog/NLog/wiki/Configure-component-logging

을하지만 Common.Logging가 지원하는 것처럼은 보이지 않는 내가 NLog에서이 기능을 발견했습니다.

+0

를 참조하십시오 동시에 위치별로 파일 첨부기를 하나씩 필요로합니다. 또 다른 대안은 로거 생성을 중심으로 잠금을 사용하는 것인데, 이는 성능에 해로울 수 있습니다. – stuartd

답변

1

이 솔루션은

는 그냥 fileName 속성에 requestIduser를 사용 NLog 꽤 간단하다.

<targets> 
    <target name="file" xsi:type="File" 
     layout="${longdate} ${logger} ${message}" 
     fileName="${basedir}/${var:requestid}_${var:user}.log" /> 
</targets> 

<rules> 
    <logger name="*" minlevel="Debug" writeTo="file" /> 
</rules> 

당신은 다양한 상황에서 RequestID가 & 이름을 설정할 수 있습니다 : 글로벌 변수를 여러 위치에 기록 할 경우 GDC는/MDC 등 https://github.com/NLog/NLog/wiki/Gdc-layout-renderer

+0

똑똑한이 작품. MDC로 로거를 만든 다음 어디에서나 Common.Logging을 사용할 수있었습니다. 단 하나의 파일에서 NLog.MappedDiagnosticsContext를 사용해야했습니다. 빠른 질문, MDC는 TPL 작업에 올바르게 작동해야합니까? 지금까지 테스트 한 결과, ThreadPool에 문제가 있습니까? TPL (작업) 용 – Narayana

+1

을 사용하려면 MDLC가 필요합니다. https://github.com/NLog/NLog/wiki/MDLC-Layout-Renderer – Julian