私は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;
}
}
}