1

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

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

我在 debian 上使用 rsyslog

编辑:

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

我想以微秒精度保存它们,因为了解它们发生的顺序很重要。

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

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

4

3 回答 3

2

不,不要打开那罐虫子。

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

但是,您可以做的是比较当前时间和时间戳,并将其包含在每条记录的消息的开头,使用类似

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

假设消息至少需要半秒钟才能到达。如果主机名的时钟运行得很快,则增量将为正数。通常,增量为零。在网络非常慢的情况下,增量为负,因为原始事件相对于显示的时间戳发生在过去。

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

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


如果您坚持要打开那罐蠕虫,只需生成您自己的日志文件。许多应用程序都这样做。毕竟,这不像syslog()是灵丹妙药或对可靠日志记录的严格要求。

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

日志轮换(归档和/或删除旧日志文件、邮寄日志)通常是一个单独的服务,由软件包提供,并通过在安装时logrotate放入特定于服务的配置文件进行配置。/etc/logrotate.d/换句话说,即使您编写自己的日志文件,也不要轮换它们;为此使用现有服务。它使您的用户(我们的系统管理员)的生活变得更加轻松。(注意:umask 002在上述目录情况下,在日志轮换脚本的开头设置非常有用;创建的文件将是组可写的。umask 022将使它们成为组只读的。)

于 2014-01-18T07:19:29.473 回答
0

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

根据 RFC 5424,我的应用程序构建原始系统日志消息并通过 TCP(端口 514)将它们发送到守护进程。感谢Nominal Animal,但我别无选择......

于 2014-04-07T16:37:14.760 回答
-1

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

我不确定可移植性,因为由 编写的消息格式syslog()似乎不遵循 RFC 5424。我只能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./var/log/messages

然后,您可以自由地以微秒精度扩展时间戳。无论如何,您需要确保您的系统日志服务器实现接受这种形式。在这种情况下busybox,我不得不修改源代码。

注意: Busybox 需要配置为 enabled CONFIG_NC_EXTRACONFIG_NC_110_COMPAT以及CONFIG_FEATURE_UNIX_LOCAL允许/dev/log使用nc.

于 2020-04-03T13:07:55.833 回答