Domanda

Sto usando log4net nel mio progetto e c'è un problema. La funzione principale del programma richiede molto tempo e utilizzo la registrazione per salvare informazioni al riguardo. Uso FileAppender per salvare il registro in un file.

La mia applicazione si trova nella cartella condivisa (locale) e potrebbero esserci diverse istanze dell'applicazione in esecuzione da un percorso. In questo caso ho potuto registrare le informazioni solo dal primo programma, altre istanze delle mie applicazioni non sono riuscite a registrare le informazioni perché il file di registro è bloccato .

Quando utilizzo l'opzione " log4net.Appender.FileAppender + MinimalLock " ci sono casi di perdita di informazioni. Non tutti i log di entrambe le istanze vengono salvati su file.

Come posso risolvere questo problema e registrare le informazioni da istanze parallele? Anche per quanto riguarda il degrado delle prestazioni quando utilizzo "MinimalLock" opzione?

Grazie. Spero in tuo aiuto.

È stato utile?

Soluzione

Includi semplicemente l'id di processo dell'applicazione nel nome del file di registro. Diverse istanze della tua app accederanno quindi a file diversi. Ecco un esempio:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

Altri suggerimenti

Penso che sia una situazione tipica in cui è auspicabile una soluzione di registrazione centralizzata. Invece di preoccuparmi dei file e soffrire di colli di bottiglia delle prestazioni, preferirei pompare le istruzioni di registro in modo asincrono a un servizio remoto che si occuperà della memorizzazione e della gestione dei registri. Dai un'occhiata a questo aggregatore di log chiamato logFaces , è stato progettato allo scopo di disaccoppiare le applicazioni dalla gestione dei loro log. Dovrebbe funzionare con l'appender UDP log4net standard e partizionerà i dati di log per applicazioni, host, thread, ecc. Consentendo di creare file di log in qualsiasi momento quando realmente necessari.

Divulgazione : sono l'autore di questo prodotto.

Forse accedi a file diversi di ogni istanza? Altrimenti, probabilmente avresti bisogno di impostare un processo separato dedicato alla registrazione. Ogni istanza del tuo programma invierebbe lì i suoi messaggi di registro e si occuperebbe di aggiungerlo al file. Ciò potrebbe essere realizzato utilizzando SocketAppender, forse. Inoltre, trovo che suddividere l'output del registro in mandrini usando RollingFileAppender sia molto più facile da gestire.

È possibile creare un appender personalizzato che apre il file da scrivere e quindi lo chiude. Se dovesse colpire un file bloccato, potrebbe mettere in pausa e riprovare un piccolo numero di volte.

Nell'appender personalizzato è anche possibile aprire il file in modalità di scrittura condivisa che consentirebbe a più writer, ma ciò non impedisce l'unione di pezzi di linee di registro.

Se non stai scrivendo molti dati, il meccanismo di apertura / chiusura, elencato sopra, è probabilmente l'opzione migliore. Nota, a causa della costante apertura e chiusura del file, potresti notare un notevole impatto sulle prestazioni se stai registrando molti dati.

Un meccanismo più complicato, ma che potrebbe fornire un percorso di registrazione ad alte prestazioni: scrivere un servizio di registrazione che riceve le linee di registro tramite TCP o UDP. Il servizio sarebbe responsabile del buffering dei dati e della loro scrittura sul disco. Abbiamo usato questo approccio in passato (non tramite Log4Net, ma come soluzione generale) per migliorare l'efficienza della scrittura dei log.

Prendi sicuramente in considerazione la creazione di file di registro diversi per ogni processo, magari con nomi di file univoci generati utilizzando un timestamp.

Invece di MinimalLock l'uso di InterProcessLock può ridurre la perdita di dati in caso di più processi che accedono a un singolo file di registro.

log4net.Appender.FileAppender+InterProcessLock
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top