Eu tenho um script em execução constante que eu produzo em um arquivo de log:
script.sh >> /var/log/logfile
Gostaria de adicionar um carimbo de data/hora antes de cada linha anexada ao log. Curti:
Sat Sep 10 21:33:06 UTC 2011 The server has booted up. Hmmph.
Existe algum jiu-jitsu que eu possa usar?
Você pode canalizar a saída do script por meio de um loop que prefixa a data e hora atuais:
Se você for usar muito isso, é fácil criar uma função bash para lidar com o loop:
Veja no pacote
ts
Ubuntu :moreutils
Ou, se
$command
faz buffer automático (requerexpect-dev
pacote):O comando date fornecerá essa informação
então você pode
é isso que você queria?
Faça um
config.sh
arquivoQuando você precisa enviar para o arquivo de log, use
O arquivo de log será parecido
Assim será fácil classificar por data
Você pode simplesmente ecoar as saídas do comando para o arquivo de log. ou seja,
Realmente funciona :)
Exemplo:
A resposta aceita https://serverfault.com/a/310104 pode ser um pouco lenta, se muitas linhas tiverem que ser processadas, com a sobrecarga de iniciar o
date
processo permitindo cerca de 50 linhas por segundo no Ubuntu e apenas cerca de 10 -20 em Cygwin.Quando
bash
se pode supor que uma alternativa mais rápida seria oprintf
built-in com seu%(...)T
especificador de formato. CompararObservação. No meu atual PC de trabalho OpenSuse (julho de 2021), o desempenho aumentou significativamente, fazendo 1.200 linhas por segundo com
date
e 265.000 linhas por segundo comprintf
. Não está totalmente claro, como esse desempenho em particular aumentou quase duas ordens de magnitude em comparação com o meu laptop de 5 anos atrás.Tente isso
Chame esta função timestamp em cada comando echo:
Resposta curta formatada para caber na pergunta
Explicação
awk
roda rápido e é capaz de funcionar como filtro de tubulação Unix e imprimir data por si só.Vamos comparar:
Informação adicional
Sed parece correr muito mais rápido,
No entanto, em uma inspeção mais próxima, o set parece não mudar o tempo,
Porque
date
(que é mais lento por sinal) é chamado apenas uma vez.Você quer dizer como:
Outra opção é configurar uma função para chamar toda vez que você quiser gerar dados em seu código:
Então toda vez que no seu código você quiser enviá-lo para o arquivo de log, chame
Mole-mole....