为何syslog的LOG_PERROR选项不输出日志优先级?
问题解答
为啥LOG_PERROR输出不带优先级?
按POSIX标准的规定,LOG_PERROR标志的作用就是让syslog()把日志消息加上程序标识(比如这里的mytest)输出到stderr,不会自动附加优先级标签(像INFO、WARNING这类)。系统日志里看到的优先级,是日志守护进程(比如syslogd)收到日志后自己加上的,不是syslog()函数直接输出的内容。
有没有不用额外打印或改库的解决办法?
标准syslog库本身没给LOG_PERROR加优先级的内置功能,但可以通过给日志消息手动嵌入优先级字符串实现,不用额外写独立打印代码或者修改库:
- 先定义优先级到字符串的映射逻辑:
#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"; } }
- 调用
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
相关产品推荐
相关产品推荐

