comment implémenter logrotate dans un script shell

12

test.sh

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Je veux implémenter logrotate pour contrôler la taille du fichier journal, alors comment implémenter logrotate, si la situation est comme ci-dessus?

Veerendra
la source

Réponses:

11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

J'ai supprimé le "&" car cela peut provoquer un problème.

curieuse
la source
@Veerendra nous devons mettre la logique de rouler les journaux à l'intérieur de la boucle pendant que vous exécutez une boucle infinie ..
curieux
@Veerendra nous mon message précédent avait une erreur .. "mv" ne créera pas un nouveau fichier mais vous pouvez changer le script selon vos besoins.
curieux
Donc, au lieu de cpet mv, puis-je supprimer le fichier journal, puis-je créer un nouveau fichier journal avec le même nom? (Mon exigence est, si le fichier journal est atteint une certaine limite, je veux supprimer ce fichier journal, puis créer un nouveau fichier )
Veerendra
Vous devez utiliser >>pour ajouter au fichier journal, >le remplacera encore et encore.
alcik
si j'utilise >, j'obtiens tail: test.log: file truncated Hello World!.... Si j'utilise >>, j'obtiens un message de journal correct, mais la taille du fichier augmente. Aucune condition vérifiant la condition ... ;-(
Veerendra
24

que diriez-vous d'utiliser savelog?

Il est disponible dans Debian et RH et à peu près toutes les autres distributions Linux que je connais. C'est un script shell / bin / sh, donc devrait également fonctionner sur tout autre Unix.

par exemple avant d'écrire quoi que ce soit à test.logexécuter savelog -n -c 7 test.log. Cela conservera les 7 versions non vides les plus récentes de test.log. Par défaut, il compressera les journaux tournés (mais cela peut être désactivé avec -l).

Si vous en avez besoin, vous pouvez vérifier la taille de test.loget uniquement savelogsi elle dépasse une certaine taille.

cas
la source
Une idée du paquet qui contient cela sur AWS Linux (proche de CentOS, je crois)? L'installation par défaut n'a pas de journal de sauvegarde. Je ne peux pas le trouver à partir de miam non plus en utilisant les
dépôts
savelog introuvable dans RHEL 5. Savez-vous dans quel repo il doit être?
Felipe Alvarez
aucune idée de l'empaquetage centos ou rhel5, mais vous pouvez trouver le /usr/bin/savelogscript shell sur sources.debian.net/src/debianutils/4.7
cas
2
Je n'ai trouvé savelogaucune de mes boîtes RHEL / CentOS 5/6, donc je viens de la télécharger ad hoc, et cela semble fonctionner très bien pour mes besoins.
Dale Anderson
Un inconvénient savelogest qu'il renomme le fichier mais prend ensuite beaucoup de temps pour compresser les anciens avant de terminer. Pendant ce temps, le journal .0 contient déjà les entrées du jour suivant. Idéalement, le temps entre la rotation du journal et la signalisation du processus de réouverture du journal devrait être minimal. Je désactive savelogla fonction de compression de pour cette raison.
rustyx
2

J'ai écrit un logrotee ce week-end. Je ne le ferais probablement pas si j'ai lu la grande réponse demultilog @ JdeBP .

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

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

Il reste encore beaucoup à faire et à tester.

Victor Sergienko
la source
0

Comme je ne peux pas encore ajouter de commentaires à la réponse acceptée , un indice BusyBox , où dun'a pas de -bdrapeau:

du /var/log/file | tr -s '\t' ' ' | cut -d' ' -f1
lnksz
la source