2011-09-21 16 views
5

Stiamo riscontrando un problema particolare. Scenario: abbiamo 3 server che con più istanze di un componente scrivono tutti i log delle transazioni in un singolo file di registro. Usiamo log4j ei server funzionano in Java 1.3. setAppend() viene passato true e l'implementazione è DailyRollingFileAppenderLog4j dailyrollingfileappender file issues

Problema: a mezzanotte, ci si aspetta che il file di registro corrente si sposti con un nuovo nome file e inizi a scrivere su un nuovo file. Questo sta funzionando bene nella nostra configurazione di test (registri di scrittura su server singolo). In produzione, a mezzanotte, viene creato il nuovo file in cui vengono scritti nuovi log, ma il file viene cancellato

Qualsiasi aiuto sarà molto apprezzato in quanto è stato un paio di giorni e non siamo in grado di ottenere alcun vantaggio per il problema.

+0

Potrebbe pubblicare il file di configurazione, per favore? –

+0

Grazie per le risposte. Ho trovato un altro link qui [http://vivekagarwal.wordpress.com/2008/02/09/missing-log4j-log-files-with-dailyrollingfileappender-when-they-should-roll-over/]. Proveremo questo e dare un aggiornamento – rajesh

+0

Abbiamo proceduto con la soluzione fornita nel link sopra e ha funzionato. – rajesh

risposta

4

Il non deve registrare nello stesso file da più processi. Log4j è sicuro per i thread, ma non è sicuro per il processo, se posso dirlo; non funziona come libreria condivisa tra diversi processi java. Log4j incorporato in un'applicazione java non ne conosce altri.

Con il rollover causa il problema che hai appena scoperto: tutti i processi eseguono il proprio codice di rollover, sovrascrivendo ciecamente i contenuti precedenti (perché nessuno di loro si aspetta).

Una possibile soluzione qui: Log4j Logging to a Shared Log File

+1

** il file sottostante nella classe basata su FileAppender viene aperto, aggiunto e chiuso con ogni porzione di registro salvata ** È davvero così? Non sono così sicuro. Almeno su UNIX se accedete a un file e poi lo troncate dalla riga di comando, vedrete nella prossima scrittura che il file viene riempito di zeri binari prima che il messaggio venga scritto. Ciò indicherebbe che il file non è chiuso e aperto su ogni evento di log (che sarebbe costoso), ma in realtà un puntatore di file viene mantenuto tra le scritture. I messaggi non vengono mescolati insieme perché le scritture sottostanti al filesystem sono atomiche. – Tim

+0

Hai ragione. Non ricordo cosa stavo pensando quasi 2 anni fa, ma non ci sono prove nelle fonti per supportare la mia teoria. Posso solo scusarmi ora. – MaDa

2

Abbiamo incontrato lo stesso problema. Il problema di fondo è che non c'è modo di coordinare l'accesso al file di log su più processi (in questo caso in esecuzione su più server). Ciò significa che accadono tutti i tipi di cose brutte: i log vengono sovrascritti, i file non riescono a rollare ...

Il mio suggerimento è di fare in modo che ogni server scriva in un file separato e quindi li unisca in un processo di post-elaborazione.

1

Supponiamo di aver configurato DailyRollingFileAppender con rotazione giornaliera (può essere configurato per la rotazione ogni ora, minuto ecc.). Supponiamo che oggi sia il 31 dicembre 2014 e il nome del file di registro sia sample.log. La rotazione del registro avverrà nel modo seguente:

  • Il primo messaggio di registro che viene ricevuto dopo mezzanotte (ad esempio alle 1 del 1 gennaio 2015) attiverà la rotazione del file di registro.
  • La rotazione del file di registro eliminerà prima tutti i file esistenti con il suffisso del giorno precedente. (Ad esempio eliminerà qualsiasi file con nome sample-2014-12-31.log. Idealmente nessun file di questo tipo dovrebbe esistere.).
  • Quindi rinominerà il file corrente con il suffisso del giorno precedente. Ad esempio, rinomina sample.log a sample-2014-12-31.log.
  • Creerà un nuovo file di registro senza suffisso. nuovo sample.log
  • Inizierà a scrivere nel nuovo file sample.log.

Se due istanze di punti Log Manager per lo stesso file di log quindi ogni istanza sarà ripete in modo indipendente al di sopra passi sullo stesso file.Ciò può verificarsi in uno dei seguenti scenari:

  • Se due o più file WAR distribuiti nello stesso contenitore puntano allo stesso file di registro.
  • Se due o più processi fanno riferimento allo stesso file di registro.
  • ecc

Tale scenario conduce alla questione di cui la questione.

  • Su un computer Windows, una volta che il primo processo ha ruotato il file di registro e l'handle acquisito sul nuovo file, il secondo app del registro non riuscirà a scrivere i registri.
  • Su una macchina Linux, il secondo processo elimina il file di archivio creato dal primo processo e rinomina il nuovo file (attualmente utilizzato dal primo processo) nel file del giorno precedente. Così il primo processo inizierà a scrivere i log nel file del giorno precedente, il secondo processo scriverà i log in un nuovo file. Dopo la mezzanotte, il file di registro utilizzato dal primo processo verrà eliminato. Quindi, i registri del primo processo continueranno a perdersi.
+0

stiamo riscontrando un comportamento molto simile nella nostra applicazione Web - dobbiamo ancora determinare il motivo per cui potenzialmente abbiamo più di un LogManager. – sbarlster

+1

@sbarlster: in genere accade quando due file di guerra (o due processi autonomi) in esecuzione su una macchina hanno lo stesso nome del file di registro. – Bipul

Problemi correlati