문제

막힌 이유가 무엇인지 궁금합니다.내가 알 수 있듯이 clog는 cerr과 동일하지만 버퍼링이 있으므로 더 효율적입니다.일반적으로 stderr은 stdout과 동일하므로 clog는 cout과 동일합니다.이것은 나에게 꽤 형편없는 것 같아서 내가 오해하고 있는 것이 틀림없다고 생각합니다.동일한 위치로 나가는 로그 메시지가 있는 경우(아마도 /var/log/messages에 있는 내용) 오류 메시지가 있는 경우 아마도 너무 많이 쓰지 않을 것입니다(따라서 non을 사용하여 손실되는 것은 많지 않습니다). -버퍼링된 CER).내 경험상 충돌을 찾는 데 도움이 될 수 있도록 로그 메시지를 최신 상태(버퍼링되지 않음)로 유지하고 싶습니다(그래서 버퍼링된 방해물을 사용하고 싶지 않습니다).분명히 나는 ​​항상 cerr을 사용해야 합니다.

내 프로그램 내에서 막힘을 리디렉션하고 싶습니다.라이브러리 루틴을 호출할 때 cerr과 clog가 어디로 이동하는지 제어할 수 있도록 cerr을 리디렉션하는 것이 유용할 것입니다.일부 컴파일러가 이를 지원할 수 있습니까?방금 DJGPP를 확인했는데 stdout이 FILE 구조체의 주소로 정의되어 있으므로 "stdout = freopen(...)"과 같은 작업을 수행하는 것은 불법입니다.

  • clog, cerr, cout, stdin, stdout 및/또는 stderr를 리디렉션할 수 있습니까?
  • clog와 cerr의 유일한 차이점은 버퍼링입니까?
  • 보다 강력한 로깅 기능을 어떻게 구현하거나 찾아야 합니까(링크를 알려주세요)?
도움이 되었습니까?

해결책

clog, cerr, cout, stdin, stdout 및/또는 stderr를 리디렉션할 수 있습니까?

예.당신은 rdbuf 기능.

ofstream ofs("logfile");
cout.rdbuf(ofs.rdbuf());
cout << "Goes to file." << endl;

clog와 cerr의 유일한 차이점은 버퍼링입니까?

내가 아는 한 그렇습니다.

다른 팁

POSIX 쉘 환경에있는 경우 (실제로 BASH를 생각하고 있습니다) 파일 디스크립터를 다른 파일 디스크립터로 리디렉션 할 수 있으므로 리디렉션하면 다음과 같습니다.

$ myprogram 2>&5 

stderr를 fd=5로 표시되는 파일로 리디렉션합니다.

편집하다:다시 생각해보면 리디렉션에 대한 @Konrad Rudolph의 답변이 더 마음에 듭니다.rdbuf()는 이를 수행하는 보다 일관되고 이식 가능한 방법입니다.

로깅에 관해서는... 저는 std 라이브러리에 없는 모든 C++에 대한 Boost 라이브러리부터 시작합니다.보다: 부스트 로깅 v2

편집하다:부스트 로깅은 ~ 아니다 부스트 라이브러리의 일부;검토되었지만 승인되지 않았습니다.

편집하다:2년 후인 2010년 5월에 Boost는 현재 호출되는 로깅 라이브러리를 수락했습니다. 부스트.로그.

물론 다음과 같은 대안도 있습니다.

  • Log4Cpp (C++용 log4j 스타일 API)
  • Log4Cxx (Apache 지원 log4j 스타일 API)
  • 판테이오스 (없어져 버린?지난번에 시도했을 때 최신 컴파일러에서 빌드할 수 없었습니다.)
  • 구글의 GLog (햇팁 @SuperElectric)

Windows 이벤트 로거도 있습니다.

그리고 유용할 수 있는 몇 가지 기사:

기본 로거

#define myerr(e) {CriticalSectionLocker crit; std::cerr << e << std::endl;}

다음과 같이 사용됨 myerr("ERR: " << message); 또는 myerr("WARN: " << message << code << etc);

매우 효과적입니다.

그런 다음 다음을 수행하십시오.

./programname.exe 2> ./stderr.log
perl parsestderr.pl stderr.log

아니면 그냥 stderr.log를 직접 분석해 보세요.

나는 이것이 아니라는 것을 인정합니다 극도로 성능이 중요한 코드.그런데 그런 글은 누가 쓰나요?

리디렉션에 대한 답변이 여러 개 있으므로 추가하겠습니다. 이 좋은 보석 최근 리디렉션에 대해 우연히 발견했습니다.

#include <fstream>
#include <iostream>

class redirecter
{
public:
    redirecter(std::ostream & dst, std::ostream & src)
        : src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
    ~redirecter() { src.rdbuf(sbuf); }
private:
    std::ostream & src;
    std::streambuf * const sbuf;
};

void hello_world()
{
    std::cout << "Hello, world!\n";
}

int main()
{
    std::ofstream log("hello-world.log");
    redirecter redirect(log, std::cout);
    hello_world();
    return 0;
}

기본적으로 두 개의 스트림을 리디렉션하고 완료되면 복원할 수 있는 리디렉션 클래스입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top