Comment puis-je limiter la taille d'un fichier journal écrit avec >>
à 200 Mo?
$ run_program >> myprogram.log
Si votre application (c.-à-d. run_program
) Ne prend pas en charge la limitation de la taille du fichier journal, vous pouvez vérifier la taille du fichier périodiquement dans une boucle avec une application ou un script externe.
Vous pouvez également utiliser logrotate(8)
pour faire pivoter vos journaux, il dispose de size
paramètre que vous pouvez utiliser pour votre objectif:
Avec cela, le fichier journal est tourné lorsque la taille spécifiée est atteinte. La taille peut être spécifiée dans les octets (par défaut), les kilo-octets (zek) ou les mégaoctets (Sizem).
Si votre programme n'a pas besoin d'écrire d'autres fichiers qui seraient plus grands que cette limite, vous pouvez informer le noyau de cette limite en utilisant ulimit
. Avant d'exécuter votre commande, exécutez ceci pour configurer une limite de taille de fichier de 200 Mo pour toutes les procédures exécutées dans votre session de shell actuelle:
ulimit -f $((200*1024))
Cela protégera votre système, mais cela pourrait être jugé pour le programme rédaction du fichier. Comme Eyazici suggère , envisagez de configurer logrotate
_ pour éliminer les fichiers journaux une fois qu'ils atteignent une certaine taille ou une certaine taille. Vous pouvez supprimer les anciennes données ou l'archiver pendant une période de temps dans une série de fichiers compressés.
Vous pouvez tronquer la sortie avec head
:
size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
Vous pouvez créer une nouvelle image de système de fichiers, monter à l'aide d'un périphérique de boucle et placer le fichier journal sur ce système de fichiers:
dd if=/dev/zero of=./200mb.img bs=1024 count=200000 # create new empty 200MB file
mkfs.ext2 200mb.img # or ext3, or whatever fits your needs
mkdir logs
Sudo mount -t ext2 -o loop 200mb.img logs # only root can do '-o loop' by default
run_program >>logs/myprogram.log
Vous pouvez également utiliser tmpfs
au lieu d'un fichier, si vous avez suffisamment de mémoire.
Dans le paquet Apache2-utils
est un utilitaire actuel appelé rotatelogs
, il peut être utile pour vous.
Synopsis:
rotatelogs [-L] [-L Linkname ] [-P Program ] [-f] [-t] [-v] [-v] [-e] [-c] [-n Nombre de fichiers ] logfile RotationTime | Filedize (B | K | M | g) [ Décalage ]
Exemple:
your_program | rotatelogs -n 5 /var/log/logfile 1M
Manuel complet Vous pouvez lire sur ce lien .
Je suis certaine que l'affiche originale a trouvé une solution. Voici un autre pour d'autres personnes qui peuvent lire ce fil ...
LIFTAIL limite la taille d'un programme de programme et conserve les derniers 200 Mo de sortie avec la commande suivante:
$ run_program | curtail -s 200M myprogram.log
Remarque: Je suis le responsable de ce qui précède le repo ci-dessus. Il suffit de partager la solution ...
Le script suivant devrait faire le travail.
LOG_SIZE=500000
NUM_SEGM=2
while getopts "s:n:" opt; do
case "$opt" in
s)
LOG_SIZE=$OPTARG
;;
n)
NUM_SEGM=$OPTARG
;;
esac
done
shift $((OPTIND-1))
if [ $# == 0 -o -z "$1" ]; then
echo "missing output file argument"
exit 1
fi
OUT_FILE=$1
shift
NUM=1
while :; do
dd bs=10 count=$(($LOG_SIZE/10)) >> $OUT_FILE 2>/dev/null
SZ=`stat -c%s $OUT_FILE`
if [ $SZ -eq 0 ]; then
rm $OUT_FILE
break
fi
echo -e "\nLog portion finished" >> $OUT_FILE
mv $OUT_FILE $OUT_FILE.n$NUM
NUM=$(($NUM + 1))
[ $NUM -gt $NUM_SEGM ] && NUM=1
done
Il a quelques coupes courtes évidentes, mais dans l'ensemble, il fait ce que vous avez demandé. Il divisera la bille en morceaux de taille limitée et la quantité de morceaux est également limitée. Tous peuvent être spécifiés via les arguments de ligne de commande. Le fichier journal est également spécifié via la ligne de commande.
Notez une petite gotcha si vous l'utilisez avec le démon qui fourche en arrière-plan. L'utilisation d'un tuyau empêchera le démon d'aller en arrière-plan. Dans ce cas, il existe une syntaxe (probablement spécifique à Bash) d'éviter le problème:
my_daemon | ( logger.sh /var/log/my_log.log <&0 & )
Noter la <&0
, tout en apparemment redondant, cela ne fonctionnera pas sans cela.
Puisqu'il s'agit de texte, j'écrirais un script dans votre langue préférée et la pipe à cela. Demandez-lui de gérer les fichiers I/O (ou conservez-le tout en mémoire, puis de la jeter sur SIGHUP
ou similaire). Pour cela, au lieu de 200 Mo, je penserais à un nombre "raisonnable" de lignes à garder une trace de.