2010-09-29 12 views
36

È possibile eseguire un rotolamento di registri di raccolta dati obsoleti in Sun JVM?I registri di Garbage Collection rotolano in java

Attualmente mi generare registri utilizzando:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log 

Ma devo ruotare manualmente utilizzando code FIFO e rotatelogs per creare un nuovo registro per ogni giorno. Spero che ci sia una soluzione migliore per questo.

Forse c'è un modo per accedere a queste voci di registro dall'interno di java in modo da poterle reindirizzare a log4j?

Edit: la soluzione con coda FIFO non è abbastanza buono, perché se il processo che legge da questa coda (ad esempio rotatelogs) legge a rallentare sarà rallentare l'intero JVM (apparentemente Sun/Oracle fa logging gc sincrono)

+0

La soluzione mi sembra abbastanza buona; cosa non ti piace a riguardo? Hai una colocation: la rotazione avviene vicino alla tua chiamata Java (che configura la registrazione) invece che nel codice dell'applicazione (che dovrebbe essere ignaro della registrazione). –

+0

Anche il mio intestino direbbe di no, non è possibile o se è possibile sarebbe attraverso un'API privata e limitata che probabilmente non vuoi forzare nella tua applicazione. –

+0

-XX: + PrintGCDateStamps non viene applicato a java5? –

risposta

77

Il supporto integrato per la rotazione del registro GC è stato aggiunto a HotSpot JVM. E 'descritto nel RFE 6941923 ed è disponibile in:

Ci sono tre nuovi flag JVM che può essere utilizzato per attivarlo e configurarlo:

  • -XX:+UseGCLogFileRotation
    deve essere utilizzato con -Xloggc:<filename>;
  • -XX:NumberOfGCLogFiles=<number of files>
    deve essere> = 1, il valore predefinito è uno;
  • -XX:GCLogFileSize=<number>M (or K)
    predefinito sarà impostato su 512 K.
+5

-XX: NumberOfGClogFiles deve avere una L maiuscola (-XX: NumberOfGCLogFiles) –

+0

È un peccato che questo non è al giorno, non vedo un punto in termini di dimensioni, di solito voglio vedere i log dal giorno specificato, non il 123MB :) –

+2

Il punto in dimensioni che scorre è che la dimensione totale dei file di registro è vincolata (a NumberOfGCLogFiles * GCLogFileSize), che evita errori di spazio-sinistro-su-dispositivo e supera l'inconveniente di trovare i registri di un determinato giorno . – vboerchers

3

Hai provato questa nuova opzione?

ho provato jdk7u7, jdk7u6 e jdk6u35 come questo:

java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseGCLogRotation -XX:NumberOfGClogFiles=3 -XX:GCLogFileSize=10M 

ma con tutte le versioni che sto vedendo questo errore:

Error: Could not create the Java Virtual Machine. 
Error: A fatal exception has occurred. Program will exit. 

Bugfix # 6.941.923 per 7u2 viene fatto riferimento qui: http://www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html

+1

La tua bandiera è sbagliata - è "-XX: + UseGCLogFileRotation" (ti manca il "File" nella bandiera) – Ryan

+1

E la "L" maiuscola manca in "-XX: NumberOfGClogFiles" (come era originariamente nella mia risposta) –

+0

Non è colpa di Blazej, gli errori di battitura sono nella documentazione del bug a cui fa riferimento (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6941923). – t0r0X

5

Se non è possibile aggiornare la versione java per utilizzare i nuovi flag per la rotazione del log gc, è possibile specificare un file gc diverso ogni volta che si avvia l'applicazione s:

JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/path/to/log/dir/gc.log-"`date +%Y-%m-%d-%H-%M` 

Quando il setenv fa riferimento, di solito in fase di avvio o l'arresto, si farà riferimento un file di log diverso. In unix questo può essere usato come metodo per "ruotare" il registro.

+0

Un metodo migliore sarebbe quello di aggiungere l'output dettagliato a un file e ruotare questo file con logrotate o simile. Ottieni log più lunghi e non suddivisi in un pasticcio di file diversi. –

+2

@Pathduck Questa risposta è per le versioni java precedenti. Significa che non puoi aggiungere a Xlogcc. I miei esperimenti mostrano anche che non è possibile chiudere java in esecuzione e riaprire il registro. Inoltre, non è possibile causarne la ricerca (EOF), java ricorda la posizione del file all'interno di Xloggc. Major PITA. – kubanczyk

+0

@Pathduck Purtroppo non tutti i sistemi hanno logrotato. Questa soluzione è stata pubblicata per gli amministratori di cui è necessario fare a meno. La data di aggiunta in questo modo è utile anche per la rotazione catalina.out :-) – Underverse

1

Un approccio interessante sarebbe il reindirizzamento di gc.log ad una pipa denominata -Xloggc:/my/named/pipe How to write GC log to named pipe

poi letto quel tubo formano l'applicazione stessa: How to open a Windows named pipe from Java?

e accedere a un arbitrario (ad esempio asincrona laminazione) logback logger dal codice.

Provato su una macchina Windows. Sfortunatamente, è più complicato da configurare su Windows che su Linux.

Su Windows funziona fondamentalmente con l'aiuto di un ulteriore Powershell script (può essere anche un'applicazione dedicata). Questo sample project contiene anche un'applicazione dimostrativa che può essere utilizzata immediatamente per testare il reindirizzamento dei registri GC su Logback tramite SLF4J.

+0

A mio avviso, è necessario che un utente ascolti la pipe denominata o che alla fine blocchi. –

+0

Sì, questo è il progetto di script. Contiene anche una "valvola" per il caso, niente riceve i messaggi e un paio di commenti che lo descrivono. –

+0

Anche se è intrigante, significa che l'applicazione ora dipende da questo componente esterno per funzionare correttamente. Questo probabilmente significherebbe per noi che non potremmo utilizzarlo in produzione: -/ –