web-dev-qa-db-fra.com

Rotation du journal de stdout?

J'ai un programme Linux capable d'écrire des informations sur stdout et stderr.

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

Existe-t-il un moyen de faire pivoter 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 du programme logrotate, ce qui semble bien, mais elles semblent également se concentrer sur les programmes qui génèrent des fichiers journaux en interne et gèrent les signaux HUP. Existe-t-il un moyen de faire fonctionner cela avec un script de redirection de sortie de base?

50
Miral

Vous pouvez également acheminer la sortie via des outils conçus dans le but principal de gérer des ensembles de fichiers journaux de taille maximale, avec rotation automatique, tels que:

Les outils permettant de traiter les ensembles de fichiers journaux au format multilog- comprennent notamment:

Lectures complémentaires

38
JdeBP

l'outil rotatelogs fourni avec Apache (dans le répertoire bin) (voir docs ) prend en entrée l'entrée stdin et fait pivoter le journal après un certain laps de temps

15
BertNase

Si vous pouvez le faire accéder à l'un des flux de journaux standard (syslog, démon, cron, utilisateur, sécurité, messagerie, etc.), vous pouvez utiliser la commande logger et la diriger à la place. .

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

Sinon, vous feriez mieux de rediriger votre contenu enregistré vers un programme personnalisé ou un script, ou de configurer la configuration logrotate .

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

14
Lara Dougan

J’ai eu un problème similaire et j’avais initialement abandonné logrotate, mais il s’est avéré que logrotate peut en réalité bien le faire, la directive clé est " copytruncate ". Pour une raison quelconque, ce terme n’a été mentionné dans aucune des recherches que j’ai faites sur Google, j’ajoute donc cette réponse pour préciser comment l’utiliser dans ce cas.

Le truc, c'est que ne fonctionne que si la redirection est effectuée avec " >> " (ajouter) à la place de "> " (créer).

Fichier de configuration (truncate.cfg):

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

Programme de test (n'abandonne jamais le fichier). Vous pouvez le regarder remplir le disque et bien que la suppression du fichier journal semble fonctionner, elle ne libérera aucun espace sur le disque:

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

Journal tournant en rotation:

logrotate truncate.cfg
14
Sam Hendley

J'aime multilog pour mon cas d'utilisation, mais mon cas d'utilisation est si simple/trivial 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 multilog:

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

Quelques notes:

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

* Pour de nombreuses applications, ce sont de mauvais choix pour une utilisation à long terme. Ils vous permettent d’observer le comportement de remplissage et de rotation des journaux plus rapidement que les journaux de grande taille.

Enfin, n'oubliez pas Nohup si nécessaire! Avec Nohup, vous n'avez pas besoin du 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 aider à démarrer.

3
sage

Utilisez split, cela fait partie des coreutils. Il peut prendre stdin et le scinder en morceaux (en fonction de la taille des morceaux, du nombre de lignes, etc.).

Exemple:

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

Note dash (-) indique à "split" d'utiliser stdin au lieu de fichier.

3
Nazar

Alors, y a-t-il un moyen de faire fonctionner logrotate avec la sortie standard redirigée d'un processus en cours?

Oui! Découvrez la directive "copytruncate" proposée par logrotate. Spécifier cela indique à logrotate de gérer cette situation: un programme simple qui garde son fichier journal ouvert indéfiniment.

Une mise en garde peut ou peut ne pas être un problème dans votre situation:

Notez qu’il existe très peu de temps entre la copie du fichier et sa troncature, de sorte que certaines données de journalisation risquent d’être perdues.

De manière anecdotique, j'ai vu des sources de journal du "monde réel" qui encouragent les utilisateurs à appliquer cette directive. Il y a quelques discussions sur cette option ici .

3
natevw

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

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

J'ai rencontré le même problème où le fichier d'origine ne cesse de croître si vous utilisez > (créer) mais si vous utilisez >> (ajouter) Logrotate copytruncate fonctionne parfaitement et comme prévu. Le fichier d'origine redescend à zéro octet et le programme continue à écrire.

Redirige STDOUT et STDERR vers un fichier journal en rotation:

  1. some-program.sh >> /tmp/output.txt 2>&1 &
  2. Créez un fichier de configuration logrotate sous /etc/logrotate.d appelé peu importe, 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 travail cron dans le fichier /etc/crontab

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

    Cela vérifiera le fichier toutes les minutes. Vous pouvez vous adapter à vos besoins.

  4. Le démarrer:

    $> service crond restart
    
  5. C'est tout

Remarque: j'ai également eu un problème avec SELinux défini sur SELINUX=enforcing. Je l'ai donc défini sur SELINUX=disabled.

1
user578558

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

Je me suis concentré sur sa légèreté et sa capacité à bzip2 ses morceaux de sortie comme:

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

Cependant, il reste encore beaucoup à faire et à tester.

1
Victor Sergienko