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 ?

3voto

Jordan Points 11

Existe-t-il un moyen de faire fonctionner logrotate avec le stdout redirigé d'un processus en cours ?

Oui ! Vérifiez la directive "copytruncate" proposée par logrotate. En la spécifiant, vous demandez à logrotate de gérer cette situation : un programme simple qui garde son fichier journal ouvert indéfiniment.

Une mise en garde peut ou non constituer un problème dans votre situation :

Notez qu'il y a une très petite tranche de temps entre la copie du fichier et sa troncature, donc certaines données d'enregistrement peuvent être perdues.

Anecdotiquement, j'ai vu quelques sources de journaux du "monde réel" qui encouragent les utilisateurs à appliquer cette directive. Il y a une discussion sur cette option aquí .

3voto

Nazar Points 131

Utilisez split, il fait partie de coreutils. Il peut prendre stdin et le diviser en morceaux (basé sur la taille du morceau, ou le nombre de lignes, etc).

app | split --bytes 1G - /var/logs/put-prefix-here

Le tiret (-) indique à "split" d'utiliser stdin au lieu de file.

1voto

Taketo Sano Points 414

Je voulais juste ajouter au commentaire de Sam Hendley ci-dessus :

Le truc est que cela ne fonctionne que si la redirection est faite avec >> (append) au lieu de > (créer).

J'ai rencontré le même problème où le fichier original continue de s'étendre si vous utilisez > (créer) mais si vous utilisez >> (append) Logrotate copytruncate fonctionne parfaitement et comme prévu. Le fichier original revient à zéro octet et le programme continue à écrire.

Rediriger STDOUT et STDERR vers un fichier journal tournant :

  1. some-program.sh >> /tmp/output.txt 2>&1 &

  2. Créez un fichier de configuration de logrotate sous /etc/logrotate.d appelé quoi que ce soit, output_roll dans mon cas.

    Exemple de configuration pour mon cas :

    /tmp/output.txt {
        notifempty
        missingok
        size 1G
        copytruncate
        start 0
        rotate 15
        compress
    }
  3. Configurez votre tâche cron dans le répertoire /etc/crontab fichier

    *  *  *  *  * root /usr/sbin/logrotate /etc/logrotate.d/output_roll

    Cela permettra de vérifier le fichier toutes les minutes. Vous pouvez l'ajuster en fonction de vos besoins.

  4. Démarrez-le :

    $> service crond restart
  5. C'est ça.

Note : J'ai également eu un problème avec SELinux qui était configuré pour SELINUX=enforcing alors je l'ai réglé sur SELINUX=disabled .

1voto

Victor Sergienko Points 688

J'ai écrit un logrotee ce week-end. Je ne le ferais probablement pas si j'avais lu la réponse de @JdeBP et si je n'avais pas lu la réponse de @JdeBP. multilog .

Je me suis concentré sur le fait qu'il soit léger et qu'il puisse bzip2er ses morceaux de sortie :

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Mais il y a encore beaucoup de choses à faire et à tester.

0voto

Fabien Points 1

Comme nous n'étions pas entièrement satisfaits des outils répertoriés ici, nous en avons écrit un autre (désolé !) appelé log_proxy .

Caractéristiques principales :

  • utilisable comme un tuyau ( myapp myapp_arg1 myapp_arg2 |log_proxy /log/myapp.log )
  • suffixe de rotation du journal configurable avec stftime (par exemple : .%Y%m%d%H%M%S )
  • peut limiter le nombre de fichiers tournés (et supprimer les plus anciens)
  • peut faire tourner les fichiers en fonction de leur taille (en octets)
  • peut faire tourner les fichiers en fonction de leur âge (en secondes)
  • n'a pas besoin d'un répertoire de logs spécifique pour une application donnée (vous pouvez avoir un répertoire avec beaucoup de fichiers de logs différents provenant de différentes applications)
  • plusieurs instances de la même application peuvent se connecter au même fichier sans problème (exemple : myapp arg1 |log_proxy --use-locks /log/myapp.log et myapp arg2 |log_proxy --use-locks /log/myapp.log peuvent fonctionner en même temps)
  • implémenté en C (rapide et ne consomme pas beaucoup de mémoire)
  • configurable avec des options CLI ainsi qu'avec des variables env.
  • utilisable comme enveloppe pour capturer stdout et stderr ( log_proxy_wrapper --stdout=/log/myapp.stdout --stderr=/log/myapp.stderr -- myapp myapp_arg1 myapp_arg2 )
  • des versions binaires sans dépendance, même sur une très vieille distribution comme CentOS 6 (2011 !)

Commentaires, questions et relations publiques bienvenus sur : https://github.com/metwork-framework/log_proxy

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