Manter tamanho do arquivo de log corrigido sem logrotate

12

Existe alguma maneira de manter o tamanho do arquivo de log fixo sem girá-lo por um novo arquivo vazio e excluir (ou arquivar) o arquivo antigo. Por exemplo, se eu definir o tamanho máximo do arquivo de log como 1 MB, depois que o tamanho do arquivo aumentar além desse limite, ele será automaticamente bloqueado, o texto será adicionado à parte anterior e a parte mais antiga do texto será exibida para manter o tamanho do arquivo. .

    
por uray 12.08.2010 / 23:11

6 respostas

3

Você pode escrever um pequeno script bash para fazer isso. Apenas siga o arquivo para uma determinada contagem de bytes usando tail -c e sobrescreva o arquivo.

de man tail :

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a '+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
    
por 13.08.2010 / 05:57
0

Sua única solução pode ser escrever seu próprio sistema de arquivos do espaço de usuário ou contribuir com um existente. Veja a lista parcial em Filesystem in Userspace

Se você não tiver as habilidades para contribuir, ofereça uma publicidade de projeto, $$$ ou ambos, para adicioná-lo a você.

Eu gostaria de ter tempo para fazer isso, eu sempre quis algo exatamente assim.

    
por 13.08.2010 / 15:26
0

Você pode fazer algo semelhante usando um FIFO, que é como um arquivo de tamanho zero-byte.

No entanto, observe que, se nada for READING deste arquivo, o processo do syslog poderá ficar bloqueado e parará de gravar em TODOS os seus arquivos de log. Não tenho certeza se esse comportamento foi alterado com versões mais recentes do Ubuntu / CentOS.

Um exemplo aqui

Por outro exemplo, tente algo assim.

Crie seu FIFO:

sudo mkfifo /var/log/everything.fifo

E adicione isso ao (r) syslog.conf e reinicie o syslog:

*.*     |/var/log/everything.fifo

Em seguida, visualize o FIFO em uma janela:

cat /var/log/everything.fifo

E em outra janela, envie algumas coisas para o syslog:

logger Test1
logger Test2
logger Test3

Você deve ver as linhas "Teste *" na saída de cat acima.

Esse recurso pode ser ótimo para depuração, especialmente se você não quiser manter os dados por mais tempo. Por exemplo, se você quiser ver apenas tudo, exceto o spam de firewall, poderá fazer algo assim:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
    
por 13.08.2010 / 17:20
0

Aqui está minha segunda resposta. Isso é bem legal.

Use watch (1) para executar repetidamente tail --bytes=1024 (os últimos 1024 bytes do logfile, graças a @jjclarkson por essa resposta).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

E veja o arquivo com:

less --raw-control-chars /tmp/messages.watch

A diferença entre watch e um loop while é que watch somente atualizará /tmp/messages.watch se houver alterações em / var / log / messages.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

E bem, eu acho que você poderia colocar um test no loop while para que o tail seja executado apenas se / var / log / messages fosse atualizado, mas eu não vou descobrir isso agora.

    
por 13.08.2010 / 19:46
0
 *      prune - clips off the tops of a list of files described in the
 *              file /etc/default/prune. Designed to be run periodically
 *              from cron, the idea is to automatically shorten log
 *              files that grow forever. This file contains a list of
 *              files (full pathname), and the number of blocks that
 *              should be retained.  To retain some sanity, prune will
 *              clip the file after the next newline. The file
 *              /etc/default/prune should look something like:
 *
 *                      /usr/adm/aculog         10
 *                      /usr/adm/leo.log        5
 *                      /usr/adm/messages       200
 *                      /usr/adm/sup_log        5
 *
 *              The crontab entry on infoswx for prune looks like:
 *
 *                      0 5 * * * /etc/prune >/usr/adm/prune.log 2>&1
 *
 *              Compile with:  cc -O -o prune prune.c
 *
 *              The following defines may be adjusted to suit your taste
 *              and your system block size.
 *
 *      Ray Davis  infoswx!bees  09/25/85

link

Muitos (mais? todos?) daemons reabrirão seus arquivos de log se um sinal HUP for enviado (por exemplo, pelo mesmo trabalho cron que executa a remoção)

    
por 20.05.2011 / 17:51
0

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

A restrição

limita o tamanho da saída de um programa e preserva os últimos 200MB de saída com o seguinte comando:

run_program | reduzir -s 200M myprogram.log

link

    
por 06.11.2018 / 15:56