2017-09-22 6 views
-3

동일한 제목이나 비슷한 제목으로 많은 질문을 던졌고 여러 가지 방법으로 코드를 변경했습니다. 흥미로운 문제가있다.
로깅을위한 클래스가 매우 간단하며 파일에 물건을 씁니다. 정확한 코드는 생성자에서 작동하지만 멤버 함수에서는 작동하지 않습니다. 나는 어떤 관련이없는 코드를 제거하고있어, 나머지는 : 그것은 생성자에서 일하고 있지만, 동일한 코드는 멤버 함수에서 작동하지 않는 이유std :: ofstream은 (때로는) 파일에 쓰지 않습니다.

private: 
    std::string logfile_path_; 
    std::string program_name_; 
    std::string GetTimestamp() { 
     timeval tv; 
     gettimeofday(&tv, NULL); 
     char cTimestamp[24]; 
     strftime(cTimestamp, sizeof(cTimestamp), "%F %T", std::localtime(&tv.tv_sec)); 
     sprintf(&cTimestamp[19], ".%03d", (tv.tv_usec/1000));   // write the miliseconds (microseconds/1000) into cTimestamp starting at the 20th character. %03d == pad with 0, for a minimum length of 3, an integer. 
     return cTimestamp;  // function returns std::string so this will be implicitly cast into a string and returned. 
    } 

public: 
    int log_level_; 

    SrxDsLog(std::string Logfile_path, std::string program_name, int log_level) { 
     log_level_ = log_level; 
     program_name_ = program_name; 
     logfile_path_ = Logfile_path; 
     std::ofstream logfile(logfile_path_.c_str(), std::ios::out | std::ios::app); 
     std::cout << "Logger started, Log file: " << logfile_path_ << std::endl; 
     logfile << "Logger started, Log file: " << logfile_path_ << std::endl; 
     return; 
    } 

    void WriteLog(std::string Log_message, int Severity = LOG_CRITICAL, std::string Function_name = "") { 
     if (Severity >= log_level_) { 
      std::cout << GetTimestamp() << "|" << program_name_ << "|" << Function_name << "|" << GetSeverity(Severity) << "|" << Log_message << std::endl; 
      std::ofstream logfile(logfile_path_.c_str(), std::ios::out | std::ios::app); 
      logfile << GetTimestamp() << "|" << program_name_ << "|" << Function_name << "|" << GetSeverity(Severity) << "|" << Log_message << std::endl; 
     } 
    } 

질문입니다. std :: cout은 내가 원하는 정확한 로그 메시지를 쓰고 있지만 파일에 나타나지 않습니다. 파일은 프로그램이 실행될 때마다 한 행을 포함합니다.

+0

Er, ctor 및 멤버 함수에서 똑같은 코드는 아닙니다. 사실'logfile'은 ctor에만 존재하기 때문에 컴파일해서는 안됩니다. –

+0

두 함수에서 logfile을 선언하고 있습니다. – xyious

+0

@NeilButterworth 대체 무엇입니까? 로깅되지 않습니다. 나는 내가 cout과 cerr을 방향 전환 할 수 있다고 생각하니? 거기에서 절약 된 노력의 양은 무시할 만합니다. – xyious

답변

2

놀라 울 정도로 만족스럽지 않은 사건이 벌어지면서 나는 내 질문을 마감하기로 결정했습니다.
이 문제는 관련없는 코드에서 정의되지 않은 동작으로 인해 분명히 발생했습니다. 그리고 그 이유는 C++ 11에서 정의 된 것이었지만 C++ 03에서는 발생하지 않았기 때문입니다. 분명히 C++ 03의 생성자에서 생성자를 호출 할 수 없습니다.
그 이유 때문에 질문에 실제로 오류가있는 코드가 포함되지 않았기 때문에 질문이 매우 나빠 보입니다.

주세요.

1
int log_level_; 

생성자가이 클래스 멤버를 초기화하지 못했습니다.

이 클래스 멤버와 비교하면 정의되지 않은 동작이 발생합니다.

+0

반원이 제로라고 생각 했나요? 어느 쪽이든 출력을 얻는다면 이전에 명시 적으로 설정하기 전까지 0을 반환 한 cout에 log_level_ 메시지를 작성했습니다. – xyious

+0

에 관계없이, 그것은 한 번 평가되고 난 다음에 (성공적으로) 작성하고 로그 파일에 기록합니다 (실패합니다). 이것은 논리적으로 답이 될 수 없습니다. – xyious

+0

@xyious C++의 초기화 규칙은 다소 지저분하지만,이 경우 원시적 인'int'는 초기화되지 않은 상태로 남을 것입니다. 메모리 상태에 따라 0 일 수도 있고 아닐 수도 있습니다. 그러나 초기화되지 않은 변수에서 읽는 것은 정의되지 않은 동작이므로 앞의'if' 문에 대한 모든 논리가 창 밖으로 나옵니다. – 0x5453