web-dev-qa-db-fra.com

Comment limiter la taille du fichier journal en utilisant >>

Comment puis-je limiter la taille d'un fichier journal écrit avec >> à 200 Mo?

$ run_program >> myprogram.log
26
david

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).

10
Emre Yazici

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.

12
Caleb

Vous pouvez tronquer la sortie avec head:

size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
6
tuxce

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.

5
alex

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 .

5
PRIHLOP

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

Les références

Remarque: Je suis le responsable de ce qui précède le repo ci-dessus. Il suffit de partager la solution ...

1
Dave Wolaver

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.

0
stsp

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.

0
Aaron D. Marasco