我的程序从远程系统获取事件,每个事件都包含一个时间戳。 我想使用事件时间戳而不是systemtime将此事件记录到syslog中。
有没有办法向syslog deamon发送自定义标头?
我在debian上使用rsyslog
编辑:
“事件”由一些“裸机”设备生成。 我的应用程序是实时以太网(EthernetPOWERLINK)和普通网络之间的网关。
我想以微秒精度保存它们,因为重要的是要知道它们的序列。
所以我需要裸机设备创建的确切时间戳。 我想将这些事件放入syslog中。 我没有找到任何lib(syslog.h除外)写入syslog)。
我真的需要自己构建软件包并将它们发送给rsyslog deamon吗?
答案 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/
,并将日志文件保存在那里。将目录模式设置为02770
(drwxrws---
或u=rwx,g=rwxs,o=
),并且在该目录中创建的所有文件将自动归同一组所有(这就是setgid位s
},为目录做)。您只需要确保您的服务将umask设置为002
(并在创建日志文件时使用0666
或0660
模式标志),以便它们保持组可读和组可写。
日志轮换(归档和/或删除旧日志文件,邮件日志)通常是由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
及其syslogd
和nc
实用工具。
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配置启用的busybox
,CONFIG_NC_EXTRA
和CONFIG_NC_110_COMPAT
选项,才能使用CONFIG_FEATURE_UNIX_LOCAL
打开/dev/log
。