Logrotate: executa o script postrotate com o arquivo girado

1

Estou girando arquivos de log com logrotate com copytruncate e preciso executar um script com o novo nome de arquivo como argumento. Eu entendo que posso usar $1 dentro de postrotate , mas isso me dá o nome do arquivo girado - não aquele com a extensão de data.

Então basicamente eu tenho:

/var/log/myapp/server.log

Quando executo esta configuração de logrotate:

/var/log/myapp/server.log {
  copytruncate
  rotate 1008
  dateext
  dateformat -%s
  create 660 syslog syslog
  postrotate
    python3 /opt/myapp/test.py $1 > /dev/null
  endscript
}

Eu obtenho

/var/log/myapp/server.log <-- (now empty)
/var/log/myapp/server.log-1536844088

Posso executar um script em /var/log/myapp/server.log-1536844088 em postratate de alguma forma?

    
por Daniel 13.09.2018 / 15:25

2 respostas

1

Entendo que o logrotate passará o nome do arquivo de log para o script em postrotate ; você poderia usar o script e o primeiro parâmetro e o conhecimento de que o logrotate criou arquivos girados usando o formato -%s datet para gerar uma lista desses arquivos:

import sys
import fnmatch
import os

for file in os.listdir(os.path.dirname(sys.argv[1])):
        if fnmatch.fnmatch(file, os.path.basename(sys.argv[1]) + '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'):
                print(file)

Este é o meu primeiro script python, por isso pode não ser idiomático, mas mostra a ideia. A função fnmatch () usa uma glob que deve cobrir você por vários anos (até o final de novembro de 2286), quando 9.999.999.999 segundos serão transferidos para 10.000.000.000. Você poderia "alargar" a glob para que "just" exigisse "10 dígitos e depois qualquer coisa":

...
if fnmatch.fnmatch(file, os.path.basename(sys.argv[1]) + '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*'):
...
    
por 13.09.2018 / 15:57
1

Você poderia adicionar um sufixo ao seu dateformat -%s , como X , então você deve ser capaz de encontrar um arquivo único *X e depois de renomeá-lo sem o X, entregá-lo ao seu python:

dateformat -%sX
postrotate
  for f in *X; do mv "$f" "${f%X}" && test.py "${f%X}"; done
endscript

Eu usei um loop for para torná-lo um pouco menos frágil. Pode ser necessário verificar se esta passagem passa pelo seu /bin/sh corretamente.

    
por 13.09.2018 / 21:49