2017-11-28 27 views
1

私はrsyslogバージョン8.16.0のubuntu 16.04を使用しています。私はC++ syslogラッパーのテストを書いています。 私は単にsyslog(3)を呼び出します。rsyslogの同期ファイルへの書き込みはブロックされません

設定ファイルには1つのルールしかありません。

user.* /var/log/user.log 

フィルタ重複メッセージがオフになり、ログファイル内のすべてのメッセージが表示されます。

テスト中に、syslog呼び出しがブロックされていないことに気付きました。

TEST(BlockingTest, block) 
{ 
    ifstream file; 
    long oriPos=0; 
    long newPos=0; 

    int offset = strlen("Nov 28 13:07:01 4dac2c62ebe7 logTest: blockinglogger: blocking call")+1; 

    file.open("/var/log/user.log"); 
    if(file.is_open()) 
    { 
    file.seekg(0,ios::end); 
    oriPos = file.tellg(); 
    } 
    file.close(); 

    Syslogging::Logger logger("blockinglogger",Syslogging::Level::DEBUG); 
    logger.debug("blocking call"); 

    // This needs to be here else undefined behavior. 
    this_thread::sleep_for(chrono::milliseconds(2)); 

    file.open("/var/log/user.log"); 
    if(file.is_open()) 
    { 
    file.seekg(0,ios::end); 
    newPos = file.tellg(); 
    } 
    file.close(); 

    EXPECT_EQ(newPos, oriPos+offset); 
} 

私はそれがファイルに書き込まれたまで、上記の設定を使用すると、それは各syslogの呼び出しのためにブロックされると思いました。しかし、私は小さなタイムアウトが必要です、または私は未定義の動作をします(時にはそれを通過する、時には失敗する)。

私は別の設定が必要ですか、この動作をより明確に説明できるユーザーは誰ですか?

EDIT:システムはユーザーレベルで他のログを行いません。 user.logファイルには、テストのエントリのみが含まれています。したがって、ランダムな他のログのために未定義ではありません。

編集:私はラッピングコードなしで同じ動作を確認しました。

int main() 
{ 

    for(int i=0;i<20;i++) 
    { 
    ifstream file; 
    long oriPos=0; 
    long newPos=0; 
    std::string s = "Nov 28 15:48:01 jova syslogTest: blocking call"+ std::to_string(i); 
    int offset = s.length()+1; 
    //cout << "off: " << offset << endl; 

    file.open("/var/log/user.log"); 
    if(file.is_open()) 
    { 
     file.seekg(0,ios::end); 
     oriPos = file.tellg(); 
     //cout << "ori: " << oriPos << endl; 
    } 
    file.close(); 
    std::string l = "blocking call" + std::to_string(i); 
    syslog(LOG_DEBUG, "%s", l.c_str()); 

    // THIS IS NEEDED.. 
    this_thread::sleep_for(chrono::milliseconds(5)); 

    file.open("/var/log/user.log"); 
    if(file.is_open()) 
    { 
     file.seekg(0,ios::end); 
     newPos = file.tellg(); 
     //cout << "new: " << newPos << endl; 
    } 
    file.close(); 


    if(newPos == oriPos+offset) 
    { 
     cout << "SAME" << endl; 
    } 
    else 
    { 
     cout << "DIFFERENT" << endl; 
    } 
    } 
} 

答えて

1

syslogシステムコールはファイルに書き込みません。/dev/log unixドメインソケットに書き込みます。 syslogデーモン(rsyslog)は/ dev/logをリッスンし、そこから実行するように設定されているものを実行します。/dev/logソケットはデータグラムソケットなので、何かがブロックされることはありません。

関連する問題