69 votes

Rotation du journal de stdout ?

J'ai un programme Linux qui peut écrire des informations sur stdout et stderr.

J'ai un Shell Shell qui redirige cette sortie vers un fichier dans /var/log . (Via >> et 2>&1 .)

Y a-t-il un moyen de faire tourner ce fichier journal ? (taille maximale, puis passer à un autre fichier, ne conserver qu'un nombre limité de fichiers)

J'ai vu quelques réponses qui parlent de la logrotate ce qui semble bien, mais ils semblent aussi se concentrer sur les programmes qui génèrent des fichiers journaux en interne et traitent les signaux HUP. Y a-t-il un moyen de faire fonctionner cela avec une redirection de sortie basique script ?

59voto

JdeBP Points 25711

Comme alternative, vous pouvez faire passer la sortie par des outils conçus dans le but principal de maintenir des ensembles de fichiers journaux à taille limitée et à rotation automatique, comme par exemple :

Outils pour ensuite traiter multilog -format des ensembles de fichiers journaux comprennent, entre autres :

Autres lectures

19voto

richa Points 95

El rotatelogs livré avec apache (dans le répertoire bin dir) (voir docs ) prend l'entrée de stdin et fait tourner le journal après un certain temps.

15voto

Allan Mills Points 433

J'ai eu un problème similaire et j'avais initialement écarté logrotate mais il s'est avéré que logrotate peut en fait faire cela correctement, la directive clé est " copytruncate ". Pour une raison quelconque, ce terme n'est pas apparu dans les recherches que j'ai effectuées sur Google. J'ajoute donc cette réponse pour clarifier la manière exacte de l'utiliser dans ce cas.

L'astuce est la suivante ne fonctionne que si la redirection est faite avec " >> "(append) au lieu de " > " (créer).

Fichier de configuration (truncate.cfg) :

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

Programme d'essai (ne renonce jamais au fichier). Vous pouvez le voir remplir le disque et, bien que la suppression du fichier journal semble fonctionner, elle ne libère en fait aucun espace sur le disque :

cat /dev/urandom >> /tmp/temp.log

Rotation du journal de bord :

logrotate truncate.cfg

14voto

bosnic Points 534

Si vous pouvez l'envoyer vers l'un des flux de journalisation standard (syslog, démon, cron, utilisateur, sécurité, courrier, etc.), vous pouvez utiliser l'option logger et l'envoyer à la place.

echo "Hello." | logger -p daemon.info

Sinon, vous feriez mieux de transmettre le contenu enregistré à un programme personnalisé ou à un script pour le gérer, ou encore de configurer l'outil de gestion du contenu. logrotate configuration.

EDIT : La réponse de JdeBP semble avoir ce que vous recherchez.

4voto

Calmarius Points 2626

J'aime multilog pour mon cas d'utilisation, mais mon cas d'utilisation est si trivial/simple qu'il n'est pas présenté très simplement dans les documents/exemples que j'ai trouvés. Voici un exemple simple de rotation multilogarithmique :

mkdir /tmp/myapp
./myapp | multilog t s10000 n5 '!tai64nlocal' /tmp/myapp 2>&1

Quelques notes :

  • Ceci décharge les journaux dans le répertoire /tmp/myapp/.
  • le s10000 représente 10 000 octets*.
  • le n5 représente 5 fichiers.* Le journal 'actuel' compte comme un des fichiers, donc cela inclut 4 journaux plus anciens + 'actuel'.
  • Ceci est basé sur, et adapté des exemples fournis par François Beausoleil à : http://blog.teksol.info/pages/daemontools/best-practices
  • Je ne comprends pas beaucoup d'options - je vous renvoie aux différentes documentations pour étendre ceci...
  • Les docs préviennent que : "Note that running processor may block any program feeding input to multilog." où "processeur" est le '!tai64nlocal' partie de la commande

*Pour de nombreuses applications, ce sont de mauvais choix pour une utilisation à long terme. Ils permettent cependant d'observer le comportement du remplissage et de la rotation des bûches plus rapidement que les grosses bûches.

Enfin, n'oubliez pas de faire un nohup si nécessaire ! Avec nohup, vous n'avez pas besoin de l'option 2>&1 (s=10e6 et n=30 ici) :

mkdir -p /tmp/myapp
nohup ./myapp | multilog t s10000000 n30 '!tai64nlocal' /tmp/myapp &

Cette commande devrait vous permettre de commencer.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X