문제
여러 스레드에서 로깅을위한 간단한 클래스를 구현하고 싶습니다. 물건을 기록하려는 각 객체는 일반적인 연산자를 사용하는 데 메시지를 작성할 수있는 타조 객체를 받는다는 아이디어가 있습니다. 원하는 동작은 스트림이 플러시 될 때 메시지가 로그에 추가된다는 것입니다. 이렇게하면 다른 스레드의 메시지로 메시지가 중단되지 않습니다. 임시 스트링 스트림을 사용하여 메시지를 저장하지 않으려 고합니다. 내가 알 수 있듯이, 이것을 달성하는 표준 방법은 내 자신의 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를 작성할 수 있으며 스트림을 플러시 할 때 메시지가 한 조각으로 로그에 게시되어 있는지 확인할 수 있습니다.
내가 고려하지 않은 다른 제안/문제가있는 경우 다른 날에 질문을 열 것입니다.