2010-02-14 19 views
30

Jestem obecnie budowanie aplikacji ASP.Net-MVC przy użyciu log4net do logowania, ale rejestrator wydaje się po prostu zatrzymać się w sposób losowy. Z radością zaloguje się na chwilę, a następnie zatrzyma się, a następnie zacznie ponownie po pewnym czasie. Nie jestem nawet pewien, co sprawia, że ​​wznawia logowanie. Nie mówię o zgubieniu tylko kilku wiadomości - czasami znikają one przez długi czas, na przykład godzinę.Log4net losowo zatrzymuje rejestrowanie.

Dlaczego byłoby zatrzymać i rozpocząć w ten sposób? Jak powinienem poprawnie skonfigurować to tak, aby nie zatrzymywało się przypadkowo?

Oto moja konfiguracja:

<log4net debug="true"> 
<appender name="RollingLogFileAppender" 
     type="log4net.Appender.RollingFileAppender"> 

    <file value="..\Logs\\CurrentLog.txt" /> 
    <appendToFile value="true" /> 
    <datePattern value="yyyyMMdd" /> 

    <rollingStyle value="Date" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <acceptOnMatch value="true" /> 

    <levelMin value="INFO" /> 
    <levelMax value="FATAL" /> 
    </filter> 

    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern 
    value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
    </layout> 

</appender> 

<root> 
    <level value="INFO" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 

+1

W moim przypadku było resetowania rejestrowanie (ponownego konfigurowania go, nie z projektem ..), który spowodował te rodzaju problemy - patrz http://neilkilbride.blogspot.com.au /2008/04/configure-log4net-only-once.html – Jonno

+0

mogłabyś dodać odpowiedź lub komentarz wyjaśniający, co spowodowało problem, jeśli znalazłeś jakiś powód? –

+0

Tak, dobrze byłoby wiedzieć, co spowodowało twój problem, jak powiedział Mark. Nawiasem mówiąc, miałem ten sam problem i ustawienie dla mnie parametru ReconnectOnError na true pod konfiguracją ADONetAppender. – Jportelas

Odpowiedz

56

log4net będzie fail silently jeśli coś pójdzie nie tak i nie jest w stanie napisać do swoich appenders. Jest to naprawdę dobra rzecz, ponieważ oznacza to, że nieudane logowanie nie spowoduje utraty zdrowego systemu, ale może być denerwujące, gdy coś nie jest rejestrowane zgodnie z oczekiwaniami.

Najlepszym wyjściem jest włączenie własnego log23neta internal logging, aby przeprowadzić diagnostykę i (miejmy nadzieję) sprawdzić, dlaczego się nie udało.

Więc w Twojej aplikacji pliku config dodają:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
     <add key="log4net.Internal.Debug" value="true"/> 
    </appSettings> 
</configuration> 

który będzie włączyć rejestrowanie wewnętrznego, który zostanie wysłany do System.Diagnostics.Trace, więc można dodać:

<configuration> 
    ... 
    <system.diagnostics> 
     <trace autoflush="true"> 
      <listeners> 
       <add 
        name="textWriterTraceListener" 
        type="System.Diagnostics.TextWriterTraceListener" 
        initializeData="C:\tmp\log4net.txt" /> 
      </listeners> 
     </trace> 
    </system.diagnostics> 
    ... 
</configuration> 

uchwycić to do plik.

+1

Czy masz pełniejszy przykład takiego pliku konfiguracyjnego? Próbowałem już wielu odmian i nadal otrzymuję błędy XML z XmlSerializationReader. Nawet pusty znacznik '' jest różnicą między wyjątkiem a nie. –

+0

Mam ten sam problem, w moim przypadku wygląda to będzie że w każdej chwili mogę otworzyć okno dialogowe pliku Standardowo [Box] (https://box.com) ikona nakładka DLL nadpisuje log4net.config w procesie z własnym. –

+0

To właściwie NIE jest dobre, ponieważ w zależności od tego może istnieć system monitorowania i narzędzia powiadamiania o błędach, a jeśli przestanie się rejestrować, nie ma możliwości, abyśmy wiedzieli, że wystąpił wyjątek.Nienawidź tego brednie narzędzie do logowania, zawsze jest ból głowy, niezależnie od firmy, którą idę, niezależnie od wersji, zawsze jest ból głowy. Gówniany produkt Crappy developerów ... – sotn

0

wysłać wiadomość dziennika testu jak wcześnie jak to tylko możliwe w cyklu życia aplikacji, tylko prosty LogManager.GetLogger("Init").Info("Starting logging") zrobi. Jeśli jakiś inny przywoływany kod dostaje pierwszeństwo w rozpoczęciu rejestrowania, część procesu inicjowania może się nie powieść (ponieważ ładuje ustawienia z innego zespołu, który wykonuje tylko raz).

przeczytać tutaj: https://logging.apache.org/log4net/release/faq.html#first-log