Mantenha o tamanho do arquivo de log fixo sem logrotate

Mantenha o tamanho do arquivo de log fixo sem logrotate

Existe alguma maneira de manter fixo o tamanho do arquivo de log 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, após o tamanho do arquivo aumentar além desse limite, ele será automaticamente fixado, o texto será adicionado na 'cauda' e a parte mais antiga do texto será exibida para manter o tamanho do arquivo em 1 MB. .

Responder1

Você poderia escrever um pequeno script bash para fazer isso. Basta seguir o arquivo até uma determinada contagem de bytes usando tail -ce 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.

Responder2

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

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

programa_executado | restringir -s 200M meuprograma.log

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

Responder3

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

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

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

Responder4

Aqui está minha segunda resposta. Isso é bastante hackeado.

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

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

E então visualize o arquivo com:

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

A diferença entre watche um loop while é que watchsó 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 tail só seja executado se /var/log/messages for atualizado, mas não vou descobrir isso agora.

informação relacionada