Fichiers Logrotate avec la date dans le nom du fichier
j'essaie de configurer logrotate dans RHEL pour les logs tomcat6. Actuellement, le logrotate fonctionne très bien pour catalina.journaux, il est tourné et comprimé correctement.
le problème est avec les fichiers avec la date comme:
catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log
ces fichiers ne font pas l'objet d'une rotation. Je comprends que je dois configurer dans /etc/logrotate.d/tomcat6 fichier là où la rotation de catalina.est configuré. Mais je ne suis pas capable de le configurer.
Tout ce que je veux, c'est que ces vieux fichiers soient compressés quotidiennement, sauf le fichier journal de date actuel.
est-ce que quelqu'un peut m'aider, s'il vous plaît!!
Merci Noman A.
10 réponses
(premier post jamais donc si elle ressemble à une araignée ivre a formaté alors désolé)
après avoir utilisé notre ami Google, ici et je ne me souviens pas où d'autre j'ai réussi à réaliser quelque chose en utilisant logrotate (plutôt que cron ou un autre équivalent).
j'ai de la suite dans /var/log/rsync/:
-rw-r--r-- 1 root root 1.1M Apr 9 08:13 2014-04-09 07:48:18.log
-rw-r--r-- 1 root root 1.4M Apr 11 15:20 2014-04-11 15:02:52.log
-rw-r--r-- 1 root root 1.6M Apr 11 15:42 2014-04-11 15:22:04.log
-rw-r--r-- 1 root root 1.8M Apr 12 08:01 2014-04-12 07:45:31.log
-rw-r--r-- 1 root root 2.0M Apr 13 08:10 2014-04-13 07:53:38.log
-rw-r--r-- 1 root root 2.2M Apr 14 08:19 2014-04-14 07:51:09.log
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log
et le fichier logrotate suivant:
/var/log/rsync/*.log {
daily
rotate 7
compress
delaycompress
notifempty
missingok
}
ce que je croyais être parfaitement raisonnable. Mais après qu'il a refusé de travailler et en découvrant qu'il ne fonctionnerait jamais (courtoisie de ce post) je me suis demandé si elle pourrait être futé pour le faire fonctionner.
après beaucoup de tests et de retouches, j'ai réussi à le caresser de la manière suivante:
/var/log/rsync/dummy {
daily
rotate 0
create
ifempty
lastaction
/usr/bin/find /var/log/rsync/ -mtime +7 -delete
/usr/bin/find /var/log/rsync/ -mtime +1 -exec gzip -q {} \;
endscript
}
dans un fichier de configuration de logrotate appelé /etc/logrotate.d / local-rsync. Puis créez le fichier journal fictif:
touch /var/log/rsync/dummy
puis forcer un logrotate avec:
logrotate -fv /etc/logrotate.d/local-rsync
qui donne:
-rw-r--r-- 1 root root 71K Apr 9 08:13 2014-04-09 07:48:18.log.gz
-rw-r--r-- 1 root root 88K Apr 11 15:20 2014-04-11 15:02:52.log.gz
-rw-r--r-- 1 root root 82K Apr 11 15:42 2014-04-11 15:22:04.log.gz
-rw-r--r-- 1 root root 84K Apr 12 08:01 2014-04-12 07:45:31.log.gz
-rw-r--r-- 1 root root 87K Apr 13 08:10 2014-04-13 07:53:38.log.gz
-rw-r--r-- 1 root root 92K Apr 14 08:19 2014-04-14 07:51:09.log.gz
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log
-rw-r--r-- 1 root root 0 Apr 16 12:11 dummy
attendez demain matin...
je me rends compte que cron serait tidier mais j'ai un autre élément dans le fichier de configuration de logrotate et je voulais garder les deux ensembles.
Bonus avec le fichier dummy est qu'il ne prend pas de place!
Vous pouvez constater qu'il ne semble pas avoir tourné quelque chose un jour. Il m'a fallu du temps pour le travail pourquoi, mais ensuite il a compris. find-mtime +1 correspond à des journées entières (soit 24*60 minutes) et si le logrotate quotidien a fonctionné en moins de 24 heures depuis la dernière fois où les logs ont été créés, il semble parfois qu'il n'ait pas fonctionné. Si cela vous dérange, alors utiliser 23 heures avec find-mmin +1380 pourrait être plus approprié.
j'ai passé un bon moment à lire beaucoup de documentation. Logrotate ne semble pas pouvoir regrouper les différents fichiers avec des dates incluses dans le nom du fichier. Logrotate ne peut pas faire ce dont nous avons besoin.
vous avez deux options Modifier la fonction de journalisation fournie par java / tomcat pour ne pas inclure la date dans le nom du fichier. http://tomcat.apache.org/tomcat-6.0-doc/logging.html
le deuxième et plus rapide façon est d'utiliser votre propre petit script pour faire le travail pour vous, à l'aide de find
. https://serverfault.com/questions/256218/logrotation-when-filenames-includes-date , https://serverfault.com/a/256231/71120
find / pathtologs / * - mtime +5-exec rm {} \;
je suis allé avec la deuxième option, parce que nos développeurs ont codé pour les dates dans les noms de fichiers. Il se doit donc d' rester de cette façon.
Les ensembles -mtime +5
ne cherchent que les fichiers qui sont plus anciens que 5 jours.
à Partir de find
's de la documentation.
Les données du fichieront été modifiées pour la dernière fois il y a 24 heures. Voir les commentaires de-atime pour comprendre comment l'arrondissement affecte l'interprétation des temps de modification des fichiers.
mise à jour selon le commentaire
trouver /pathtologs/* -mtime +5 -supprimer
Si vous souhaitez supprimer, c'est un moyen rapide de le faire.
Si vous avez besoin d'une autre commande, vous pouvez toujours remplacer le exec rm {} \;
avec quelque chose d'autre.
quelque chose comme ceci dans/etc / cron.d / rotate_tomcat_logs:
# delete every log file over 100 days old, and compress every log file over 1 day old.
00 1 * * * root ( find /opt/tomcat/logs -name \*log\* -name \*.gz -mtime +100 -exec rm -f {} \; >/dev/null 2>&1 )
05 1 * * * root ( find /opt/tomcat/logs -name \*log\* ! -name \*.gz -mtime +1 -exec gzip {} \; >/dev/null 2>&1 )
/chemin/vers/logs/*.journal { missingok compresser rotation 7 }
ce type de chose ne fonctionne pas normalement parce que, comme d'autres le font remarquer, tomcat a sa propre rotation des rondins. Vous pouvez soit utiliser un cron simple pour supprimer de vieux fichiers ou désactiver la rotation sur la valve de journal d'accès. En désactivant la rotation des logs (et éventuellement en changeant le nom de fichier patter), le logrotate ci-dessus et d'autres configs similaires fonctionneront parfaitement.
la ligne de fond est vous devez utiliser logrotate ou la rotation logarithmique intégrée dans tomcat, mais pas les deux en même temps.
probablement vous pouvez supprimer la date des noms de fichier log comme décrit dans comment supprimer le motif de date des journaux tomcat pour pouvoir utiliser les règles logrotate.
cela a fonctionné pour moi au moins pour localhost access log.
pour activer la rotation quotidienne des logs dans tomcat [linux] avec postfix de date au fichier catalina, faire les changements ci-dessous.
Télécharger cronolog paquet et l'installer dans le système d'exploitation linux
tar -zxvf cronolog-1.6.2.tar.gz
./configure
make
make install
ouvert apache-tomcat-7.0.65/bin/catalina.sh Fichier utilisant la commande vi et modifiez les lignes comme indiqué ci-dessous exemple : /opt/apache-tomcat-7.0.65/bin/catalina.sh
shift
touch "$CATALINA_OUT"
# comment above line as below
#touch "$CATALINA_OUT"
if [ "" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
#>> "$CATALINA_OUT" 2>&1 "&"
# comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
else
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
#>> "$CATALINA_OUT" 2>&1 "&"
# comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
fi
après les changements ci-dessus, sauvegardez le fichier et redémarrez le tomcat pour appliquer les changements.
dans votre fichier de rotation des journaux, utilisez rotate #
, où # est le nombre de journaux que vous voulez garder avant de les supprimer.
compte de rotation
Les fichiers journauxfont l'objet d'une rotation avant d'être supprimés ou posté à l'adresse spécifiée dans une directive mail. Si count est 0, les anciennes versions sont retirées plutôt que tournées.
Eh bien, je n'ai été entièrement satisfait d'aucune des réponses, même si celles affirmant que le logrotate
ne supporte pas cela (I. E. juste pour supprimer les fichiers tournant par une autre application ) scénario sont sûrement corrects (soulever une requête de fonctionnalité sur cet outil, peut-être?).
donc, je voudrais partager une approche alternative, je suis venu à. Contrairement à la " find /path/to/logs -mtime +7 -delete
"solution, celle-ci ne supprimera pas tous le vieux journaux après une période de temps spécifiée . Voici donc un exemple de commande de bash à une doublure qui ne laisse que N dernières logs sur le disque ( chaque fois qu'il est exécuté ):
for f in `ls -1r | grep -E "^catalina\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.log$" | tail -n +$((N+1))`; do rm $f; done
enfin, pour couvrir complètement le sujet, la dernière solution alternative est de ne pas faire tourner les fichiers journaux (E. G. utilisez rotatable=false
dans le cas de Tomcat - voir ses docs) et utilisez le logrotate
comme d'habitude, mais n'oubliez pas de l'utiliser avec le " copytruncate " option.
les Suggestions sont les bienvenues...
pour inclure une date dans le fichier tournant, vous pouvez probablement utiliser l'option 'dateext'.
$ cat logrotate.conf
/var/nginx/logs/access.log {
size 10k
copytruncate
dateext
rotate 10
compress
}
le fichier tournant doit être créé similaire à ci-dessous
root@nitpc:~# ls -lrt /var/nginx/logs/access.*
-rw-r--r-- 1 nginx root 5422 May 31 08:26 access.log
-rw-r--r-- 1 nginx root 466 May 31 08:26 access.log-20180531.gz
le seul inconvénient est que vous ne pourrez pas l'exécuter plus d'une fois par jour car le fichier aurait un nom défini pour cette date.
l'exemple ci-dessus est tiré de mon conteneur NGINX docker fonctionnant en k8s sur GC. La version de logrotate est 3.11.0.
Espère que ça aide!
mise à jour: De man pages https://linux.die.net/man/8/logrotate
dateformat chaîne de format
spécifie l'extension pour dateext en utilisant la notation similaire à la fonction strftime(3). Seuls les spécificateurs %Y %m %d et %s sont autorisés. La valeur par défaut est - %Y%m% D. Notez que même le caractère de séparation nom du journal de l'extension fait partie de la dateformat chaîne. L'horloge du système doit être réglée au-delà du 9 Septembre 2001 pour que %s fonctionne correctement. Notez que les données générées par ce format doivent être lexicalement sortables (c.-à-d., d'abord l'année, puis le mois, puis le jour). par exemple, 2001/12/01 est ok, mais 01/12/2001 ne l'est pas, puisque 01/11/2002 trierait plus bas pendant qu'il est plus tard). Ceci est dû au fait que lors de l'utilisation de l'option Rotation, logrotate trie tous les noms de fichiers ayant subi une rotation pour trouver les logfiles sont plus âgés et doit être supprimé.
aussi, vous pouvez ajouter des crons à la place du logrotate de hardcode.
1 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +30 -delete
2 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +1 -exec gzip -q {} \;
de cette façon, vous supprimerez les journaux de plus de 30 jours, et zip les journaux de plus de 1.