2010-06-08 6 views
15

어떻게 가능합니까? NLog를 롤오버 파일 로거로 사용할 수 있습니까? 예 :NLog를 롤오버 파일 로거로 사용

31 일 동안 31 개 파일을 저장하고 싶습니다. 이전 날짜가 시작되면 이전 로그 파일 ##. log가 있으면 삭제해야하지만 그날 모든 로그는 다음과 같습니다. 거기에 적어도 27 일 동안있을 것입니다.

답변

21

마지막으로 나는 size-based file archival으로 해결했습니다. 나는 그 날의 바로 다음 날에 파일의 이름을 정하기 위해 트릭을 사용하고, 크기 기반 파일 아카이브가 필요했는데 왜냐하면 로그가 수백 메가 바이트를 초과하여 커지기 시작하면 도움이되기 때문입니다. 예를 들어 20MB의 로그를 작성하는 데 도움이되므로 메모장 ++과 같은 경량 툴을 사용하면 쉽게 로그를 볼 수 있습니다.

거의 1 년 동안 작동합니다. 여기 내 NLog.config 파일의 단순화 된 버전입니다 :

<?xml version="1.0" encoding="utf-8" ?> 
<nlog autoReload="true" throwExceptions="true" 
     xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <variable name="LogDir" value="${specialfolder:folder=MyDocuments}/MyApp/Log"/> 
    <variable name="LogDay" value="${date:format=dd}"/> 
    <targets> 
    <target name="LogTarget1" xsi:type="File" fileName="${LogDir}/${LogDay}.log" encoding="utf-8" 
     maxArchiveFiles="10" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${LogDir}/{#######}.a" /> 
    </targets> 
    <rules> 
    <logger name="AppLog" writeTo="LogTarget1" /> 
    </rules> 
</nlog> 

이 설정이 달의 하루 1 메가 바이트 로그 파일을 만들고 10 대부분 My Documents\MyApp\Log 폴더에 1 메가 바이트 로그 덩어리를 보관하시오은; 29.log, 30.log31.log입니다.

편집 :NLog.config 파일을 사용하는 것은 당분간이며 필요한 모든 사례를 다루고 있습니다.나는 별도의 파일에 다른 클래스에서 다른 로깅 수준이 그들이 큰있어 때, 그들은이 시간당 방식으로, 크기에 따라 보관 얻을 것이다 :

<?xml version="1.0" encoding="utf-8" ?> 
<nlog autoReload="true" throwExceptions="true" internalLogFile="nlog-internals.log" 
     xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <variable name="LogHome" value="${basedir}/Log"/> 
    <variable name="DailyDir" value="${LogHome}/${date:format=yyyy}/${date:format=MM}/${date:format=dd}"/> 
    <variable name="HourlyArchive" value="${DailyDir}/${date:format=HH}-Archive/${level}-${logger}-{#######}-archived.a"/> 
    <variable name="AppLogPath" value="${DailyDir}/${level}-${logger}.log"/> 
    <variable name="DataLogPath" value="${DailyDir}/_data/inouts-${shortdate}.log"/> 
    <variable name="EventSource" value="Application" /> 
    <targets> 
    <target name="AppAsyncTarget" xsi:type="AsyncWrapper"> 
     <target xsi:type="RetryingWrapper" retryDelayMilliseconds="3000" retryCount="10"> 
     <target xsi:type="File" fileName="${AppLogPath}" encoding="utf-8" 
      maxArchiveFiles="50" archiveNumbering="Sequence" archiveAboveSize="1048576" archiveFileName="${HourlyArchive}" 
      layout="`${longdate}`${level}`${message}" /> 
     </target> 
    </target> 
    <target name="DataAsyncTarget" xsi:type="AsyncWrapper"> 
     <target xsi:type="RetryingWrapper" retryDelayMilliseconds="1500" retryCount="300"> 
     <target xsi:type="File" fileName="${DataLogPath}" encoding="utf-8" 
      layout="`${longdate}`${message}" /> 
     </target> 
    </target> 
    <target name="EventLogAsyncTarget" xsi:type="AsyncWrapper"> 
     <target xsi:type="RetryingWrapper"> 
     <target xsi:type="EventLog" source="${EventSource}" machineName="." /> 
     </target> 
    </target> 
    </targets> 
    <rules> 
    <logger name="Data" writeTo="DataAsyncTarget" final="true" /> 
    <logger name="Event" writeTo="EventLogAsyncTarget" final="true" /> 
    <logger name="*" writeTo="AppAsyncTarget" /> 
    </rules> 
</nlog> 

내가 로깅 기능을 원하는 각 클래스에 ,이 넣어 :

static readonly Logger SlotClassLogger = LogManager.GetCurrentClassLogger(); 
static Logger ClassLogger { get { return SlotClassLogger; } } 

두 개의 추가 로거가 매일 일부 데이터를 말뚝 박기 및 Windows 이벤트 로그에 기록됩니다; 응용 프로그램 전체 로거있는 :

public static Logger DataLog { get; private set; } 
public static Logger AppEventLog { get; private set; } 

그리고 앱 시작시 초기화해야한다 :

DataLog = LogManager.GetLogger("Data"); 
AppEventLog = LogManager.GetLogger("Event"); 

참고 : 때로는 응용 프로그램의 종료에 당신이 NLog에 의해 생성 된 예외를 얻을. 초기화되지 않은 것이 폐기 될 수 없기 때문입니다! 당신은 그냥 응용 프로그램 시작시 로거에 빈 항목을 기록했다고 밝혔습니다 :

DataLog.Info(string.Empty); 

내가 빨리 리뷰를 위해,이 크기 제한 때문에 파일이 로우 엔드 서버 (예를 들어) 메모장에서 볼 수있는 로그 추가 . 필요에 따라 수정해야합니다.

9

난 당신이 두 개의 서로 다른 관점으로 문제를 분리 할 것을 제안 :

  • 롤링 새 파일 이름 (명심 시간대, 아마도 UTC 일?) 매일 이전 로그를 삭제
  • 파일

제 경험상 로그 파일 이름에 날짜를 기록해 두는 것이 좋습니다.

debug-2010-06-08.log 

NLog에서는 그 부분이 examples in the docs 인 경우 쉽게 처리해야합니다.

이제 두 번째 부분은 두 번째 스레드 또는 완전히 다른 프로세스에서 쉽게 수행 할 수 있습니다. 단지 몇 개의 파일이 있는지보고 필요하면 가장 오래된 파일을 삭제하면됩니다. 파일 시스템 정보를 신뢰하지 않으려는 경우에도 날짜가 파일 이름에 있으면 "가장 오래된"찾기가 쉽습니다.

실제로 NLog 문서를 보면 "time-based file archival" 대상이 원하는 작업을 정확히 수행 할 수있는 것처럼 보입니다. 그러나 그렇지 않은 경우에도 정상적인 "하루에 하나의 로그 파일"접근 방식으로 자신의 청소가 쉬워야합니다.