Evitando que dateext do logrotate substitua arquivos

2

Estou trabalhando com um sistema no qual gostaria de usar a função dateext do logrotate (ou de alguma outra forma) para adicionar a data a um arquivo de log quando ele é rotacionado. No entanto, neste sistema, é importante que não haja registro em log e o dateext sobrescreverá quaisquer arquivos existentes (o que acontecerá se o logrotate for chamado duas vezes por dia).

Existe uma maneira confiável de impedir que o dateext sobrescreva arquivos existentes, mas faça outro arquivo ?. É aceitável que não ocorra rotação ou que seja criado um arquivo com um nome menos previsível (data com um número extra, ou a hora ou algo assim).

    
por Thirler 06.05.2011 / 11:09

2 respostas

3

dateext suporta o especificador de formato %s - o tempo de época do Unix em segundos.

Se você definir o formato de data como .%Y-%m-%d.%s , ficará assim:

logfilename.2012-12-11.13572638495

Isso muda a cada segundo, então as chances de dois arquivos idênticos são muito remotas.

    
por 11.12.2012 / 12:06
0

Você poderia usar o prerotate / finscript para ter certeza de que não há nenhum arquivo com o nome que você está prestes a usar, mas se você estiver preocupado com rotações acontecendo a qualquer momento, isso pode ser complicado. O pior caso é que você tenha duas rotações do mesmo arquivo sendo executadas ao mesmo tempo (2ª iniciado antes do 1º concluído) e, se ambos determinarem que não há conflito de nomes, um substituirá o outro.

Uma abordagem mais fácil pode estar alterando o nome do arquivo girado para incluir uma data mais exata, por exemplo, incluindo nanossegundos no timestamp. Isso deve tornar muito improvável que os nomes entrem em conflito. Se você quiser ter certeza de que não há conflito de nome, use mktemp, mas você receberá nomes "feios". A lógica de tal mudança de nome deve ir para pré-rotear a seção | postrotate / endscript da configuração logrotate.

    
por 06.05.2011 / 11:36