2013-06-24 14 views
10

Jak wskazuje tytuł, w jaki sposób mogę utworzyć nowy plik dziennika dla każdej uruchomionej aplikacji? Wiem, jak to zrobić za minutę/godzinę/itp. ale nie dla aplikacji. uruchomićTworzenie nowego pliku dziennika dla każdej uruchomionej aplikacji

Jest to, co mam teraz:

target name="Debug" archiveEvery="Hour" 
archiveFileName="${basedir}/logs/Debug.{#####}.txt" maxArchiveFiles="4" 
archiveNumbering="Sequence" xsi:type="File" fileName="${basedir}/logs/Debug.txt" 
layout="${date:format=HH\:mm\:ss} | ${level} | ${message} ${exception} 
${exception:format=stacktrace}" 

Ale właściwie, nie trzeba archiwizować co godzinę, co chcę zarchiwizować jest za każdym razem, gdy uruchamiam moją aplikację. Jest co znalazłem w old forum, ale nie wiem, jak korzystać Cached_layout_renderer

Odpowiedz

22

natknąłem się tego problemu, i zajęło mi dużo czasu, aby zrozumieć. Większość odpowiedzi, które znalazłem, ma tylko część rozwiązania i nie wyjaśnia, jak/dlaczego to działa ... co sprawia, że ​​trudno jest się dostosować, jeśli masz nieco inny przypadek użycia.

Przykład:

<target name="log" 
    xsi:type="File" 
    fileName="${basedir}/logs/log.${longdate:cached=true}.log" 
    layout="${message}" 
    archiveFileName="${basedir}/logs/archives/log.${shortdate}.{#}.log" 
    archiveAboveSize="5242880" 
    archiveEvery="Day" 
    archiveNumbering = "Rolling" 
    maxArchiveFiles="20" 
    /> 

Wyjaśnienie

Trzeba korzystać zarówno z pamięci podręcznej Układ Renderer i zmienną longDate. Aby zrozumieć, dlaczego to działa, musisz zrozumieć, jak one działają i jak wchodzą w interakcje.

longDate:

fileName="${basedir}/logs/log.${longdate}.log" 

Korzystanie zmienną longDate w nazwie dziennika będzie dość dużo zagwarantować nowy plik dziennika na każdym wykonaniu ... oprócz tego, że tworzy nowy plik dziennika, co milisekundę nawet podczas pojedyncze wykonanie, które prawdopodobnie nie jest pożądane, z wyjątkiem najrzadziej występujących okoliczności.

Cached Układ Renderer:

fileName="${basedir}/logs/log.${shortdate:cached=true}.log" 

Cached renderujący układ będzie buforować zmienną na pierwsze wezwanie dziennika, a następnie zawsze używaj tej wartości dla kolejnych wpisów ... ale tylko dopóki nie ustąpi cache wykonanie zostanie zakończone. Używanie shortdate lub jakiejkolwiek innej zmiennej, która nie jest gwarantowana przy zmianie każdego wykonania, nie będzie działać. Znajdzie plik dziennika z tą samą nazwą pliku, z której chce korzystać, i po prostu dołączy (lub usunie, jeśli masz ten zestaw). Nie tego chcemy.

połączeniu:

fileName="${basedir}/logs/log.${longdate:cached=true}.log" 

To działa, ponieważ trwa znacznik czasu milisekundy pierwszego dziennika za wykonanie, a następnie buforuje go i zawsze używa tego logfile aż przerywa wykonywanie (wyczyszczenie pamięci podręcznej). Przy następnym uruchomieniu (chyba że jest to ta sama milisekunda ... mało prawdopodobna!) Otrzymasz nową wartość buforowaną i nowy plik dziennika (ale tylko jeden!).

+0

To jest pomocna odpowiedź! Dzięki. – Mikey

+1

Znalazłem inny sposób - '$ {guid: cached = true} .log' – Kai

+0

@Mir: To jest bardzo dobra odpowiedź. Ale znalazłem przypadek, kiedy to nie działa. Jeśli autoReload (https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration) jest ustawione na true i zmieniasz konfigurację bez zamykania aplikacji, to zamknie bieżący dziennik i uruchomi nowy. Czy istnieje sposób na pokonanie tego? – IgorStack

5

Zobacz https://github.com/NLog/NLog/blob/master/tests/NLog.UnitTests/LayoutRenderers/Wrappers/CachedTests.cs na przykład, jak korzystać z pamięci podręcznej renderujący układu.

Zasadniczo można stosować tak:

${cached:${variable}:cached=true} 
+0

pierwsze miejsce, w którym ktoś faktycznie pokazał przykład, a nie tylko mówienie "oh tak, użyłem renderowania układu zapisanego w pamięci podręcznej" – drzaus

+0

Cached wydaje się pomagać w zapobieganiu tworzenia nowego pliku dziennika, jeśli data/data/zmienna ulegnie zmianie podczas rejestrowania ... ale Wierzę w to, że pytający szuka nowego pliku za każdym razem, gdy uruchamiany jest plik wykonywalny. Na przykład app.1.log, a następnie app.2.log, ..., app.n.log. – Mir

7

Obsługa FileTarget przez NLog jest teraz archiwum właściwościOldFileOnStartup (NLog-3-2-0 Release).

archiveOldFileOnStartup="true" 

Nie mogą być pewne problemy z tym, ale jeśli tylko jedna instancja aplikacji jest uruchomiony w tym samym czasie, powinien on mieć odpowiednie zachowanie.

Powiązane problemy