2010-03-16 13 views
16

Utilizziamo log4net per registrare l'evento e l'errore dell'applicazione winform. Il nostro cliente desidera controllare il file di registro durante l'esecuzione dell'applicazione. Ma non riesco a scoprire quando e come il log4net esegue l'operazione write (commit). E come soddisfare i requisiti del cliente, tranne la creazione di un altro logger da solo. Qualche aiuto? Grazie.Quando log4net scrive o esegue il commit del log nel file?

+0

Stiamo utilizzando log4net nelle nostre applicazioni Windows Form e non abbiamo alcun problema a riguardo. Ci sono alcune latenze tra l'evento e l'aggiornamento dei file, ma parliamo di secondi. Forse il problema è in qualche altro posto? –

+1

Sì, forse il problema del nostro custormer è la seconda situazione. E risolveremo questo problema con MemoryAppender come ha detto Peter. Grazie a tutti, in particolare a Peter. La tua risposta è molto più utile. – Jollian

risposta

8

Se si utilizza il FileAppender, questo appender eredita la TextWriterAppender, che a sua volta espone la proprietà ImmediateFlush. Il valore di questa proprietà è true per impostazione predefinita e obbliga l'appender a eseguire uno Flush() sul flusso sottostante per ogni operazione di aggiunta.

A seconda di come si immagina che il cliente "monitora" il file di registro, un'idea potrebbe essere quella di abilitare il monitoraggio dall'interno dell'applicazione. Questo può essere fatto in aggiunta all'aggiunta a un file, usando the MemoryAppender e leggendo gli eventi da quell'appender.

-1

Si parla di un file di registro, quindi presumibilmente si sta utilizzando FileAppender o una classe derivata. Questo buffererà l'output per impostazione predefinita. L'output bufferizzato è molto più efficiente, quindi per soddisfare le tue esigenze, ti suggerirei di fornire un meccanismo per svuotare il registro prima di visualizzarlo, piuttosto che forzare un commit dopo ogni operazione di scrittura.

Si può fare questo con il codice come il seguente:

foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) 
{ 
    BufferingAppenderSkeleton b = appender as BufferingAppenderSkeleton; 
    if (b != null) b.Flush(); 
} 
+1

"Ciò tamponerà l'output per impostazione predefinita." Questo non è vero! FileAppender (più precisamente la sua classe base TextWriterAppender) si svuota dopo ogni operazione di aggiunta! Vedi http://logging.apache.org/log4net/release/sdk/log4net.Appender.TextWriterAppender.ImmediateFlush.html Pertanto, non è necessario fare nulla perché le voci di registro più recenti verranno sempre scritte nel file immediatamente , in modo che il tuo cliente possa semplicemente aprire il file. – gehho

+1

@gehho ha ragione. FileAppender NON bufferizza. Le appendici integrate che eseguono il buffering sono AdoNet, BufferingForwarding, Remoting e gli allegati di SmtpXXX. –

1

Una cosa che ho notato durante l'utilizzo di log4net in un'istanza di SharePoint è che, in base alla configurazione della sicurezza e all'implementazione del caricamento della configurazione, l'utente che fa girare il pool di applicazioni potrebbe non avere i diritti per scrivere sul file system locale per creare il file di registro.

Per questo motivo è necessario assicurarsi che la configurazione sia invocata con le credenziali corrette, in SharePoint sarebbe in un contesto di sicurezza elevato. Non del tutto correlato, ma potrebbe essere un problema che attraversi.

0

vedere this SO post per howto a livello di programmazione di un log log4net. La risposta di Joe mentre è leggermente imprecisa è approssimativamente lo stesso codice e quindi presumibilmente funzionerebbe per lo svuotamento di tutti gli appendici bufferizzati.

Problemi correlati