Log mais eficiente “echo date”?

1

Meus colegas de trabalho escrevem scripts com linhas como esta:

echo "nightly $MACHINE restart begins at" 'date'

Qual saída é algo assim:

nightly whitestar restart begins at Mon Oct 13 22:05:01 EDT 2014

No entanto, tentar analisar isso para aparar ou detectar erros é difícil! Além disso, parece que

'date'

Não é a maneira mais eficiente de produzir a data, com base em discussões on-line sobre subcasias (e meu desprezo geral por backticks).

Existem maneiras melhores de fornecer as informações pertinentes para que sejam mais concisas, eficientes e analisáveis?

    
por bgStack15 14.10.2014 / 23:25

3 respostas

4

Em /bin/sh puro, a desova date é o caminho principal. Mas não é tão ruim - tanto o Linux quanto o BSDs são muito rápidos na criação de novos processos, e o binário date será armazenado em cache por algum tempo. Se você não gosta da aparência dos backticks, $(this syntax) é geralmente preferível a eles.

Você pode alterar o formato de data usando date +fmt , dando a ele um formato de estilo strftime ():

echo "nightly $MACHINE restart at $(date +"%F %T %z")"
echo "$(date +"%F %T %z"): $MACHINE: nightly restart"

... Na verdade, você pode estender a opção de formato de data para fazer com que date imprima a linha inteira - contanto que você evite ou escape de % caracteres em variáveis:

date +"%F %T %z: $MACHINE: nightly restart"

No shell Bash, você pode substituir echo por printf e usar o especificador de formato %(fmt)T especial, que aceita novamente um formato de estilo strftime ():

printf "%(%F %T %z)T: %s: nightly restart\n" "$MACHINE"

Em todos os exemplos acima, %F %T %z (ou a versão completa %Y-%m-%d %H:%M:%S %z ) é a "modificada ISO 8601 " Formato de data. (O ISO 8601 regular seria %FT%T%z ou %Y-%m-%dT%H:%M:%S%z , um pouco menos legível.) Qualquer uma dessas opções geralmente é a melhor escolha ao formatar datas para análise futura.

Por fim, você pode esquecer echo inteiramente e gravar diretamente no log do sistema. A maioria dos sistemas operacionais vem com a função logger para enviar para syslog :

logger -s -p user.notice "nightly restart"

O syslog armazenará automaticamente a data & tempo, bem como o nome do host.

    
por 14.10.2014 / 23:37
1

O que muitas pessoas não percebem é que date(1) pode ser usado em vez de eco - com a mensagem sendo parte do formato. Por exemplo:

date '+%D %T nightly restart'

isso é mais leve e mais direto do que a captura usual de saída de datas com backticks. A menos que seja redirecionado para um arquivo de log, as mensagens de log devem, provavelmente, ser enviadas para stderr em vez de stdout :

date '+%D %T nightly restart' 1>&2

Este é o meu método favorito. A única alternativa melhor é - como foi apontado pela grawity acima - usando a implementação integrada do bash de printf(1) . Sua desvantagem é, claro, que o seu script se torne apenas um bash ...

Se você precisar que o registro também vá para o syslogd, você deve usar logger(1) (com -s ) - como o grawity sugere - lembre-se de que o sinalizador não está disponível em todos os sistemas. Por exemplo, é - bastante irritante - ausente no Solaris, incluindo o Solaris-10. (Não coincidentemente, o LOG_PERROR define (que algumas implementações de syslog(3) reconhecem), também está faltando em "Slowlaris" ...)

    
por 15.10.2014 / 00:04
0

lecho 0,3

Para fazer login no passado, usamos o seguinte:

server=$( uname -n )
lecho() {
   now=$( date '+%Y-%m-%d %T' )
   printf "[%19s]%s@%s\n: %s\n" "$now" "$USER" "$server" "$@"
}

# ...

lecho "BEGIN nightly restart"

Edit: Quando você está fazendo muitos, o printf é mais rápido que o echo. Além disso, a formatação da saída é muito útil quando você precisar fazer isso posteriormente.

    
por 16.10.2014 / 16:47

Tags