setlogmask函数设置syslog记录屏蔽字。参数int mask低8位是syslog记录的屏蔽字,对应关系如下。
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2 |
bit1
|
bit0
|
LOG_DEBUG
|
LOG_INFO |
LOG_NOTICE
|
LOG_WARNING
|
LOG_ERR
|
LOG_CRIT
|
LOG_ALERT
|
LOG_EMERG
|
LOG级别值定义如下(/usr/include/sys/syslog.h中定义):
#define LOG_EMERG 0 /* system is unusable */
#define LOG_ALERT 1 /* action must be taken immediately */
#define LOG_CRIT 2 /* critical conditions */
#define LOG_ERR 3 /* error conditions */
#define LOG_WARNING 4 /* warning conditions */
#define LOG_NOTICE 5 /* normal but significant condition */
#define LOG_INFO 6 /* informational */
#define LOG_DEBUG 7 /* debug-level messages */
在这低8位中,如果相应位是0,则不记录,如果是1,相应级别log记录。例如:bit6,bit5,bit4位是1,其他位是0,则只记录LOG_INFO,LOG_NOTICT,LOG_WARNING级别的日志,其他的过滤掉。但是有一点要注意,如果bit7是1,LOG_DEBUG级别日志依然不记录到syslog中,其他位如果有1,相应级别日志则依然记录。
猜测bit7已经不属于屏蔽字中。
辅助宏
LOG_MASK和LOG_UPTO
定义:
#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority */
#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through pri */
pri的值:LOG_DEBUG~LOG_EMERG
LOG_MASK的作用是将将bit7~bit0中相应pri位置1。例如LOG_MASK(LOG_INFO) 就是把bit6置1。有了此宏,我们可以在调用setlogmask时将LOG_MASK(LOG_INFO)参数传递给setlogmask函数(例如:setlogmask(LOG_MASK(LOG_INFO)),这样就可以实现在syslog中,只记录LOG_INFO级别的日志,其他级别的日志不会记录。如果想记录LOG_NOTICE和lOG_ERR级别的日志我们可以进行setlogmask(LOG_MASK(LOG_NOTICE) | LOG_MASK(LOG_ERR))设置。如果我们想记录LOG_INFO级别以外的日志,我们可以这样设置:setlogmask(!(LOG_MASK(LOG_INFO)),
注意:LOG_DEBUG级别日志不会记录。如果我们想记录LOG_INFO级别包括LOG_INFO级别的日志,那LOG_UPTO宏就可用到了,我们可以这样设置:setlogmask(LOG_UPTO(LOG_INFO))。LOG_UPTO宏有点意思,大家可以研究一下。
最后,提醒大家,所有设置只对你自己的应用程序起作用。作者只在linux系统做了实验,其他unix系统未作实验,请以自己使用的系统为准。
最最后给大家提供一段实验代码,大家可以实验一下
#include
#include
#include
#include
#include
int main()
{
openlog("syslog_test",LOG_PID,LOG_LOCAL0);
// setlogmask(LOG_UPTO(LOG_INFO));
setlogmask(~LOG_MASK(LOG_INFO));
// syslog(LOG_EMERG,"ggm logemerg\n");
syslog(LOG_ALERT,"ggm logalert\n");
syslog(LOG_CRIT,"ggm logcrit\n");
syslog(LOG_ERR,"ggm logerr\n");
syslog(LOG_WARNING,"ggm logwarning\n");
syslog(LOG_NOTICE,"ggm lognotice\n");
syslog(LOG_INFO,"ggm loginfo\n");
syslog(LOG_DEBUG,"ggm logdebug\n");
return 0;
}