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?
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-encore de Bruce Guenters6-log
à partir de s6svlogd
from runittinylog
de perpcyclog
de noshLes outils permettant de traiter les ensembles de fichiers journaux au format multilog
- comprennent notamment:
multilog-watch
logrange
multilog-stamptail
follow-log-directories
de noshexport-to-rsyslog
de noshlogrotate
ou newsyslog
au cours de ce siècle.. Réponses fréquemment données.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
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.
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
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:
"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.
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.
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 .
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:
some-program.sh >> /tmp/output.txt 2>&1 &
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
}
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.
Le démarrer:
$> service crond restart
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
.
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.