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

为何syslog的LOG_PERROR选项不输出日志优先级?

问题解答

为啥LOG_PERROR输出不带优先级?

按POSIX标准的规定,LOG_PERROR标志的作用就是让syslog()把日志消息加上程序标识(比如这里的mytest)输出到stderr,不会自动附加优先级标签(像INFO、WARNING这类)。系统日志里看到的优先级,是日志守护进程(比如syslogd)收到日志后自己加上的,不是syslog()函数直接输出的内容。

有没有不用额外打印或改库的解决办法?

标准syslog库本身没给LOG_PERROR加优先级的内置功能,但可以通过给日志消息手动嵌入优先级字符串实现,不用额外写独立打印代码或者修改库:

  1. 先定义优先级到字符串的映射逻辑:
#include <syslog.h>

const char* get_prio_str(int prio) {
    switch(prio & LOG_PRIMASK) {
        case LOG_EMERG: return "EMERG";
        case LOG_ALERT: return "ALERT";
        case LOG_CRIT: return "CRIT";
        case LOG_ERR: return "ERR";
        case LOG_WARNING: return "WARNING";
        case LOG_NOTICE: return "NOTICE";
        case LOG_INFO: return "INFO";
        case LOG_DEBUG: return "DEBUG";
        default: return "UNKNOWN";
    }
}
  1. 调用syslog()时把优先级字符串嵌入到消息内容中:
int main(int argc, char** argv) {
    openlog("mytest", LOG_PERROR, LOG_DAEMON);
    syslog(LOG_INFO, "[%s] log 1", get_prio_str(LOG_INFO));
    syslog(LOG_WARNING, "[%s] log 2", get_prio_str(LOG_WARNING));
    syslog(LOG_ERR, "[%s] log 3", get_prio_str(LOG_ERR));
}

运行后stderr的输出会变成:

mytest: [INFO] log 1
mytest: [WARNING] log 2
mytest: [ERR] log 3

这种方法没有额外调用fprintf之类的独立打印函数,只是复用syslog()自身的格式参数注入优先级文本,完全符合“无需额外打印或修改syslog库”的要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:52:39