Como limitar o tamanho do arquivo de log usando

20

Como posso limitar o tamanho de um arquivo de log gravado com >> a 200MB?

$ run_program >> myprogram.log
    
por david 22.07.2011 / 11:15

8 respostas

9

Se o seu aplicativo (por exemplo, run_program ) não oferecer suporte à limitação do tamanho do arquivo de registro, você poderá verificar o tamanho do arquivo periodicamente em um loop com um aplicativo ou script externo.

Você também pode usar logrotate(8) para rotacionar seus registros, pois ele tem o parâmetro size que você pode use para o seu propósito:

With this, the log file is rotated when the specified size is reached. Size may be specified in bytes (default), kilobytes (sizek), or megabytes (sizem).

    
por 22.07.2011 / 11:25
12

Se o seu programa não precisar gravar nenhum outro arquivo que seja maior que esse limite, você poderá informar ao kernel esse limite usando ulimit . Antes de executar seu comando, execute isso para configurar um limite de tamanho de arquivo de 200 MB para todo o processo executado na sessão atual do shell:

ulimit -f $((200*1024))

Isso protegerá o seu sistema, mas pode ser um empecilho para o programa que está gravando o arquivo. Como eyazici sugere , considere configurar logrotate para remover arquivos de log quando eles atingirem um determinado tamanho ou idade. Você pode descartar dados antigos ou arquivá-los por um período de tempo em uma série de arquivos compactados.

    
por 22.07.2011 / 11:23
6

Você pode criar uma nova imagem do sistema de arquivos, montá-la usando o dispositivo de loop e colocar o arquivo de log nesse sistema de arquivos:

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

Você também pode usar tmpfs em vez de um arquivo, se tiver memória suficiente.

    
por 22.07.2011 / 15:36
6

Você pode truncar a saída com head :

size=$((200*1024*1024-$(stat -c %s myprogram.log)))
run_program | head -c ${size} >> myprogram.log
    
por 22.07.2011 / 12:08
3

No pacote apache2-utils está presente, o utilitário chamado rotatelogs , pode ser útil para você.

Sinopse:

rotatelogs [-l] [-L linkname ] [-p programa ] [-f] [-t] [-v] [-e] [- c] [-n número-de-arquivos ] logfile rotationtime | tamanho do arquivo (B | K | M | G) [ deslocamento ]

Exemplo:

your_program | rotatelogs -n 5 /var/log/logfile 1M

Manual completo você pode ler em este link .

    
por 01.07.2017 / 15:57
0

Como é texto, eu escreveria um script em seu idioma favorito e passaria para ele. Faça com que ele manipule o arquivo I / O (ou guarde tudo na memória e depois copie em SIGHUP ou similar). Para isso, em vez de 200MB, eu pensaria em um número "razoável" de linhas para acompanhar.

    
por 23.07.2011 / 15:13
0

O script a seguir deve fazer o trabalho.

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

Tem alguns atalhos óbvios, mas no geral faz o que você pediu. Ele dividirá o log em pedaços de tamanho limitado, e a quantidade de pedaços também é limitada. Tudo pode ser especificado através dos argumentos da linha de comando. O arquivo de log é também especificado através da linha de comando.

Observe uma pequena pegadinha se você a usar com o daemon que se bifurca no fundo. Usando um tubo irá impedir o daemon de ir para o fundo. Neste caso, é uma sintaxe (provavelmente bash-specific) para evitar o problema:

my_daemon | ( logger.sh /var/log/my_log.log <&0 & )

Observe que o <&0 , embora aparentemente redundante, não funcionará sem isso.

    
por 27.11.2014 / 15:41
0

Tenho certeza de que o pôster original encontrou uma solução. Aqui está outro para os outros que podem ler este tópico ...

A restrição restringe o tamanho da saída de um programa e preserva os últimos 200MB de saída com o seguinte comando:

$ run_program | curtail -s 200M myprogram.log

Referências

NOTA: eu sou o mantenedor do repositório acima. Apenas compartilhando a solução ...

    
por 06.11.2018 / 15:51