![将日志消息发送到不同位置](https://linux22.com/image/29642/%E5%B0%86%E6%97%A5%E5%BF%97%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E5%88%B0%E4%B8%8D%E5%90%8C%E4%BD%8D%E7%BD%AE.png)
我想将消息从 C 程序和 Perl 脚本发送到文件(例如 /var/log/my_log)。我无权访问 syslog 守护进程配置,因此我认为启动一个不同的 syslog 守护进程 (syslog-ng)。
我可以使用logger
command 及其-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 或.so
DLL 注入)。