rsyslog写入同步文件不会阻止

rsyslog writing to synchronous file does not block

本文关键字:文件 同步 rsyslog      更新时间:2023-10-16

我在ubuntu 16.04上使用rsyslog版本8.16.0。我正在为C Syslog包装纸编写一些测试。在包装器中,我只致电Syslog(3)。

配置文件中只有一个规则。

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);
}

我认为使用上面的配置将对每个系统拨打调用进行阻止,直到将其写入文件为止。但是我需要少量超时,否则我会得到不确定的行为(有时它会通过,有时会失败)。

我需要其他设置还是可以更清楚地解释此行为的任何人?

编辑:系统不会在用户级别进行任何其他登录。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;
    }
  }
}

syslog系统调用不写入文件。它写入/dev/log unix域插座。Syslog守护程序(RSYSLOG)在/dev/log上听,并从那里进行任何配置。/dev/log套接字是数据报套接字,因此无法阻止某些东西。