gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:41 28 4
gpt4 key购买 nike

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

有什么方法可以将自定义 header 发送到 syslog deamon 吗?

我在 debian 上使用 rsyslog

编辑:

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

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

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

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

最佳答案

不,不要打开那 jar 蠕虫。

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

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

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(),而是简单地使用字符串和文件操作),时间戳由指定的增量调整。然而,这必须非常小心地完成,识别 Not Acceptable 或意外变化的增量,或者可能以某种方式标记它们。

如果您编写日志文件监控/显示小部件,那么您可以很容易地让用户在“实际”(syslog) 或“派生”(syslog + delta) 时间戳之间切换,因为从记录行(如果始终存在);即使那样,您也必须小心让用户知道增量是否超出范围或意外更改,因为这样的更改通常会给用户提供信息。 (如果不是恶意的,这确实意味着机器计时有问题;时间不应该只是跳来跳去。即使是 NTP 调整也应该相当平滑。)


如果您坚持打开那堆蠕虫病毒,只需生成您自己的日志文件即可。许多应用程序都可以。毕竟,syslog() 并不是 Elixir ,也不是对可靠日志记录的严格要求。

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

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

关于c - 使用 syslog.h 将自定义时间戳写入 syslog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21187851/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com