2011-07-26 4 views
4

현재 C++ 응용 프로그램 리팩토링 중입니다. 내가C++로 사용자 정의 로깅하는 방법

같은 매크로를 사용하기 전에
LOG("something interesting") // 1 
LOG("something ended")  // 2 
LOG("foo: " << bar)   // 3 

내 생각은 그래서 지금 같은 Log 클래스 작성했다 : 그들은 시작할 때

Log(std::string _init_message): 
    init_message(_init_message) 
{ PrintLogLine(init_message + " ...");} 
~Log() 
{ PrintLogLine(init_message + " done.");} 

특정 작업 (의 "자동"로깅을 얻기를, 즉 + 추가 중지 타이밍 등) 내가)이 경우 3 작동하게하는 방법을 정의하는 것입니다 고군분투

void ActionXYZ() { 
    Log log("xyz"); 
    // do stuff 
} 

처럼 사용하는 경우. Java에서는 컴파일러가 자동으로 문자열 작성을 담당하므로 하나의 String 인수를 취하는 메소드를 사용할 수 있습니다. C++에서 어떤 가능성이 있습니까?

하나의 옵션처럼 사용할 수 있도록 작동시킬 수 있습니까?

// in "do stuff" 
log("foo:" + bar); // OR 
log << "foo:" << bar; 

답변

3

의견에서 언급했듯이 Boost.Format을 사용할 수 있습니다. 또한 int-to-string 변환 문제와 관련하여 도움이됩니다. 조금만 자세하게 표시 될 수 있습니다. .str()을 호출하여 std::string 생성자를 호출하지 않으려면 boost::format을 직접 받아 들일 수 있습니다.

Log log(boost::format("foo %1% bar") % 42); // with Log(boost::format) 
Log log((boost::format("foo %1% bar") % 42).str()); // with only Log(std::string) 

자세한 내용은 Boost.Format documentation을 참조하십시오.

1

즉각적인 가능성을 염두에 두십시오. 첫 번째는 표준 : : 문자열 추기을 활용하는 것입니다

Log log("foo:", bar); 
+1

또는 Boost.Format. –

+0

이미 첫 번째 옵션을 시도했지만 적용 가능성은 제한적으로 보입니다. 이'log (std :: string ("foo :") + 2 + "units");은 컴파일하지 않습니다 ... – dcn

+0

@dcn, 원래 질문에서 언급 했어야합니다. –

0

당신은 정말 당신의 로깅 Boost.Log 사용을 고려해야합니다 :

Log log(std::string("foo:") + bar); 

두 번째는 추가 매개 변수를 더 log 생성자를 만드는 것입니다. 로깅은 복잡한 일일 수 있습니다. 완벽하게 구현 된 구현을 얻는 것이 유용합니다.

0

std :: strstream에서 상속하는 로깅 클래스를 만들 수 있습니다.

class Mstream : public std::strstream 
{ 
    public: 
    Mstream() : std::strstream(Buffer = new char[BUFLEN], BUFLEN, ios::out); 
    ostream& endf(ostream& s); 
    void Write(); 

    private: 
    char* Buffer; 
}; 

지금 당신은 같은 출력을 기록 할 수 있습니다, ENDF에서

Mstream m; 
m <<"Foo"<<s<<endf; 

(&의 ostream에) 당신은) (Mstream에 ostream에 캐스팅 및 쓰기를 호출 할 수 있습니다. Write()에서는 출력 형식을 지정하고 콘솔이나 파일로 출력합니다.

관련 문제