将日志消息发送到不同位置

将日志消息发送到不同位置

我想将消息从 C 程序和 Perl 脚本发送到文件(例如 /var/log/my_log)。我无权访问 syslog 守护进程配置,因此我认为启动一个不同的 syslog 守护进程 (syslog-ng)。

我可以使用loggercommand 及其-u选项从命令行发送消息。此日志消息记录在 my_log 而不是通常的消息文件中,但我无法从 C 或 Perl 重现相同的行为。

显然,openlog 函数没有任何选项来指定用于日志记录的套接字、日志进程的 PID 或允许我将消息发送到我自己的日志而不是系统日志的选项。

syslog使用库可以做到还是不可能?

答案1

你是对的,libcopenlog()不允许你指定套接字,但这通常只有在你需要一个单独的syslogd. (A插座当然,与记录消息的文件不同。)

logger默认为(我认为在大多数系统上)user.notice,所以如果它记录到正确的位置,你应该在 C 中执行类似的操作:

#include <syslog.h>
  ...
  openlog("myprog",LOG_PID,LOG_USER);
  syslog(LOG_INFO,"%s","my message...");

或者在 Perl 中:

use Sys::Syslog qw(:DEFAULT setlogsock);
setlogsock 'unix';   
# setlogsock('unix','/opt/my_root/dev/log');

openlog("myprog","pid","user");
syslog("info","my message...");

有关常量的详细信息,请参阅您的手册页openlog(3)和手册页。Sys::Syslog(3)

如果您确实想登录到不同的套接字,那么您可以使用上面的/dev/log第二种形式在 Perl 中轻松完成此操作。setlogsocket()您可能需要使用最近的Sys::Syslog软件包,我发现在指定路径时它会在 v0.17 中失败。

在 C 语言中有点棘手,你需要connect()连接到AF_UNIX套接字并write()连接到它使用正确的消息格式。我建议您阅读最近的logger(functions myopenlog()and )的源代码mysyslog()util-linux-2.x版本。

在 Linux (glibc) 和 FreeBSD 上,使用的路径openlog()是硬编码的(_PATH_LOG来自/usr/include/syslog.h),我知道没有办法在运行时更改它(除了 chroot 或.soDLL 注入)。

相关内容