setlogmask(int mask)函数讲解

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;
}

你可能感兴趣的:(setlogmask(int mask)函数讲解)