문제

여러 스레드에서 로깅을위한 간단한 클래스를 구현하고 싶습니다. 물건을 기록하려는 각 객체는 일반적인 연산자를 사용하는 데 메시지를 작성할 수있는 타조 객체를 받는다는 아이디어가 있습니다. 원하는 동작은 스트림이 플러시 될 때 메시지가 로그에 추가된다는 것입니다. 이렇게하면 다른 스레드의 메시지로 메시지가 중단되지 않습니다. 임시 스트링 스트림을 사용하여 메시지를 저장하지 않으려 고합니다. 내가 알 수 있듯이, 이것을 달성하는 표준 방법은 내 자신의 Streambuffer를 구현하는 것이지만, 이것은 매우 번거롭고 오류가 발생하기 쉬운 것 같습니다. 이것을하는 더 간단한 방법이 있습니까? 그렇지 않다면, 당신은 Custom StreamBufs에 대한 좋은 기사/방법/가이드를 알고 있습니까?

미리 감사드립니다.

space_c0wbo0y

업데이트:

그것이 작동하는 것처럼 보이기 때문에 나는 내 자신의 대답을 추가했습니다.

도움이 되었습니까?

해결책 2

그래서 나는 살펴 보았다 boost.iostreams 그리고 여기에 내가 생각해 낸 것이 있습니다.

class TestSink : public boost::iostreams::sink {
public:
    std::streamsize write( const char * s, std::streamsize n ) {
        std::string message( s, n );
            /* This would add a message to the log instead of cout.
               The log implementation is threadsafe. */
        std::cout << message << std::endl;
        return n;
    }
};

TestSink 스트림 버퍼를 만드는 데 사용할 수 있습니다 (참조 stream_buffer-template). 모든 스레드는 자체 인스턴스를받습니다 TestSink, 그러나 모두 TestSinks 같은 로그에 쓸 것입니다. TestSink 다음과 같이 사용됩니다.

TestSink sink;
boost::iostreams::stream_buffer< TestSink > testbuf( sink, 50000 );
std::ostream out( &testbuf );

for ( int i = 0; i < 10000; i++ )
    out << "test" << i;

out << std::endl;

여기서 중요한 사실은 그 것입니다 TestSink.write 스트림이 플러시 될 때만 호출됩니다 (std::endl 또는 std::flush) 또는 내부 버퍼의 경우 stream_buffer 인스턴스가 가득 차 있습니다 (기본 버퍼 크기는 40000 숯을 잡을 수 없으므로 50000으로 비교할 수 없습니다). 이 프로그램에서 TestSink.write 정확히 한 번 호출됩니다 (출력이 여기에 게시하기에는 너무 길다). 이런 식으로 나는 임시 변수없이 정상적인 형식의 스트림 -io를 사용하여 logmessage를 작성할 수 있으며 스트림을 플러시 할 때 메시지가 한 조각으로 로그에 게시되어 있는지 확인할 수 있습니다.

내가 고려하지 않은 다른 제안/문제가있는 경우 다른 날에 질문을 열 것입니다.

다른 팁

보세요 log4cpp; 그들은 멀티 스레드 지원이 있습니다. 시간을 절약 할 수 있습니다.

log4cpp가 너무 무겁고 대신 boost.iostreams에 도달합니까? 뭐?

고려하고 싶을 수도 있습니다 로그. Posix, Win32 및 Win64의 스레드 안전입니다.

답장. 자신의 응답. 스트림을 플러시하기 전에 오류 로깅에 이것을 사용하고 프로그램 충돌이 발생하는 경우 로깅이 약간 쓸모가 없습니까?

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