Eu tenho um script em execução constante que eu envio para um arquivo de log:
script.sh >> /var/log/logfile
Eu gostaria de adicionar um carimbo de data e hora antes de cada linha anexada ao log. Gostar:
Sat Sep 10 21:33:06 UTC 2011 The server has booted up. Hmmph.
Existe algum jujitsu que eu possa usar?
Respostas:
Você pode canalizar a saída do script por meio de um loop que prefixa a data e a hora atuais:
Se você usar muito isso, é fácil criar uma função bash para lidar com o loop:
fonte
read
espaços em branco no início e / ou na linha. Ele define o IFS (Internal Field Separator, basicamente uma lista de caracteres de espaço em branco) para esvaziar oread
comando.echo
seqüências de escape de interpretação. Se você realmente deseja que não mexa com o conteúdo (exceto a adição de datas), substitua oecho
comando porprintf "%s %s\n" "$(date)" "$line"
date -u +"%Y-%m-%dT%H:%M:%SZ"
ou talvez mais bonitadate +"%Y-%m-%d %T"
.date
) para cada linha de log, o que pode ser uma grande desvantagem, dependendo da sua máquina e da quantidade de logs. Eu preferiria sugerir o uso,ts
se disponível, veja a resposta de @willem #Veja
ts
nomoreutils
pacote Ubuntu :Ou, se
$command
o buffer automático (requerexpect-dev
pacote):fonte
O comando date fornecerá essas informações
então você pode
é isso que você queria?
fonte
Você pode simplesmente fazer eco das saídas de comando para o arquivo de log. ou seja,
Realmente funciona :)
Exemplo:
fonte
Faça um
config.sh
arquivoQuando você precisar enviar para o arquivo de log, use
O arquivo de log será semelhante
Portanto, será fácil classificar por data
fonte
Você quer dizer como:
fonte
script.sh
. O OP precisa de um carimbo de data / hora por linha.Tente isto
Chame esta função de carimbo de data / hora em todos os comandos de eco:
fonte
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 10 -20 em Cygwin.Quando se
bash
pode supor que uma alternativa mais rápida seria aprintf
incorporada com seu%(...)T
especificador de formato. Compararfonte
Você pode notar que o awk roda rápido,
Mas, sed corre muito mais rápido,
No entanto, em uma inspeção mais detalhada, o conjunto parece não mudar o tempo,
fonte
"s/^/$(date -R) /"
e executando a data uma vez antes da sed. Sed passa uma string estática.yes | head -5000000 | while read line; do echo $((SECONDS)); done | uniq -c
que é muito mais lento que o gawk.ts
O utilitário possui desempenho semelhante ao do bash loop.yes |head -5000000 |perl -ne 'print localtime."\t".$_' |uniq -c
que é um pouco mais lento que o awk.Abaixo está o conteúdo do meu arquivo de log
parte do conteúdo do meu shell é como abaixo
fonte
Este script imprime a saída no terminal e também salva no arquivo de log.
Saída de amostra:
fonte
Outra opção é configurar uma função para chamar sempre que você desejar gerar dados no seu código:
Toda vez em seu código, você deseja enviá-lo para a chamada do arquivo de log
Mole-mole....
fonte
Conduza um "sed":
fonte