Pipe para o arquivo de log com a data de hoje contida no nome do arquivo

1

Aqui está uma linha de comando imaginária onde "pushtolog" é um utilitário que aceita linhas de texto de um pipe e as registra em um arquivo com um nome de arquivo que incorpora a data de hoje:

tail -F mylatestlogfile.log | grep "ERROR" | pushtolog -d /tmp/myerrors/ -f yyyy-MM-dd -r errors -e log

Quando executado em 17 de fevereiro de 2017, a saída será registrada no arquivo:

/tmp/myerrors/errors.2017-02-17.log

À meia-noite do dia 18 de fevereiro de 2017, esse arquivo seria fechado e qualquer saída posterior seria registrada no arquivo:

/tmp/myerrors/errors.2017-02-18.log

A alternância aconteceria automaticamente. O desempenho é bastante irrelevante devido a um baixo volume de linhas de log relevantes, portanto, no pior caso, seria bom para o utilitário verificar a data toda vez que ele escrevesse uma linha de log.

O servidor GNU / Linux em que isso será executado tem um conjunto mínimo de utilitários instalados. Tem o Python 2 instalado e eu mesmo posso escrever um utilitário. Antes de dar esse passo, é sensato perguntar se existe uma ferramenta que já funcionará ou se há uma alternativa idiomática para fazer isso.

logrotate está disponível, mas eu prefiro evitar fazer uma rotação a cada vez, porque parece "mais simples" ter tudo feito na etapa.

O multilog parece enfrentar um problema semelhante de alteração do arquivo de log de destino, mas quando o arquivo de log está cheio do que quando a data muda. Eu não tenho acesso root e não posso executar um gerenciador de pacotes para conseguir isso; Eu não investiguei se eu poderia construí-lo a partir do código-fonte usando as permissões que tenho. Se é claramente a ferramenta para o trabalho, então eu vou perseguir essa opção.

    
por David B 17.02.2017 / 12:06

2 respostas

0

Eu usei a habilidade do Awk para avaliar a construção de um nome de arquivo incluindo a data de hoje em cada avaliação (para cada linha que orignates do log) e acabei com:

tail -F mylatestlogfile.log | grep "ERROR" | awk '{print >> "/tmp/myerrors/errors." strftime("%Y-%m-%d") ".log"}'
    
por 20.02.2017 / 13:18
0

Você pode tentar o seguinte código, como um script bash :

#!/bin/bash

while getopts "d:f:e:r:a" opt; do
    case $opt in
        f) FDATE=$(awk -v fmt="$OPTARG" '{print strftime(fmt)}'<<<DUMMY) ;;
        r) PREFIX="$OPTARG" ;;
        e) SUFFIX="$OPTARG" ;;
        d) DEST="$OPTARG" ;;
        a) APPEND=true ;;
    esac
done
if [ ! $APPEND ]
then
    > ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}
fi
while read line; do echo ${line} >> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}; done

Você também pode cercar o corpo do script com:

pushtolog()
{
...
}

e fonte.

Também incluí um sinalizador para poder anexar aos dados existentes. Deve ser fácil alterar o script para padrão para acrescentar e sobrescrever quando uma opção específica é definida.

Nota 1 : o formato de data deve estar em conformidade com strftime (consulte man strftime ), por isso, use "%Y-%m-%d"

Nota 2 : essa variável APPEND não é na verdade um booleano, imagino que sim. Talvez seja mais legal usar APPEND="true" e if [ -z "$APPEND" ]

    
por 17.02.2017 / 13:58