Mantenha o tamanho do arquivo de log fixo sem a rotação do log

13

Existe alguma maneira de manter o tamanho do arquivo de log fixo, sem rotacioná-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 fixado, o texto será adicionado em 'cauda' e a parte mais antiga do texto será exibida para manter o tamanho do arquivo 1 MB .

uray
fonte
use logrotate, entãorm -f *.tar.gz.*
Marco Ceppi 12/08
1
Existe algum motivo específico para você não querer girar o log ou usar o logrotate? Exatamente o que você quer que aconteça? Arquivar o log antigo na 1M e iniciar um novo? O início da sua pergunta não é totalmente compatível com o final.
David Thornley
o que poped a média?
Tshepang

Respostas:

4

Você pode escrever um pequeno script bash para fazer isso. Basta ajustar o arquivo para uma determinada contagem de bytes usando tail -ce substituindo 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.
jjclarkson
fonte
3
Estou relativamente certo de que, uma vez que você "sobrescreva o arquivo", o log não será retomado automaticamente no novo arquivo.
Stephen Jazdzewski
0

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

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

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

Stephen Jazdzewski
fonte
0

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

No entanto, observe que, se nada estiver LENDO neste arquivo, o processo do syslog poderá ficar bloqueado e interromperá a gravação em TODOS os seus arquivos de log. Não tenho certeza se esse comportamento foi alterado nas versões mais recentes do Ubuntu / CentOS.

Um exemplo aqui

Para outro exemplo, tente algo como isto.

Faça 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 catacima.

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 tudo, exceto o spam de firewall, poderá fazer algo assim:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
Stefan Lasiewski
fonte
0

Aqui está a minha segunda resposta. Isso é muito hackish.

Use watch (1) para executar repetidamente tail --bytes=1024(os últimos 1024 bytes do arquivo de log, obrigado a @jjclarkson para essa resposta).

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

E então veja o arquivo com:

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

A diferença entre watche um loop while é que watchapenas 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, acho que você poderia colocar um testloop while para que a cauda só seja executada se / var / log / messages for atualizada, mas não vou descobrir isso agora.

Stefan Lasiewski
fonte
0
 * remoção - corta as partes superiores de uma lista de arquivos descritos no
 * arquivo / etc / default / ameixa. Projetado para ser executado periodicamente
 * do cron, a ideia é reduzir automaticamente o log
 * arquivos que crescem para sempre. Este arquivo contém uma lista de
 * arquivos (nome do caminho completo) e o número de blocos que
 * deve ser mantido. Para manter um pouco de sanidade, a ameixa será
 * recorte o arquivo após a próxima nova linha. O arquivo
 * / etc / default / ameixa deve ser algo como:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 * A entrada crontab no infoswx for ameixa se parece com:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Compile com: cc -O -o podar prune.c
 *
 * As definições a seguir podem ser ajustadas para se adequar ao seu gosto
 * e o tamanho do bloco do sistema.
 *
 * Ray Davis infoswx! Abelhas 25/09/85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=pt_BR&ie=UTF-8&q=prune+log+file&pli=1

Muitos daemons (a maioria? Todos?) Reabrirão seus arquivos de log se receberem um sinal HUP (por exemplo, pela mesma tarefa cron que executa remoção)

RedGrittyBrick
fonte
0

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

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

run_program | curtail -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

Dave Wolaver
fonte