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 .
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.
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
* 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
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)
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.
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
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.