You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS High Sierra下syslog异常:编译程序无法写入日志

排查C程序syslog日志不显示的问题

你用logger命令能成功写入日志,说明syslog服务本身是正常的,问题大概率出在C代码的细节或者日志路径配置上。咱们一步步来排查:

1. 先确认日志是不是输出到了其他文件

很多系统里,system.log不一定是user级日志的默认输出位置。你可以直接检查syslog的主日志文件,看看TEST MESSAGE2是不是藏在那里:

grep "TEST MESSAGE2" /var/log/syslog /var/log/messages

如果在这里找到了日志,说明只是日志路径的配置问题,你需要调整syslog的配置文件(比如/etc/rsyslog.conf或/etc/syslog.conf),把user.err级别的日志定向到system.log。

2. 检查程序是否正常执行到syslog调用

有可能你的程序在执行syslog之前就异常退出了,导致日志根本没发送。可以给代码加些调试输出,再留一点时间给syslog服务处理:

#include <stdio.h>
#include <syslog.h>
#include <unistd.h>

int main() {
    printf("Starting log test...\n");
    openlog("TestApp", LOG_PID, LOG_USER);
    setlogmask(LOG_UPTO(LOG_DEBUG));
    printf("Calling syslog...\n");
    syslog(LOG_ERR, "TEST MESSAGE2");
    printf("Syslog called, closing log...\n");
    closelog();
    sleep(1); // 给syslog服务留足处理时间
    printf("Done!\n");
    return 0;
}

编译运行后,看终端是否输出了所有printf内容。如果有缺失,说明程序在某个步骤崩溃了;如果全部输出但还是没日志,就继续往下排查。

3. 验证syslog配置是否接收user.err级别日志

虽然你在代码里设置了LOG_UPTO(LOG_DEBUG),但syslog服务本身可能有过滤规则。打开syslog配置文件(比如/etc/rsyslog.conf),检查是否有类似这样的规则:

user.err        /var/log/system.log

如果没有这条规则,user级别的错误日志就不会写入system.log。添加这条规则后,重启syslog服务:

sudo systemctl restart rsyslog

(如果是传统syslogd,用sudo service syslog restart)

4. 检查程序运行的权限

普通用户一般能写入user级syslog,但某些特殊环境(比如chroot容器、受限用户)可能会有问题。试试用root用户运行程序:

sudo ./your_program

如果root运行能成功输出日志,说明是权限问题,需要调整程序的运行权限或者syslog的配置规则。


内容的提问来源于stack exchange,提问作者Eugen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:07:48