我创建了自己的 C 库,我的同事打算使用它。在这个包装器中,我打算使用syslog
并根据输入参数,我希望在LOCAL0
和之间切换LOCAL1
。
我发现的最简单的方法是openlog()
使用LOCAL0
or LOCAL1
,取决于输入参数,然后使用syslog()
and `closelog()。
我在同一个包装器 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()
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这个 API 会不会在压力下导致问题(性能问题)?
在我看来,这是错误的处理方式,但文档令人困惑。
你是否在压力下有问题将取决于openlog
你的 C 库中的实现。这很可能是有问题的。更重要的是,在多线程环境中,一个线程可能会发出一个syslog
接一个的线程openlog
,这意味着使用了错误的优先级。
如何正确执行此操作的关键在手册页中:
如果在对 的后续调用中未指定任何内容,则工具参数建立要使用的默认值
syslog()
。下面给出了选项和设施的值...priority
参数是通过对facility
和level
值进行 OR 运算形成的(解释如下)。
关于如何利用这一点的线索在这里:
的使用
openlog()
是可选的;syslog()
如有必要,它将自动被调用,在这种情况下ident
将默认为NULL
。
如果您不使用openlog
,则必须有某种方式来表达facility
。答案是您可以将设施指定为零openlog
(或根本不使用它),并将设施中的 OR 指定为 的priority
参数syslog
。
所以,像这样:
syslog(LOG_INFO | (flag?LOG_LOCAL1:LOG_LOCAL0),"%s",msg);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3609 次 |
最近记录: |