2009-10-23 5 views
5

Moja aplikacja używa kilku wątków o dobrze zdefiniowanych nazwach (tj. Nie jest pulą wątków z wątkami "anonimowymi"). W tej chwili wszystkie te wątki wysyłają komunikaty dziennika do jednego pliku - i chociaż identyfikator wątku jest częścią linii dziennika, bardzo utrudnia to analizę zachowania aplikacji. Dlatego chcę, aby każdy wątek logował się do własnego pliku dziennika.Jak zalogować się w oddzielnych plikach na wątek za pomocą Log4Net?

Wygląda na to, że Log4Net nie oferuje wbudowanej opcji wyboru aplikatora na podstawie wątku. Czy ktoś wie o takim rozwiązaniu? Zauważ, że oczywiście wolałbym nie przełączać się do innej biblioteki rejestrowania.

+0

Co w takim razie robiłeś? Mam dokładnie to samo wymaganie, z tą różnicą, że liczba wątków i nazwy wątków nie są znane lub ustawione przed uruchomieniem. –

+0

Nie rozwiązałem problemu, ponieważ dostałem nową pracę. W każdym razie, rozwiązanie Petera mogłoby zadziałać dla mnie i wyobrażam sobie, że tworzenie konfiguracji aplikacji przez API działa dla ciebie. –

+0

Jeśli ktoś potrzebuje prostego rozwiązania, zobacz odpowiedź tutaj http://stackoverflow.com/questions/6956064/logging-to-an-individual-log-file-for-each-individual-thread –

Odpowiedz

3

Sposób logowania "wybierania" przez log4net polega na filtrowaniu. W swoim scenariuszu potrzebny jest sposób skonfigurowania wielu aplikacji, z których każdy reprezentuje dobrze zdefiniowany wątek, oraz filtrów w każdym dodatku dostarczającym wiadomości tylko z ich wątków.

Ponieważ identyfikator wątku nie jest deterministyczny, potrzebne będzie coś innego do przeprowadzenia filtrowania. Zakładam, że sam kontrolujesz tworzenie tych wątków i sugeruje, że każdy wątek rejestruje identyfikator w usłudze w the ThreadContext. Następnie możesz użyć the PropertyFilter do filtrowania wiadomości na podstawie identyfikatorów.

Oto przykładowa konfiguracja konfiguracji, która ma dwóch dodających, z których każdy dołącza komunikaty, w których bieżąca wartość właściwości threadId pasuje do podanego identyfikatora.

<appender name="x"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadX" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<appender name="y"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadY" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<root> 
    <appender-ref name="x" /> 
    <appender-ref name="y" /> 
</root> 
+0

Jak zrobiłbyś to, jeśli liczba wątków i ich nazwy były znane dopiero po uruchomieniu? –

+2

@goku_da_master możesz zbudować konfigurację aplikacji dostarczającej w kodzie, co może być jednym z podejść, przynajmniej jeśli masz kontrolę nad tworzeniem wątków. Jeśli nie, powiedziałbym, że najlepszą opcją jest zalogowanie się do wspólnego źródła (np. Bazy danych), które można łatwiej sprawdzić na podstawie identyfikatora wątku. –