使用syslog函数配合rsyslog写入指定文件失败,求解决办法
问题描述
我尝试用syslog函数将程序PingWatchdog的日志写入/var/log/pingwatchdog.log,目前能看到日志内容,但无法输出到目标文件。已尝试以下方法均无效:
定义的日志宏
#define log_info(...) syslog(LOG_INFO, __VA_ARGS__);
方法一
代码实现:
openlog("PingWatchdog", LOG_PID|LOG_CONS, LOG_USER); log_info("[INFO]: PingWatchdog: pingDispatcher thread starting."); closelog();
对应/etc/rsyslog.d/下的配置规则:
if:syslogtag, isequal, "PingWatchdog:" /var/log/pingwatchdog.log &stop
方法二
代码实现:
openlog("PingWatchdog", 0, LOG_LOCAL1); log_info("[INFO]: PingWatchdog: pingDispatcher thread starting."); closelog();
对应/etc/rsyslog.d/下的配置规则:
local1.info /var/log/pingwatchdog.log
额外尝试的规则
if $programname == 'PingWatchdog' then /var/log/pingwatchdog.log
解决步骤
1. 修正rsyslog配置的语法与命名
/etc/rsyslog.d/下的配置文件必须以.conf结尾(比如命名为pingwatchdog.conf),否则rsyslog不会加载该文件。- 方法一中的规则语法错误,正确格式应为:
注意if $syslogtag == 'PingWatchdog:' then /var/log/pingwatchdog.log & stop&与stop之间需加空格,且变量前要加$符号。
2. 确保目标日志文件的权限合规
- 先检查文件权限:
ls -l /var/log/pingwatchdog.log - 若文件不存在,先创建并设置rsyslog可读写的权限(rsyslog通常以
syslog用户运行):sudo touch /var/log/pingwatchdog.log sudo chown syslog:adm /var/log/pingwatchdog.log sudo chmod 640 /var/log/pingwatchdog.log
3. 验证配置并重启rsyslog服务
- 检查rsyslog配置语法是否合法:
sudo rsyslogd -N1 - 重启服务使配置生效:
sudo systemctl restart rsyslog
4. 手动测试日志规则是否生效
- 用
logger命令发送测试日志,验证规则:- 对应方法二的
LOG_LOCAL1设施:logger -t PingWatchdog -p local1.info "Test log message" - 对应方法一的
LOG_USER设施:logger -t PingWatchdog -p user.info "Test log message"
- 对应方法二的
- 查看目标文件是否收到日志:
cat /var/log/pingwatchdog.log
5. 优化程序中syslog的调用逻辑
- 避免频繁调用
openlog和closelog,建议在程序启动时调用一次openlog,退出时调用closelog,而非每次打印日志都执行打开/关闭操作。 - 确认编译器支持可变参数宏(C99及以上标准),确保
log_info宏能正确展开。
6. 开启rsyslog调试模式定位问题
- 若以上步骤无效,关闭rsyslog服务后启动调试模式:
sudo systemctl stop rsyslog sudo rsyslogd -d - 运行程序生成日志,观察调试输出中关于
PingWatchdog日志的处理记录,排查具体阻塞点。
内容的提问来源于stack exchange,提问作者Sina_Torkzadeh
相关产品推荐
相关产品推荐

