Log4net Rolling Daily nazwa pliku z datą w nazwie pliku

119

Chciałbym mieć pliki o nazwach na przykład:

dd.mm.yyyy.log

Jak to możliwe dzięki log4net?

J L.
źródło
Możliwy duplikat problemu
Narottam Goyal

Odpowiedzi:

103

W pliku konfiguracyjnym Log4net użyj następującego parametru z RollingFileAppender:

<param name="DatePattern" value="dd.MM.yyyy'.log'" />
Mun
źródło
28
Wygląda na to, że został on przeniesiony do elementu konfiguracyjnego: <datePattern value = "dd.MM.yyyy'.log '" /> Pozdrawiam!
longda
3
@mstaessen <preserveLogFileNameExtension value="true" />to poprawna składnia i to jest świetna odpowiedź. Jak doszło do straty, czy mogę zapytać?
Larry B,
1
Jeśli dobrze pamiętam, tak było. Podczas uruchamiania log4net wygenerowałby pierwszą nazwę pliku w kolejności kroczącej. Wykryłby, że ten plik już istnieje, a następnie zdecydowałby się przenieść do drugiego pliku, ale gdy ten również już istnieje, nie decyduje się na przewinięcie, ale zamiast tego czyści go i nadpisuje wszystko w tym drugim pliku dziennika. Przechodzi zupełnie niezauważalnie, dopóki nie potrzebujesz dzienników wyczyszczonych ram czasowych ...
mstaessen
207
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <file value="logs\" />
  <datePattern value="dd.MM.yyyy'.log'" />
  <staticLogFileName value="false" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>
Nonkichi
źródło
1
Myślę, że powinieneś podkreślić główny punkt dotyczący tego, jaki parametr rozwiązać problem, tak jak zrobił to @Mun. Jednak głosowałem również za twoją odpowiedzią.
RDeveloper,
1
To był element datePattern w połączeniu z elementem staticLogFileName (i zwróć uwagę na atrybut value dla elementu file), który działał dla mnie
Michhes
Pełna odpowiedź!
Nagesh
32

W przypadku RollingLogFileAppender potrzebujesz również tych elementów i wartości:

<rollingStyle value="Date" />
<staticLogFileName value="false" />
BobD
źródło
3
Działa, ale dodaje datę po rozszerzeniu pliku. Na przykład otrzymuję pliki dziennika, takie jak Error.log20111104 - Czy ktoś wie, jak sformatować nazwę pliku trochę lepiej?
LostNomad311
Oto jak lepiej sformatować nazwę pliku: stackoverflow.com/questions/615092/ ...
LostNomad311
do czego służy staticLogFileName? Chcę, aby plik dziennika został zmieniony pod nową nazwą dopiero po zakończeniu dnia. Chcę używać monitora dziennika, który za każdym razem sprawdza określony.
Niedziela,
22

Korzystając z Log4Net 1.2.13, używamy następujących ustawień konfiguracyjnych, aby zezwolić na datę i godzinę w nazwie pliku.

<file type="log4net.Util.PatternString" value="E:/logname-%utcdate{yyyy-MM-dd}.txt" />

Który dostarczy pliki w następującej konwencji: logname-2015-04-17.txt

Dzięki temu zwykle najlepiej jest mieć następujące elementy, aby upewnić się, że trzymasz 1 dziennik dziennie.

<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />

Jeśli rozmiar pliku jest problemem, poniższe zezwala na 500 plików o rozmiarze 5 MB do pojawienia się nowego dnia. CountDirection umożliwia rosnącą lub malejącą numerację plików, które nie są już aktualne.

 <maxSizeRollBackups value="500" />
 <maximumFileSize value="5MB" />
 <rollingStyle value="Composite" />
 <datePattern value="yyyyMMdd" />
 <CountDirection value="1"/>
 <staticLogFileName value="true" />
Jack Thorley
źródło
18

Skończyło się na użyciu (zwróć uwagę na nazwę pliku „.log” i pojedyncze cudzysłowy wokół „myfilename_”):

  <rollingStyle value="Date" />
  <datePattern value="'myfilename_'yyyy-MM-dd"/>
  <preserveLogFileNameExtension value="true" />
  <staticLogFileName value="false" />
  <file type="log4net.Util.PatternString" value="c:\\Logs\\.log" />

To daje mi:

myfilename_2015-09-22.log
myfilename_2015-09-23.log
.
.
Njal
źródło
preserveLogFileNameExtensionnie działa we wcześniejszych wersjach log4net (np. wersja 1.2.10), jak opisano tutaj
Dmitry Karpenko
13

Wypróbowałem wszystkie odpowiedzi, ale zawsze czegoś brakowało i nie działało zgodnie z oczekiwaniami.

Następnie trochę poeksperymentowałem ze wskazówkami podanymi w każdej odpowiedzi i udało mi się z następującym ustawieniem:

<appender name="RollingActivityLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="C:\temp\LOG4NET_Sample_Activity.log" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <staticLogFileName value="false" />
  <preserveLogFileNameExtension value="true" />
  <datePattern value="-yyyyMMdd" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level - %message%newline" />
  </layout>
</appender>

Problem z innymi kombinacjami parametrów polegał na tym, że najnowszy plik nie miał wzorca czasu lub że wzorzec czasu był dodawany jako, .log20171215który tworzył nowy czas pliku (i nowy typ pliku! ) Każdego dnia - lub pojawiały się oba problemy.

Teraz z tym ustawieniem otrzymujesz pliki takie jak ten:

LOG4NET_Sample_Activity-20171215.log

co chciałem.


Podsumowując:

  • Nie umieszczaj wzorca daty w <file value=...atrybucie, po prostu zdefiniuj go w datePattern.

  • Upewnij się, że masz ustawiony atrybut preserveLogFileNameExtension valuetrue .

  • Upewnij się, że masz ustawioną staticLogFileName wartośćfalse .

  • Ustaw wartośćrollingStyle atrybutu na .Date

Matt
źródło
Możesz również ustawić wartość rollingStyle na Composite, która będzie odtwarzana zarówno według daty, jak i rozmiaru.
Simon Tewsi
1
Działa świetnie. W podsumowaniu chciałbym również dodać: Upewnij się, że masz ustawioną wartość staticLogFileName na false
Randall Flagg
5

Aby zachować rozszerzenie pliku:

<log4net>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="D:\\LogFolder\\%date{yyyyMM}\\SchT.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <maximumFileSize value="30MB" />
      <staticLogFileName value="true" />
      <preserveLogFileNameExtension value="true"/>
      <datePattern value="ddMMyyyy" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
  </log4net>
Fourat
źródło
dlaczego są %date{yyyyMM}i value="ddMMyyyy" ? jaki jest wzór daty wejścia w życie?
Allan Ruin
Myślę, że datePattern jest dla nazwy pliku, ale% date {yyyyMM} dotyczy katalogu nadrzędnego (chciałem to w ten sposób)
Fourat
Atrybut datePattern ustawia okres kroczący dla Date rollingStyle. Zobacz logging.apache.org/log4net/release/config-examples.html w sekcji RollingFileAppender. „Na przykład wzorzec daty„ rrrrMMdd ”będzie przewijany każdego dnia. Listę dostępnych wzorców można znaleźć w sekcji System.Globalization.DateTimeFormatInfo.”
Ryan Buddicom
@rbuddicom tak, ale pytanie dotyczy tego, jak zachować rozszerzenie pliku.
Fourat
Wiem, Allan zakwestionował cel „value =" ddMMyyyy "”. Twój komentarz „Myślę, że datePattern dotyczy nazwy pliku” jest pod tym względem niepoprawny.
Ryan Buddicom,
0

Rozszerzona sekcja konfiguracji w poprzedniej odpowiedzi z

 ...
 ...
 <rollingStyle value="Composite" />
 ...
 ...

wymienione prace, ale nie musiałem używać

<staticLogFileName value="false" /> 

. Myślę, że RollingAppender musi (logicznie) zignorować to ustawienie, ponieważ z definicji plik jest odbudowywany każdego dnia, gdy aplikacja jest ponownie uruchamiana / ponownie używana. Być może ma to znaczenie dla natychmiastowego przeniesienia za każdym razem, gdy aplikacja zostanie uruchomiona.

AllenM
źródło
Dla mnie to nie zadziałałoby bez <staticLogFileName value = "false" />
nurettin
ja też, musiałem ustawić staticLogFileName na false, w przeciwnym razie nie zostanie zarejestrowane
oonyalo
0

Przeniosłem konfigurację do kodu, aby umożliwić łatwą modyfikację z CI przy użyciu zmiennej systemowej. Użyłem tego kodu dla nazwy pliku, a wynik to „Log_03-23-2020.log”

            log4net.Repository.ILoggerRepository repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            Hierarchy hierarchy = (Hierarchy)repository;
            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date %level - %message%newline%exception";
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = true;
            roller.File = "Log_";
            roller.DatePattern = "MM-dd-yyyy'.log'";
            roller.Layout = patternLayout;
            roller.MaxFileSize = 1024*1024*10;
            roller.MaxSizeRollBackups = 10;
            roller.StaticLogFileName = false;
            roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);
Parag Bangad
źródło