Aumenta a precisão do rsyslog / syslog para incluir segundos fracionários?

5

Eu uso o syslog e o rsyslog para lidar com logging no meu Linux & Sistemas FreeBSD.

O timestamp está atualmente em segundos, mas eu gostaria de aumentar a precisão desses timestamps para incluir milissegundos. Isso é possível usando as variantes do syslog como rsyslog (RedHat, Ubuntu) ou Syslog no FreeBSD?

Se eu aumentasse o registro de data e hora do registro para incluir microssegundos, qual a precisão desses carimbos de data e hora? Se um evento aconteceu às 03: 37: 02: 001, isso significa que o evento realmente ocorreu naquele milissegundo exato ou há um atraso quando o syslog grava o evento?

    
por Stefan Lasiewski 26.03.2012 / 23:21

3 respostas

7

A maioria dos daemons Syslog modernos (incluindo rsyslog e syslog-ng) suportam timestamping de alta precisão. Se você estiver usando uma dessas ferramentas, não terá dificuldade em configurá-la.

Quanto à precisão. . . depende. Primeiro de tudo, vai depender do hardware. A maioria dos hardwares modernos suporta tempos de alta precisão, mas não todos. Assumindo que o hardware suporta, ainda há alguns desafios. A prioridade máxima será garantir que o relógio esteja configurado com precisão e que quaisquer outras máquinas que estejam efetuando login tenham o tempo correspondente (supondo que você esteja enviando logs de todos os seus sistemas para um servidor de logs central). O ntpd é a ferramenta padrão para manter a hora exata do relógio (geralmente sincronizada com o ntp.org pool ).

Finalmente, chegamos ao evento em si. A resposta curta é que quase sempre haverá pelo menos um pouco de desvio, mesmo que seja muito leve. Ainda haverá alguma variabilidade aqui, dependendo de outros fatores. Muito dependerá do local de origem do evento e de como é captado. Por exemplo, se eu tenho um aplicativo que faz foo e, em seguida, envia um log para o syslog dizendo que o aplicativo fez foo, pode levar 100 ms entre a conclusão do foo e o envio do log. Pode levar outros 20ms para a chamada do sistema syslog () ser concluída.

Não me lembro dos detalhes de baixo nível do syslog, mas não acredito que o evento tenha registro de data e hora quando é enviado ao syslog, acho que é registrado pelo timestamped do daemon syslog quando é selecionado. Isso adiciona mais alguns milissegundos ao mix.

Basicamente, a menos que você esteja lidando com um sistema em tempo real com recursos de registro em tempo real, eu não acho que você terá 100% de precisão perfeita. Mesmo assim, você provavelmente teria níveis (microscópicos) de desvio, mas pelo menos teria restrições para saber sua margem de erro. Ao mesmo tempo, a menos que você tenha esse nível de exigência, seu timestamp provavelmente será preciso o suficiente.

    
por 26.03.2012 / 23:57
3

Christopher cobriu as considerações técnicas: execute o ntpd, aponte-o para uma fonte confiável e esteja ciente da deriva. Eu queria adicionar algumas notas:

  • O registro de data e hora é definido pela chamada de função syslog() libc. Aqui está implementação do uClibc . Uma invocação típica de syslog() será concluída bem abaixo de 1 ms. Aqui está a embalagem do Ruby VM syslog() em 0,15 ms:

    Benchmark.measure { logger.info 'narf' }.real => 0.000149965286254883

  • Embora o syslog possa ser adequado para precisão em milissegundos, muitos quadros de aplicativos da Web armazenam logs e, em seguida, esvaziam periodicamente o buffer ou enviam todos os logs para uma solicitação após o término da solicitação. Quase todos os servidores Web fazem o mesmo (é assim que o formato de arquivo de log comum do W3C conhece os bytes transmitidos). O impacto é que a precisão de milissegundos é útil em menos situações do que parece.

  • O desvio do relógio é endêmico nas VMs. De menções anedóticas, 3 segundos por dia é típico. A execução de ntpdate como uma tarefa do cron noturno não é suficiente.

  • O contexto geralmente torna a ordem bastante óbvia. Se você não encontrou um caso em que a precisão de milissegundos era a única maneira de saber qual evento aconteceu primeiro, provavelmente não valeria a pena.

por 07.04.2012 / 02:20
0

Em /etc/rsyslog.conf substitua

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

por

$ActionFileDefaultTemplate RSYSLOG_FileFormat

E depois de reiniciar o serviço rsyslog, milissegundos aparecerão no arquivo de log

    
por 03.10.2018 / 15:22