2017-11-28 25 views
1

rsyslog 버전 8.16.0을 사용하는 우분투 16.04입니다. C++ syslog 래퍼에 대한 몇 가지 테스트를 작성하고 있습니다. 래퍼에서는 syslog (3)를 호출합니다.rsyslog가 동기 파일에 기록하는 것이 차단되지 않습니다

구성 파일에는 하나의 규칙 만 있습니다.

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 호출을 차단할 것이라고 생각했습니다. 하지만 작은 시간 초과가 필요하거나 정의되지 않은 동작이 발생합니다 (때로는 성공하고 때로는 실패합니다).

다른 설정이나이 동작을 더 명확하게 설명 할 수있는 사람이 필요합니까?

편집 : 시스템은 사용자 수준에서 다른 로깅을 수행하지 않습니다. 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 유닉스 도메인 소켓에 기록합니다. syslog 데몬 (rsyslog)은/dev/log에서 수신 대기하고 거기에서 수행하도록 구성된 모든 작업을 수행합니다./dev/log 소켓은 데이터 그램 소켓이므로 뭔가 차단할 방법이 없습니다.