簡體   English   中英

在每個syslog C ++之前調用openlog

[英]calling openlog before every syslog C++

我創建了自己的C庫,我的同事打算使用它。 在這個包裝器中,我打算使用syslog並且根據輸入參數,我希望在LOCAL0LOCAL1之間切換。

我發現最簡單的方法是使用LOCAL0LOCAL1執行openlog() ,具體取決於輸入參數,然后執行syslog()和`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()
}

我的問題是,這個API能否在壓力下出現問題(性能問題)?

在我看來,這是錯誤的方法,但文檔令人困惑。

您是否在壓力下遇到問題將由您的C庫中openlog的實施決定。 這可能是個問題。 更重要的是,在多線程環境中,一個線程可能在另一個線程發出openlog之后發出syslog ,這意味着使用了錯誤的優先級。

如何正確執行此操作的關鍵在於手冊頁:

如果在后續對syslog()調用中未指定,則facility參數將建立一個默認值。 選項和設施的值如下所示...... priority參數是通過對facility進行OR運算和level值(下面解釋)形成的。

關於如何利用這個的線索在這里:

openlog()的使用是可選的; 如果需要,它將由syslog()自動調用,在這種情況下, ident將默認為NULL

如果你不使用openlog ,必須有表達的某些方面facility 答案是,你可以指定基金作為零openlog (或不使用它的話),並且還是在設施的priority的參數syslog

所以,像:

syslog(LOG_INFO | (flag?LOG_LOCAL1:LOG_LOCAL0),"%s",msg);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM