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 /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 logrotate
programme, ce qui semble bien, mais elles semblent également se concentrer sur des 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?
logrotate
s'il y a une meilleure option, qui sonnait comme un bon point de départ pour la discussion.Réponses:
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:
multilog
de daemontoolsmultilog
de daemontools-encores6-log
de s6svlogd
de runittinylog
de perpcyclog
de noshLes outils permettant ensuite de traiter
multilog
les ensembles de fichiers journaux de format comprennent, entre autres:multilog-watch
logrange
multilog-stamptail
follow-log-directories
de noshexport-to-rsyslog
de noshLectures complémentaires
logrotate
ounewsyslog
en ce siècle. . Réponses fréquemment données.la source
multilog
ressemble à ce dont j'avais besoin.multilog
nulle part ne crée ou n'exige des liens symboliques. C'est totalement neutre à leur égard.l'
rotatelogs
outil fourni avec apache (dans lebin
répertoire) (voir la documentation ) utilise les entrées de stdin et fait pivoter le journal après un certain tempsla source
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
logger
commande et y accéder à la place.Sinon, vous feriez mieux de rediriger votre contenu enregistré vers un programme personnalisé ou un script, ou de
logrotate
configurer la configuration.EDIT: La réponse de JdeBP semble avoir ce que vous pourriez rechercher.
la source
J’avais un problème similaire et j’avais initialement rejeté Logrotate, mais il s’est avéré que Logrotate peut réellement le faire correctement. 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.
L'astuce est que cela ne fonctionne que si la redirection est faite avec " >> " (ajouter) au lieu de " > " (créer).
Fichier de configuration (truncate.cfg):
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:
Journal tournant en rotation:
la source
echo /dev/urandom >> /tmp/temp.log
écrira 13 caractères déterministes à/tmp/temp.log
et puis immédiatement quitter. Vouliez-vous direcat /dev/urandom
?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:
De manière anecdotique, j'ai vu des sources de journalisation du "monde réel" qui encouragent les utilisateurs à appliquer cette directive. Il y a quelques discussions sur cette option ici .
la source
Utilisez split, cela fait partie des coreutils. Il peut prendre stdin et le scinder en morceaux (en fonction de la taille, du nombre de lignes, etc.).
Exemple:
Note dash (-) indique à "split" d'utiliser stdin au lieu de fichier.
la source
split
des données sont stockées dans ce qui pourrait être un tampon important. Étant donné que de nombreux outils permettent de résoudre ce problème correctement, je ne pense pas que ce type de solution personnalisée puisse être recommandé.J'aime
multilog
mon cas d'utilisation, mais mon cas d'utilisation est tellement simple / trivial qu'il n'est pas présenté très simplement dans la documentation / les exemples que j'ai trouvés. Voici un exemple simple de rotation multilog:Quelques notes:
"Note that running processor may block any program feeding input to multilog."
où 'processeur' est la'!tai64nlocal'
partie 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 de nohup si nécessaire! Avec nohup, vous n’avez pas besoin du
2>&1
(s = 10e6 et n = 30 ici):Cette commande devrait vous aider à démarrer.
la source
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éez) mais si vous utilisez>>
(ajoutez) Logrotate copytruncate fonctionne à merveille 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:
some-program.sh >> /tmp/output.txt 2>&1 &
Créez un fichier de configuration logrotate sous le
/etc/logrotate.d
nom que vous voulez, output_roll dans mon cas.Exemple de configuration pour mon cas:
Configurez votre travail cron dans le
/etc/crontab
fichierCela vérifiera le fichier toutes les minutes. Vous pouvez vous adapter à vos besoins.
Le démarrer:
C'est ça
Remarque: J'ai également eu un problème avec SELinux étant défini sur
SELINUX=enforcing
, je l'ai donc défini surSELINUX=disabled
.la source
J'ai écrit un logrotee ce week-end. Je ne le ferais probablement pas si j'avais lu l'excellente réponse de @JdeBP et
multilog
.Je me suis concentré sur sa légèreté et sa capacité à bzip2 ses morceaux de sortie comme:
Cependant, il reste encore beaucoup à faire et à tester.
la source