我创建了自己的C库,我的同事打算使用它。在此包装器中,我打算使用syslog
并根据输入参数,我希望在LOCAL0
和LOCAL1
之间切换。
我找到的最简单方法是使用openlog()
或LOCAL0
执行LOCAL1
,具体取决于输入参数,然后执行syslog()
和`closelog()。< / p>
我在同一个包装器API中有所有3个(类似于下面的内容):
void syslog_wrap_api(int flag, const char *msg)
{
setlogmask(LOG_UPTO (LOG_INFO));
if(flag == 0)
openlog("myapplog",LOG_NDELAY,LOG_LOCAL0);
else
openlog("myapplog",LOG_NDELAY,LOG_LOCAL1);
syslog(LOG_INFO,"%s",msg);
closelog()
}
我的问题是,这种API能否在压力下出现问题(性能问题)?
答案 0 :(得分:4)
在我看来,这是错误的方法,但文档令人困惑。
您是否在压力下遇到问题将由您的C库中openlog
的实施决定。这可能是个问题。更重要的是,在多线程环境中,一个线程可能会在另一个线程发出syslog
之后发出openlog
,这意味着使用了错误的优先级。
如何正确执行此操作的关键在手册页中:
如果在
syslog()
的后续调用中未指定,则facility参数将建立一个默认值。选项和工具的值如下所示......priority
参数是通过对facility
和level
值进行OR运算形成的(如下所述)。
关于如何利用这一点的线索在这里:
使用
openlog()
是可选的;如有必要,syslog()
会自动调用它,在这种情况下,ident
将默认为NULL
。
如果您不使用openlog
,必须有某种方式表达facility
。答案是,您可以将设施指定为零openlog
(或根本不使用它),并将设施中的OR指定为priority
的{{1}}参数。
所以,比如:
syslog