Você pode prefixar cada linha escrita com tee com a data e hora atuais?

Você pode prefixar cada linha escrita com tee com a data e hora atuais?

Estou usando o comando 'tee' para capturar os resultados de um comando bash longo em um arquivo.

O arquivo que emito com tee pode de alguma forma prefixar cada linha com o carimbo de data e hora de quando a linha foi escrita? Estou procurando uma solução em que cada linha tenha um valor de data e hora diferente... não o mesmo valor prefixado em cada linha.

A razão pela qual quero isso é que seria muito útil saber quando cada linha foi emitida posteriormente, quando eu ler o arquivo para entender onde estavam as áreas lentas.

Responder1

Se tee não puder fazer alguma coisa, canalize-o para um programa que o faça.maisutilstem uma ferramenta chamada tscuja finalidade é exatamente esta:

$ teste de eco | ts
02 de fevereiro 13:17:27 teste

Se você quiser registrar a data e horatudo, o uso deve ser óbvio:

myapp | ts | tee app.log

Outras combinações são possíveis; por exemplo, para registrar a data e hora apenas na saída da tela ou apenas no arquivo de log:

myapp | tee app.log | ts
myapp | tee >(ts > app.log)
myapp | tee /dev/tty | ts > app.log
myapp | pee "ts > app.log" "cat"
myapp | pee "cat > app.log" "ts"

(Sim, esse último também é de moreutils.)

Responder2

Uma alternativa para ts:

echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"

Saída:

# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo

Exemplo para registrar stdout e stderr em um arquivo (remova /dev/nullpara gravar no terminal também):

exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )

Outra alternativa usando awk:

echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"

informação relacionada