在每个syslog C ++之前调用openlog

时间:2014-06-03 01:12:43

标签: c++ c syslog

我创建了自己的C库,我的同事打算使用它。在此包装器中,我打算使用syslog并根据输入参数,我希望在LOCAL0LOCAL1之间切换。

我找到的最简单方法是使用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能否在压力下出现问题(性能问题)?

1 个答案:

答案 0 :(得分:4)

在我看来,这是错误的方法,但文档令人困惑。

您是否在压力下遇到问题将由您的C库中openlog的实施决定。这可能是个问题。更重要的是,在多线程环境中,一个线程可能会在另一个线程发出syslog之后发出openlog,这意味着使用了错误的优先级。

如何正确执行此操作的关键在手册页中:

  

如果在syslog()的后续调用中未指定,则facility参数将建立一个默认值。选项和工具的值如下所示...... priority参数是通过对facilitylevel值进行OR运算形成的(如下所述)。

关于如何利用这一点的线索在这里:

  

使用openlog()是可选的;如有必要,syslog()会自动调用它,在这种情况下,ident将默认为NULL

如果您不使用openlog,必须有某种方式表达facility。答案是,您可以将设施指定为零openlog(或根本不使用它),并将设施中的OR指定为priority的{​​{1}}参数。

所以,比如:

syslog