C Syslog API - 如何覆盖 _PATH_LOG

Posted

技术标签:

【中文标题】C Syslog API - 如何覆盖 _PATH_LOG【英文标题】:C Syslog API - How to Override _PATH_LOG 【发布时间】:2020-01-06 14:54:20 【问题描述】:

我正在 Linux 上构建一些包含 syslog.h 的东西,但我想覆盖当前指向 /dev/log 的 _PATH_LOG 的定义

由于 Systemd 施加的一些不合理的限制,我希望该程序的 syslog API 仅指向不同的套接字,并且从不发送到 /dev/log。如何单独为这个构建覆盖这个定义?定义嵌套在 syslog.h 包含的 syslog-path.h 中,因此我的程序间接包含定义此变量的标头。

【问题讨论】:

调整 journald 怎么样?我认为大多数速率限制等都可以修改。 您是否尝试将日志发送到远程系统日志服务器,而不是发送到运行您的应用程序的机器上的系统记录器? 或者您是否尝试配置本地计算机的日志记录服务器,以将应用程序中的日志写入与系统所有其他日志分开的文件中? @larsks 不幸的是,systemd 在这方面绝对没用,它允许零过滤。全部或全部写入日志 DB github.com/systemd/systemd/issues/6432 @WoodrowBarlow 我正在尝试通过其套接字接口直接写入 rsyslogd,并仅针对此特定程序绕过 systemd-journald 数据库。由于安全原因,我不能让这个程序在本地记录(到日志,但我想要日志用于其他事情),并且 rsyslogd 得到了适当的保护(与日志不同),因此由于合规性原因它必须在那里记录。跨度> 【参考方案1】:

如果您包含syslog.h,则您正在使用您机器的系统记录器(例如,syslogd)。

根据设计,应用程序会生成系统日志,系统日志服务器会决定日志的去向。如果您想使用系统记录器并将应用程序的日志转到自定义端点,则需要修改系统记录服务器的配置。您不能在应用内的代码中指定自定义端点。

如果您想将 syslog 直接从您的应用发送到远程 syslog 服务器(绕过系统记录器),您可以使用第三方 syslog 客户端库来实现。

【讨论】:

我正在尝试修改 glibc syslog API 用于一个特定程序的目标套接字。 syslog 守护进程不应该受到影响,我只是希望 glibc syslog API 中的 syslog 函数调用为一个应用程序使用 /dev/log 以外的套接字。我认为这应该与我系统上的 syslog 守护进程正交。

以上是关于C Syslog API - 如何覆盖 _PATH_LOG的主要内容,如果未能解决你的问题,请参考以下文章

LD_PRELOAD-ed open() + __xstat() + syslog() 结果进入 EBADF

如何在 Python C-API 中动态创建派生类型

如何在 C 中将 linux syslog 映射到 printf

如何在windows服务器中使用syslog功能

PHP如何覆盖文件的特定部分

如何知道 syslog 的某个功能是不是调用成功?