La rotation du fichier journal du collecteur de données (loggc) avec logrotate ne fonctionne pas correctement
Je suis tombé sur un drôle de problème lors de l'utilisation de la JVM de collecte des ordures journal option avec Linux logrotate commande.
Lorsque la rotation est exécuté, il remplit NUL ( ^@ ) les valeurs de la première ligne du fichier donné en argument à la JVM.
Disons que c'est la java (appel Test.class est situé dans /home/test/) :
java -Xloggc:/home/test/test.journal -cp /home/test/Test
La configuration de logrotate pour ce fichier se présente comme suit :
/home/test/test.journal {
tourner 56
missingok
notifempty
copytruncate
nocreate
nomail
}
J'ai aussi une entrée crontab journalisation chaque minute des fins de test :
*/1 * * * * /usr/sbin/logrotate -f /etc/logrotate.d/gcLog
Je suis venu à la conclusion que la JVM écrit en mode ajout et maintient une sorte de décalage utilisé pour écrire de la ligne suivante dans le fichier, même si le fichier est tronqué par logrotate (j'ai peut-être mal).
Ma prochaine idée est d'essayer et de rediriger la sortie standard (stdout) pour tester.le fichier de log.
J'ai utilisé ce java appel et a gardé la même configuration de logrotate et cron:
java -verbose:gc -cp /home/test/Test > /home/test/test.journal
Une fois de plus, quand le test.journal est tronqué par logrotate, le nouveau fichier créé est rempli avec NUL (^@) les valeurs de la première ligne.
Pas besoin de dire que je n'ai pas trouvé quelque chose d'utile à l'aide de google.
J'ai trouvé une autre question sur stackoverflow genre de connexes, mais je ne parvenais pas à le programme d'installation de Java Script, donc cela ne fonctionne pas.
Qui a rencontré ce problème ? Une idée de pourquoi cela se produit ? Mieux, aucune solution de contournement ou de la solution ?
J'ai besoin d'essayer et le tuyau de l'appel à l'application d'un script de lecture de la sortie et peut-être regarder les logs de Tomcat et de tourner stdout dans catalina.(ici un peu d'aide serait vraiment appréciée)
source d'informationauteur Hyb
Vous devez vous connecter pour publier un commentaire.
Nous avons eu le même problème chez nous de course Jboss7 et Java6, nous recevions des valeurs Null dans la table de fichiers et ils ont juste continué à grandir.
Solution a été de journal GC à stdout et puis ajouter stdout vers un fichier:
Exemple Simple:
Apparemment en utilisant append (>>) de se débarrasser de la Java "pointeur" vers une position dans le fichier. Avec, en bonus, de ne pas avoir le GC journaux de réinitialisation pour redémarrer le serveur afin que nous puissions avoir quelques statistiques au fil du temps.
Au moins IBM PMAT outil n'a pas de problème de l'analyse du sysout avec GC sortie.
La solution la plus simple est parfois la meilleure 🙂
Si je regrette de Java devrait prendre en charge la rotation de la GC journaux, comme je vois quelqu'un qui est discuté avant:
http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-April/002061.html
Pour expliquer l'null, Java maintient une référence interne de comptage de la position pour l'indentation, et que vous vous déplacez le fichier de la façon dont il provoque des caractères null être écrit dans le journal.
J'ai vu les manipulations avec le GC fichiers journaux afin de provoquer une panne du système, l'abandon causé lors de l'écriture dans le fichier journal est ignoré (voir le code ici http://pastebin.com/HWkNv3PM) provoquant la JVM de continuer à ignorer l'erreur.
Que le fichier est ouvert, je crois que la position du compteur n'est pas en cours de réinitialisation.
Comme pour d'autres idées sur la façon de rouler les fichiers journaux - voir aussi: Rolling garbage collector journaux en java
Une solution simple pourrait être de modifier la Java appel que j'ai utilisé dans ma question:
à
Configuration de logrotate et cron pourrait rester le même (même si cron période doit être augmentée).
Voir mon commentaire sous la question d'un lien donnant plus de détails sur logrotate et des gestionnaires de fichiers sous Linux.
Voir aussi brainzzy les explications de sur Java comportement.
au lieu de java -verbose:gc >> console.journal que je peux faire:
java -Xloggc:journaux/gc.log >> console.connectez-vous donc la sortie sera enregistré dans un fichier et de le tourner vers la console.journal?