使用syslog.h将自定义时间戳写入syslog

时间:2014-01-17 14:10:32

标签: c linux syslog rsyslog

我的程序从远程系统获取事件,每个事件都包含一个时间戳。 我想使用事件时间戳而不是systemtime将此事件记录到syslog中。

有没有办法向syslog deamon发送自定义标头?

我在debian上使用rsyslog

编辑:

“事件”由一些“裸机”设备生成。 我的应用程序是实时以太网(EthernetPOWERLINK)和普通网络之间的网关。

我想以微秒精度保存它们,因为重要的是要知道它们的序列。

所以我需要裸机设备创建的确切时间戳。 我想将这些事件放入syslog中。 我没有找到任何lib(syslog.h除外)写入syslog)。

我真的需要自己构建软件包并将它们发送给rsyslog deamon吗?

3 个答案:

答案 0 :(得分:1)

不,不要打开那些虫子。

如果允许发件人指定时间戳,则允许攻击者欺骗他们希望隐藏的事件的时间戳。这种方式违背了使用单独的机器进行记录的整个目的(安全方面)。

然而,您可以做的是比较当前时间和时间戳,并在每条记录消息的开头包含该内容,使用类似

的内容
struct timespec   now;
struct timespec   timestamp;
double            delta;

int               priority = facility | level;
const char *const message;

delta = difftime(timestamp.tv_sec,   now.tv_sec)
      + ((double)timestamp.tv_nsec - now.tv_nsec) / 1000000000.0;

syslog(priority, "[%+.0fs] %s\n", delta, message);

在通常配置的Linux机器上,应生成与

类似的内容
Jan 18 08:01:02 hostname service: [-1s] Original message

假设消息至少花了半秒钟才到达。如果主机名的时钟运行速度很快,则delta将为正数。通常,delta为零。在网络速度很慢的情况下,delta是负数,因为原始事件发生在过去相对于显示的时间戳的位置。

如果您已经有基础设施来监控记录的消息,您可以让守护程序或cron脚本读取日志文件,并生成新的日志文件(不是通过syslog(),而只是使用字符串和文件操作)时间戳由指定的delta调整。但是,这必须非常谨慎地进行,识别不可接受或意外改变的增量,或者以某种方式标记它们。

如果您编写日志文件监视/显示小部件,那么您可以非常轻松地让用户在“实际”(syslog)或“派生”(syslog + delta)时间戳之间切换,因为delta很容易从中提取记录的行如果总是存在;即便如此,您必须小心让用户知道增量是否超出范围或意外更改,因为这样的更改最常为用户提供信息。 (如果它不是邪恶的,它确实意味着机器计时有些不确定;时间不应该只是跳来跳去。即使是NTP调整也应该非常顺利。)


如果您坚持打开那些蠕虫,只需生成自己的日志文件即可。许多应用都这样做毕竟,syslog()不是一个神奇的子弹,也不是对可靠记录的严格要求。

如果您的日志接收应用程序作为特定用户和组运行,您可以创建root用户和该组所拥有的/var/log/yourlogs/,并将日志文件保存在那里。将目录模式设置为02770drwxrws---u=rwx,g=rwxs,o=),并且在该目录中创建的所有文件将自动归同一组所有(这就是setgid位s },为目录做)。您只需要确保您的服务将umask设置为002(并在创建日志文件时使用06660660模式标志),以便它们保持组可读和组可写。

日志轮换(归档和/或删除旧日志文件,邮件日志)通常是由logrotate包提供的单独服务,并通过在/etc/logrotate.d/中删除特定于服务的配置文件进行配置在安装时。换句话说,即使您编写自己的日志文件,也不要旋转它们;为此使用现有服务。它为您的用户,我们的系统管理员提供了便利。 (注意:在上面的目录案例中,在日志轮换脚本开头设置umask 002非常有用;创建的文件将是可写组的。umask 022将使它们成为组只读。)

答案 1 :(得分:0)

通过在rsyslog配置中启用网络支持(TCP)和微秒计时器,确定已经解决了这个问题。

根据RFC 5424,我的应用程序构建原始syslog消息并通过TCP(端口514)将它们发送给deamon。 感谢Nominal Animal,但我别无选择......

答案 2 :(得分:-1)

您可以将原始日志消息写入/dev/log文件。这是Unix域套接字,系统日志服务器从中读取消息,就像使用syslog()函数编写消息一样。

我不确定可移植性,因为syslog()编写的消息格式似乎不遵循RFC5424。我只能与busybox及其syslogdnc实用工具。

syslog()函数以<PRI>Mon DD HH:MM:SS message的形式将消息写为数据报,其中PRI是优先级,即以facility | severity计算的十进制数,后跟时间戳和消息。

使用nc -u local:/dev/log,您可以将UDP数据报直接写入域套接字。例如,写<84>Apr 3 07:27:20 hello world会在Apr 3 07:27:20 hostname authpriv.warn hello world的{​​{1}}行中产生。

然后,您可以自由地以微秒为单位扩展时间戳。无论如何,您需要确保您的syslog服务器实现接受这种形式。对于/var/log/messages,我必须修改源代码。

注意:必须为Busybox配置启用的busyboxCONFIG_NC_EXTRACONFIG_NC_110_COMPAT选项,才能使用CONFIG_FEATURE_UNIX_LOCAL打开/dev/log