LogRotate use regex para nome do arquivo

3

Eu tenho uma classe de criação de log personalizada que cria um log para cada instância do processo e adiciona um ID exclusivo ao nome do arquivo de log, por exemplo:

  • process.1234.log
  • process.1235.log

Também posso adicionar um carimbo de data / hora, por exemplo:

  • process.1234.03012012.log
  • process.1235.03012012.log

O LogRotate tem a capacidade de usar um regex para que eu possa arquivar meus arquivos de log por data e / ou identificação do processo?

    
por Phill Pafford 01.03.2012 / 16:47

1 resposta

5

Não sei se versões posteriores funcionam, mas depois de pesquisar mais descobri que os curingas de shell são suportados. Tanto * (corresponde a vários caracteres) como ? (corresponde a um único caractere) podem ser combinados para corresponder a arquivos específicos.

Como exemplo, aqui estão os padrões que correspondem ao seu caso de uso, juntamente com o restante de um arquivo, que pode ser encontrado em /etc/logrotate.d/process

/path/to/my/logfiles/process.????.????????.log
/path/to/my/logfiles/process.????.log
{

    # Look for previously matched log files and rotate daily if found
    daily

    # use date as a suffix of the rotated file
    dateext

    # Compress log file, optional if the files are small enough
    compress

    # Allow for a log file pattern to NOT match in order to support both
    # filename formats
    missingok

    # Do not create replacement log files, the application will do that
    nocreate

    # Keep 30 days worth of rotated logs
    maxage 30
}

No entanto, se você pretendia que process fosse um marcador para um ID de processo real, acredito que você pode usar um curinga no lugar do número de identificação do processo, como:

/path/to/my/logfiles/*.????.????????.log
/path/to/my/logfiles/*.????.log
{
    ...
}

Espero que isso ajude. Eu também fui procurar uma abordagem de regex que funcionasse e finalmente decidi sobre o uso de curingas de shell em vez do que eu achava que eram viáveis, mas com soluções mais complexas.

Um exemplo:

Enquanto pesquisava uma solução de regex, encontrei uma postagem no blog intitulada " Excluindo arquivos de logrotate globbing matches ", que forneceu isso solução:

/var/log/upstart/*.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    nocreate
    nosharedscripts
    prerotate
        bash -c "[[ ! $1 =~ testprogram ]]"
    endscript
}

Acabei de retirar dois itens desse exemplo e modifiquei o jogo um pouco. Na minha situação eu queria rodar todos os arquivos em um diretório exceto para alguns arquivos de entrada que possuem uma extensão .inp .

Isso é o que eu criei:

# Force the prerotate "script" below to be run on each individual file
# in order to verify that it isn't an unprocessed input file
nosharedscripts

# Skip rotating any unprocessed input files (*.inp extension)
prerotate
   bash -c "[[ ! $1 =~ \.inp$ ]]"
endscript

De acordo com logrotate -d /etc/logrotate.d/myfilename , parece funcionar. No entanto, como mencionei, optei pela abordagem de curingas de shell, pois parecia mais fácil para alguém que vinha atrás de mim manter.

    
por 31.08.2015 / 05:49