2008-10-28 17 views
20

Jestem skonfigurować log4net do używania kompozytowego RollingFileAppender tak, że obecny plik jest zawsze nazwany Plikdziennika.log i wszystkie kolejne pliki są nazywane logfile-YYYY.MM.dd.seq.log gdzie nast jest sekwencją liczba, jeśli dziennik przekracza pewien rozmiar w ciągu jednego dnia. Niestety, miałem niewielki sukces w konfiguracji takiej konfiguracji.Jak skonfigurować RollingFileAppender do rzucania według daty i rozmiaru za pomocą log4net?

Edit:

Moja obecna konfiguracja zostanie wklejony poniżej. Został zaktualizowany w oparciu o kilka odpowiedzi, które przybliżają mnie do moich potrzeb. To generuje pliki w formacie: logfile_YYYY.MM.dd.log.seq

<log4net> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="logs\\logfile"/> 
     <staticLogFileName value="false"/> 
     <appendToFile value="true"/> 
     <rollingStyle value="Composite"/> 
     <datePattern value="_yyyy.MM.dd&quot;.log&quot;"/> 
     <maxSizeRollBackups value="10"/> 
     <maximumFileSize value="75KB"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> 
     </layout> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
      <param name="LevelMin" value="DEBUG" /> 
      <param name="LevelMax" value="FATAL" /> 
     </filter> 
    </appender> 

</log4net> 

Interesującą uwaga, ustawienie

<staticLogFileName value="false"/> 

true powoduje, że rejestrator nie pisać żadnych plików.

Odpowiedz

13

Używamy następujące (w log4j):

<appender name="roller" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="Applog.log"/> 
    <param name="DatePattern" value="'.'yyyy-MM-dd"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n"/> 
    </layout> 
</appender> 

To daje nam Applog.log.yyyy-MM-DD plików

+1

Według dokumentacji log4j: DailyRollingFileAppender zaobserwowano problemy synchronizacji i utraty danych. Kompilator dodatków log4j zawiera alternatywy, które powinny być brane pod uwagę przy nowych wdrożeniach i które są omówione w dokumentacji dla org.apache.log4j.rolling.RollingFileAppender. –

4

Według log4net RollingFileAppender kodu źródłowego:

protected string GetNextOutputFileName(string fileName) 
{ 
    if (!m_staticLogFileName) 
    { 
     fileName = fileName.Trim(); 

     if (m_rollDate) 
     { 
      fileName = fileName + m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo); 
     } 

     if (m_countDirection >= 0) 
     { 
      fileName = fileName + '.' + m_curSizeRollBackups; 
     } 
    } 

    return fileName; 
} 

Więc zgaduję, że nie jest możliwe, aby wygenerować plik dziennika o nazwie trzeba. Myślę, że jest to coś w rodzaju logfileYYYY-MM-dd.n.log lub podobnego.

+0

@Ryan, Leandro: Wygląda na to, że nie ma prostego sposobu na obejście tego zachowania. 'GetNextOutputFileName' nie jest wirtualny i inne metody, które nazywają to odniesienie do zmiennych prywatnych, więc nie można po prostu skopiować ich kodu i zastąpić połączenie. Myślę, że najlepsze, co możesz zrobić, to mieć niepowtarzalną nazwę pliku za każdym razem, używając czegoś w rodzaju opcji wzoru daty, której używałeś. –

0

pamiętać, że jest to przypadku

  <maxSizeRollBackups value="10"/> 

zostanie zignorowany.

Zobacz ten answer do podobnego pytania log4net

1

Spróbuj ustawić tę właściwość na wartość true:

wartość preserveLogFileNameExtension = "true"

Wierzę, że ta sztuczka pomoże! Jednak właściwość preserveLogFileNameExtension wymaga najnowszej wersji log4net, można ją znaleźć tutaj: logging.apache.org/log4net/download.html