2013-04-30 18 views
6

NOTA: ho letto questa domanda e risposta, e non funziona per quello che voglio: Log4Net: Programmatically specify multiple loggers (with multiple file appenders)Programatically forzare un nuovo file di log con Log4Net

Ho un servizio WCF che è una "domanda e risposta" servizio di stile. Ottiene input e invia output. Non persiste molto.

Devo registrare ogni sessione di domande e risposte in un file separato.

Ho un singolo Appender (attualmente il RollingAppender).

C'è un modo per avviare un nuovo file di registro per ogni chiamata al mio servizio WCF?

NOTA: sto utilizzando un layout XML, l'idea è che l'output del log possa essere analizzato e visualizzato graficamente (una funzionalità successiva). Un po 'come un "piano di ricerca". Questo è un altro motivo per cui ho bisogno di loro in un file separato.

NOTA: nel caso sia necessario un altro motivo, Log4Net XmlLayoutBase non eliminerà i piè di pagina xml fino alla chiusura dell'app. Quale non è realmente un evento pianificato per un servizio WCF ospitato in IIS.

risposta

2

Anziché accedere a un file, è possibile provare ad accedere a una tabella di database e registrare l'ID di sessione con i dati registrati. In questo modo puoi effettuare selezioni sulla tabella in base all'ID di sessione e visualizzare solo i loro dati.

+0

Problema: ho un livello di nodi multipli nel mio sistema di registrazione xml. Non si adatta bene a una tabella di database statica. Io "potevo" inserire l'XML in una tabella dati, ma di solito cerco di non mescolare XML e SQL. Trovo che questo faccia per query complesse e client difficili da mantenere. – Vaccano

+0

Mentre il mio codice funziona, finirò per andare al database. Quindi sto dando la tua domanda sulla "risposta". – Vaccano

4

Questo sembra funzionare per me:

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; 
    } 
} 

Richiede i seguenti riferimenti:

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

dove nel codice chiamerò questo metodo "StartNewFile" – Satchi

0
non

Forse la soluzione esatta che stai cercando, ma è possibile creare un logger diverso per ogni sessione chiamando questo all'inizio di ogni chiamata di interfaccia:

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

Otterrete tutte le voci nello stesso file di registro ma è quindi molto semplice visualizzare ciascuna sessione separatamente con un visualizzatore come log4view.

Spero che sia utile

Problemi correlati