2009-08-07 11 views
9

Attualmente utilizzo log4net con RollingFileAppender.C# log4net memorizza le voci in memoria ed Email in determinate condizioni

Ogni volta che si effettua una chiamata di registro, mi piacerebbe effettuare l'archiviazione nella memoria nella memoria. Alla fine dell'esecuzione della mia console mi piacerebbe (se un'impostazione di app.config è vera) prendere solo Warns and Fatals e inviare tutti questi messaggi in un'e-mail. Noto MemoryAppender ma non sono sicuro di come utilizzarlo. Vedi anche SMTPAppender ma non si è sicuri che sia lo strumento giusto, altrimenti userò MemoryAppender e in qualche modo escluderò solo gli eventi di Levels Warn/Fatal e poi invierò l'email usando la classe SmtpClient.

Come raggiungere questo obiettivo?

Grazie

Aggiornamento

mia ultima parte di log4net config ora assomiglia.

<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" > 
    <onlyFixPartialEventData value="true" /> 
    <threshold value="WARN" /> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="RollingFile" /> 
    <appender-ref ref="MemoryAppender" />  
    </root> 

Nel codice che faccio:

private static MemoryAppender MemoryAppender 
{ 
    get 
    { 
       if (memoryAppender == null) 
       { 
        Hierarchy h = LogManager.GetRepository() as Hierarchy; 
        memoryAppender = h.Root.GetAppender("MemoryAppender") as MemoryAppender; 
       } 
       return memoryAppender; 
      } 
    } 

Poi quando voglio i fatti mi chiamano:

MemoryAppender.GetEvents();

Ho provato MemoryAppender.GetEvents() [0] .RenderedMessage ma non è l'output corretto, come ottengo la stringa di messaggio come è stata scritta nei registri File/Console con lo schema e il tempo corretti ecc. e mi costruisco uno StringBuilder? Inserirò quindi questo nel corpo della mia email e lo invierò utilizzando SmtpClient. RenderMessage mi sta solo fornendo la stringa fornita alla chiamata Log.Warn(), non ciò che è stato scritto nel registro. Ciò è dovuto al fatto di non impostare un modello di layout su MemoryAppender?

Grazie

risposta

6

MemoryAppender si limita ad "aggiungere" alla memoria ed è quindi principalmente utile solo per scopi di sviluppo e test. E al momento non esiste un appender che si aggiungerà solo all'arresto dell'applicazione.

SMTP Application è una via di mezzo, poiché eredita the BufferingAppenderSkeleton. Questi appendici hanno una proprietà BufferSize che controlla quanti messaggi vengono tenuti in memoria prima che vengano scaricati.

Quali messaggi da passare alle appendici vengono controllati con le impostazioni di livello sull'elemento radice o sui singoli elementi del logger. Nel tuo caso usa un livello di WARN che lascerà passare attraverso WARN, ERROR e FATAL. Se non vuoi i messaggi di ERRORE dovrai mettere un filtro di livello sul tuo appender.

Aggiornamento: MemoryAppender non utilizza alcun layout per "renderizzare" oggetti messaggio. Quello che ottieni da MemoryAppender sono solo gli oggetti di messaggi non elaborati così come sono prodotti da log4net. Dovrai convertirli da soli in testo significativo.

In alternativa, se si richiede sia la funzionalità di layout che l'aggiunta in memoria, è possibile esaminare la sottoclasse AppenderSkeleton. In questo modo ottieni il supporto di base per il layout. Quando si implementa il metodo Append si può fare ciò che fa MemoryAppender, che si aggiunge ad un elenco interno di messaggi.

Aggiornamento 2: per implementare l'alternativa MemoryAppender, suggerisco di prendere the MemoryAppender come punto di partenza. MemoryAppender è una sottoclasse di AppenderSkeleton e ha quindi accesso al metodo RenderLoggingEvent. Quindi, sottoclassi MemoryAppender e aggiungiamo un metodo che restituisce il batch corrente di eventi di registrazione:

public class RenderingMemoryAppender : MemoryAppender 
{ 

    public IEnumerable<string> GetRenderedEvents() 
    { 
     foreach(var loggingEvent in GetEvents()) 
     { 
      yield return RenderLoggingEvent(loggingEvent); 
     } 
    } 
} 
+0

Ciao Peter grazie per il tuo aiuto, mi dispiace per il ritardo. Puoi dare un'occhiata al mio aggiornamento alla domanda sopra, qualche idea? molto apprezzato. – m3ntat

+0

Inoltre avevi ragione, voglio catturare WARN, ERROR e FATAL in memoria. – m3ntat

+0

@ m3ntat - guarda la mia risposta aggiornata. Spero possa aiutare. –

1

È possibile utilizzare SMTPAppender e guardare come funziona la funzionalità a filo. Log4net mantiene tutti i messaggi in memoria fino a quando non viene chiamato flush (se è impostato in questo modo), quindi l'email verrà inviata quando lo si scarica.

Un'altra cosa che puoi fare è creare un appender separato (Rolling o FileAppender) con i filtri WARN e FATAL, quindi collegare questo appender allo stesso logger e alla fine della tua esecuzione invia questo file se è vuoto (e puoi scegliere di inviarlo come allegato o direttamente nel corpo dell'e-mail). Fammi sapere se vuoi maggiori dettagli, questo è quasi lo stesso che sto facendo sapere.

Buona fortuna!

Ricardo.

+0

Ciao Ricardo grazie per il tuo aiuto, mi dispiace per il ritardo. Puoi dare un'occhiata al mio aggiornamento alla domanda sopra, qualche idea? molto apprezzato. – m3ntat

Problemi correlati