Jak wyśledzić problemy z log4net

191

Cały czas używam log4net, ale nigdy nie wymyśliłem, jak powiedzieć, co się dzieje w środku. Na przykład w moim projekcie mam program dołączający do konsoli i program dołączający do bazy danych. Wprowadziłem kilka zmian w bazie danych i kodzie, a teraz program dołączający do bazy danych już nie działa. Zastanowię się, dlaczego w końcu, ale bardzo by mi pomógł, gdybym mógł zobaczyć, co się dzieje w log4net.

Czy log4net generuje jakieś dane wyjściowe, które mogę wyświetlić, aby spróbować ustalić źródło mojego problemu?

John M. Gant
źródło

Odpowiedzi:

294

Najpierw musisz ustawić tę wartość w pliku konfiguracyjnym aplikacji:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

Następnie, aby określić plik, w którym chcesz zapisać dane wyjściowe, możesz dodać następujący kod w tym samym pliku .config:

<configuration>
...

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

...
</configuration>

Bardziej szczegółowe objaśnienie znajduje się w części „Jak włączyć wewnętrzne debugowanie log4net?” na stronie FAQ log4net .

David Espart
źródło
10
Upewnij się tylko, że proces, na którym działa twoja aplikacja, ma prawa do ścieżki, w której chcesz utworzyć plik tekstowy logowania („C: \ tmp \ log4net.txt” w powyższym przykładzie)
NMrt
3
Wygląda na to, że wewnętrzne debugowanie nie ma znaczników czasu
snit80
4
Zmieniłem z C:\tmp\log4net.txtna C:\log4net.txt, wtedy może wygenerować plik tekstowy.
Frank Myat Czw
6
Tylko notatkę znalazłem fajny sposób. Upewnij się, że <configSections></configSections>jest to pierwszy wpis w sekcji <configuration>. W przeciwnym razie pojawi się błąd.
Nick
2
To nie pokazuje czasu na wpisy w pliku dziennika. Próbowałem atrybuty ustawień traceOutputOptions="TimeStamp"oraz traceOutputOptions="DateTime"w addtagu, ale to nic nie zmienia w zawartości pliku dziennika. Czy ktoś wie, jak skonfigurować log4net, aby wyświetlał czas dla każdej linii / wpisu w pliku dziennika śledzenia?
Ulysses Alves
43

Jeśli używasz pliku konfiguracyjnego log4net, możesz również włączyć tam debugowanie, zmieniając górny węzeł na:

<log4net debug="true">

Działa to po ponownym załadowaniu konfiguracji i przy założeniu, że Twój detektor śledzenia jest poprawnie skonfigurowany.

Bolo
źródło
6
Po włączeniu tej flagi dzienniki diagnostyczne z log4net będą widoczne w oknie Wyjście programu Visual Studio
Naren
24

Oprócz powyższej odpowiedzi można użyć tego wiersza, aby wyświetlić dziennik w czasie rzeczywistym zamiast wyniku c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Na przykład w aplikacji konsoli możesz to dodać, a następnie oglądać dane wyjściowe w czasie rzeczywistym. Dobrze jest debugować log4net w małej uprzęży testowej, aby zobaczyć, co się dzieje z testowanym aplikatorem.

JP Toto
źródło
8

Upewnij się, że aplikacja root, w której znajduje się punkt wejścia, loguje coś do log4net. Podaj jedną z nich:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

Z wersją 2.0.8 miałem ciekawą sytuację. Stworzyłem projekt biblioteki i testowy projekt exe, który demonstrowałby jego możliwości. Projekt biblioteki został skonfigurowany do używania Log4net, podobnie jak projekt exe. Projekt exe wykorzystał atrybut assemblyinfo do zarejestrowania konfiguracji, ale nie otrzymywałem danych wyjściowych rejestrowania ani w konsoli, ani w pliku dziennika. Kiedy włączyłem wewnętrzne rejestrowanie debugowania log4net, dostałem kilka wewnętrznych komunikatów zapisanych w konsoli, ale nadal nie ma moich normalnych dzienników. Nie zgłoszono żadnych błędów. Wszystko zaczęło działać, gdy dodałem powyższy kod do mojego programu. Log4net został inaczej skonfigurowany poprawnie.

K0D4
źródło
1
uratowałem również moją :-)
costa
2

Jeśli wewnętrzny dziennik nie zawiera wystarczających informacji, bardzo łatwo jest zbudować i debugować kod źródłowy . Jeśli nie chcesz mieszać tego z projektem programistycznym, dodaj prostą aplikację konsoli, która po prostu rejestruje komunikat, skopiuj projekt log4net.configdo tej aplikacji i debuguj klasę.

StuartN
źródło
2

W log4net 2.0.8 rejestrowanie za pomocą log4net w oddzielnej bibliotece DLL nie jest możliwe. Gdybym tego spróbował, wyniki są bardzo dziwne: rejestrowanie nie jest już wykonywane. Inicjalizacja log4net z opcją debugowania nie pokazuje błędów.

Jak powiedział K0D4, powinieneś mieć odniesienie do log4net w głównym module i powinien on wywoływać raz na początku programu i wszystko jest w porządku.

W następnej wersji log4net ten błąd prawdopodobnie zostanie naprawiony.

olaf870
źródło