2013-04-30 5 views
6

UWAGA: czytam to pytanie i odpowiedź, i to nie działa, co chcę: Log4Net: Programmatically specify multiple loggers (with multiple file appenders)Programowo wymusić nowy plik dziennika z log4net

Mam usług WCF, który jest „Pytania i odpowiedzi” styl usługi. Otrzymuje dane wejściowe i wysyła dane wyjściowe. Nie utrzymuje się w ogóle wiele.

Muszę rejestrować każdą sesję pytań i odpowiedzi w oddzielnym pliku.

Mam jednego Appendera (obecnie RollingAppender).

Czy istnieje sposób na rozpoczęcie nowego pliku dziennika dla każdego połączenia z moją usługą WCF?

UWAGA: Używam układu XML, chodzi o to, że dane wyjściowe dziennika można analizować i wyświetlać graficznie (funkcja późniejsza). Trochę jak "Plan zapytania". Jest to kolejny powód, że potrzebuję ich w osobnym pliku.

UWAGA: Jeśli potrzebny jest inny powód, Log4Net XmlLayoutBase nie zrzuci stopek XML, dopóki aplikacja się nie zamknie. To naprawdę nie jest zaplanowane zdarzenie dla usługi WCF hostowanej w usługach IIS.

Odpowiedz

2

Zamiast logować się do pliku, możesz spróbować zalogować się do tabeli bazy danych i zalogować identyfikator sesji z zalogowanymi danymi. W ten sposób możesz dokonywać wyborów względem tabeli na podstawie identyfikatora sesji i wyświetlać tylko ich dane.

+0

Problem polega na tym, że w moim systemie rejestrowania xml mam poziomy wielu węzłów. Nie mapuje dobrze do statycznej tabeli bazy danych. Mogę "umieścić" XML w tabeli danych, ale zwykle staram się nie mieszać XML i SQL. Uważam, że powoduje to złożone zapytania i trudnych do utrzymania klientów. – Vaccano

+0

Podczas gdy mój kod działa, zamierzam przejść do bazy danych. Tak więc podaję twoje pytanie "odpowiedź". – Vaccano

4

To wydaje się działać dla mnie:

public static void StartNewFile(this ILog log, string newFileName) 
{ 
    Logger logger = (Logger) log.Logger; 

    while (logger != null) 
    { 
     foreach (IAppender appender in logger.Appenders) 
     { 
      FileAppender fileAppender = appender as FileAppender; 
      if (fileAppender != null) 
      { 
       fileAppender.File = newFileName; 
       fileAppender.ActivateOptions(); 
      } 
     } 
     logger = logger.Parent; 
    } 
} 

To wymaga następujących dokumentów:

using log4net; 
using log4net.Appender; 
using log4net.Repository.Hierarchy; 
+0

gdzie w kodzie będę nazwać tę metodę "StartNewFile" – Satchi

0
nie

Być dokładne rozwiązanie, którego szukasz, ale można utworzyć inny rejestrator dla każdej sesji przez wywołanie tego na początku każdego połączenia interfejsu:

ILog logger = LogManager.GetLogger(<SessionID>);

Otrzymasz wszystkie wpisy w tym samym pliku dziennika, ale wtedy naprawdę łatwo jest wyświetlić każdą sesję osobno z przeglądarką, taką jak log4view.

Mam nadzieję, że pomaga