Registrando em um arquivo, prefixando um timestamp para cada linha (Debian)

4

Estou tentando registrar a saída de alguns scripts de shell meus para um arquivo, e quero que o registro de data e hora seja precedido de cada linha. Pelo que eu entendi, é para isso que o logger(1) serve, mas eu não quero que a saída vá para / var / log / messages, e não consigo ver que isso é possível usando o logger. Eu estou usando o Debian pelo caminho.

Qual é a melhor maneira de fazer isso?

—Oliver

    
por obeattie 18.01.2011 / 12:24

4 respostas

5
A função do logger é, na verdade, desviar mensagens para o syslog; as configurações padrão irão pré-anexar um registro de data e hora e gravar os logs em / var / log / messages, mas isso não significa que o propósito do registrador é prefixar um timestamp.

Uma maneira de lidar com isso seria modificar as configurações do syslog, de modo que as mensagens roteadas via registrador acessem um arquivo especial - use o sinalizador "-p" para o logger estipular um par facility.priority (talvez um dos usuários [1..7] instalações), e configure seu syslogd para registrar esse recurso em um arquivo especial.

Como alternativa, você pode criar uma função de shell rápida para simplesmente preceder o timestamp:

Bodacious:~ james$ timestamp () {
> f='date'
> echo $f $*
> }
You have new mail in /var/mail/james
Bodacious:~ james$ timestamp a line of logs
Tue 18 Jan 2011 22:40:24 EST a line of logs
Bodacious:~ james$ 

No meu sistema, isso resultará no shell forking / bin / date uma vez por linha de saída. Isso é ineficiente, mas provavelmente aceitável em pequenas escalas.

    
por 18.01.2011 / 12:42
4

Eu precisava de algo assim, e o google me trouxe até aqui. Usar algo parecido com o syslog é definitivamente um exagero por apenas tentar avaliar algo, e a impressão a cada segundo é muito inconveniente.

Aqui está um one-liner que parece funcionar bem:

cmd | { while read R; do echo "$(date +%s) $R"; done }

e uma variante que imprime o tempo necessário para produzir cada linha:

cmd | { T=$(date +%s); while read R; do T2=$(date +%s); echo "$((T2-T)) $R"; T=$T2; done }

(Isso está usando segundos, provavelmente não é muito difícil lançar% N lá, mas, nesse nível, uma solução shell provavelmente não é a ferramenta certa, de qualquer maneira.)

    
por 08.02.2012 / 03:29
0

Você pode usar -t para marcar cada linha e, em seguida, fazer com que seu servidor syslog seja filtrado para um arquivo diferente com base nessa tag.

(Editado para remover referências incorretas ao -f flag)

    
por 18.01.2011 / 14:04
0

Usando a resposta do Comando para preceder a string a cada linha? , Achei esta a solução mais fácil:

cmd | sed "s/^/'date +'%a %b %d %k:%M:%S'' /"
    
por 10.06.2011 / 03:26