web-development-kb-pt.site

Mantenha o tamanho do arquivo de registro fixo sem logrotate

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 para 1 MB, depois que o tamanho do arquivo aumentar além desse limite, ele será automaticamente preso, o texto é adicionado na 'cauda' e a parte mais antiga do texto é removida para manter o tamanho do arquivo de 1 MB .

13
uray

Você pode escrever um pequeno script bash para fazer isso. Basta limitar o arquivo a uma determinada contagem de bytes usando tail -c e sobrescrever 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.
4
jjclarkson

Tenho certeza de que o autor da postagem original encontrou uma solução após 8 anos. Aqui está outro para outras pessoas que podem ler este tópico ...

curtail limita 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

0
Dave Wolaver
 * Prune - corta o topo de uma lista de arquivos descritos no arquivo 
 */Etc/default/Prune. Projetado para ser executado periodicamente 
 * A partir do cron, a ideia é encurtar automaticamente os arquivos de log 
 * Que crescem para sempre. Este arquivo contém uma lista de 
 * Arquivos (caminho completo) e o número de blocos que 
 * Devem ser retidos. Para manter alguma sanidade, Prune irá 
 * Cortar o arquivo após a próxima nova linha. O arquivo 
 */Etc/default/Prune deve ser semelhante a: 
 * 
 */Usr/adm/aculog 10 
 */Usr/adm/leo .log 5 
 */usr/adm/messages 200 
 */usr/adm/sup_log 5 
 * 
 * A entrada crontab no infoswx para Prune parece : 
 * 
 * 0 5 * * */etc/Prune> /usr/adm/Prune.log 2> & 1 
 * 
 * Compilar com: cc -O -o Prune prune.c 
 * 
 * As seguintes definições podem ser ajustadas para se adequar ao seu gosto 
 * E ao tamanho do bloco do seu sistema. 
 * 
 * Ray Davis infoswx! Abelhas 25/09/85 

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

Muitos (a maioria? Todos?) Daemons irão reabrir seus arquivos de log se for enviado um sinal HUP (por exemplo, pelo mesmo cron job que executa o Prune)

0
RedGrittyBrick

Sua única solução pode ser escrever seu próprio sistema de arquivos de espaço de 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 para contribuir, ofereça uma publicidade de projeto ou $$$ ou ambos, para adicioná-lo para você.

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

0
Stephen Jazdzewski

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

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

Um exemplo aqui

Para outro exemplo, tente algo assim.

Faça o seu FIFO:

Sudo mkfifo /var/log/everything.fifo

Adicione-o a (r) syslog.conf e reinicie o syslog:

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

Em seguida, visualize o FIFO de 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 se importa em manter os dados por mais tempo. Por exemplo, se você deseja apenas ver tudo, exceto o spam do firewall, você pode fazer algo assim:

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

Aqui está minha segunda resposta. Este é um hack muito bonito.

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

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

Em seguida, visualize o arquivo com:

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

A diferença entre watch e um loop while é que watch só atualizará /tmp/messages.watch se houver mudanças 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 test no loop while para que o final só seja executado se/var/log/messages for atualizado, mas não vou descobrir isso agora.

0
Stefan Lasiewski