manipula um grande número do mesmo log usando cron ou logrotate

1

Temos um aplicativo implantado em um servidor, que, em alguns cenários, gera alguns registros no formato abaixo.

process_name.hostname.common_text.log.{error/info/warning}.date.time 

Agora, devido a esse formato, não há um log, mas vários desses logs com o mesmo process_name.hostname.common_text. {error / info / warning} parte, mas com resto das partes diferentes, devido a diferença de data e hora. Mas no que diz respeito ao logrotate, ele trata todos esses logs individuais e ele retém 1 cópia de cada log se eu disser

rotate 1

no logrotate conf.

Mas, no que me diz respeito, esses são todos os mesmos logs e não quero manter nenhum log diferente do log 1 recente de cada categoria ( error / info / warning ). Como eu iria sobre isso?

Eu pensei em escrever um script que será executado semanalmente no cron. E esse script verificará o arquivo recente de cada categoria ( error / info / warning ) usando timestamp ( ls -ltr ) e, em seguida, excluir resto de tais logs. Mas, novamente, está ficando muito complicado se eu tentar colocá-lo no script.

Estou procurando algo assim.

ls -ltr |grep process_name.hostname.common_text.log.error |head -n -1
ls -ltr |grep process_name.hostname.common_text.log.info |head -n -1
ls -ltr |grep process_name.hostname.common_text.log.warning |head -n -1

Os 3 comandos acima retornarão os nomes de todos os registros process_name.hostname.common_text.log. {error / info / warning} .date.time , exceto o recente.

1) É possível passar a saída de cada um dos comandos acima para exec ou xargs na mesma linha, para que eu possa rodar rm -rf contra ele?

2) qual é a melhor maneira de fazer isso? pq, o process_name novamente tem 2 nomes diferentes, então, eu terei que executar 6 comandos ou talvez mais que isso.

3) Em vez de digitar três vezes, uma vez por erro, e uma vez por informação, e uma vez por aviso, existe alguma maneira que eu possa fazer para todos os 3 em uma única linha?

    
por Being Gokul 16.12.2015 / 19:17

1 resposta

2

Se você usa -1 em vez de -l para ls, você obtém apenas os nomes dos arquivos e pode passá-los diretamente para rm. Eu usaria algo assim:

rm $(ls -1tr process_name.hostname.common_text.log.error* | head -n -1) \
$(ls -1tr process_name.hostname.common_text.log.info* | head -n -1) \
$(ls -1tr process_name.hostname.common_text.log.warning* | head -n -1)
    
por 16.12.2015 / 19:40