C++의 약간의 앱으로 살짝 사용하기 쉬운 간이 로거의 구현 예
개요
"있는 것"이라고 말한 토알있는 몇 가지 이야기 :
小さなサンプルアプリ作る
↓
でもまあロガーくらい入れて作りたい
↓
boost::log入れるのめんどくさいしちょっとしたやつ
↓
気づけばいつものロガーコードを書いている
이런 때에 쓰고 있는 간이 로거의 실장 예를 소개하고 싶다.
구현 예
조금 실용상기용으로 하기 위한 주문도 넣어도 150 가량 정도의 것. 본질적으로는 100 가량 정도.
小さなサンプルアプリ作る
↓
でもまあロガーくらい入れて作りたい
↓
boost::log入れるのめんどくさいしちょっとしたやつ
↓
気づけばいつものロガーコードを書いている
조금 실용상기용으로 하기 위한 주문도 넣어도 150 가량 정도의 것. 본질적으로는 100 가량 정도.
요점은 후술로서, 우선 사용법↓.
사용법
//↓これを定義すると easy_logger は LOGI などで何も出力しなくなります。
//#define DISABLE_USAGI_LOG_EASY_LOGGER
#include <usagi/log/easy_logger.hxx>
#include <thread>
#include <random>
auto main() -> int
{
// 単純な使い方
LOGI << "test1";
// 複数の operator<< で繋いでも綺麗に出力されます。
LOGD << "test2 multiple output operators in the one line " << 12345 << ' ' << 1.2345f;
// マルチスレッドで競争的にログ出力しても分断されずに綺麗に出力されます。
std::random_device r;
auto a = std::thread( [&]{ for ( auto n = 0; n < 16; ++n ) LOGW << "/(^o^)\ " << r() << ' ' << r()<< ' ' << r() << ' ' << ' ' << r(); } );
std::thread( [&]{ for ( auto n = 0; n < 16; ++n ) LOGE << "\(^o^)/ " << r() << ' ' << r()<< ' ' << r() << ' ' << ' ' << r(); } ).join();
a.join();
}
실행 결과
ANSI escape code 에 대응한 현대적인 단말이라고 다채롭게 표시됩니다.
미대응 단말이라면 불필요한 주문이 깜빡 표시될지도 모릅니다만, 실용상은 어떻게 하는 것은 없겠지요(´・ω・`)
구현의 요점
log( "hoge", 123, ... );
그렇다고 어쩐지 다사 느낀다 ( variadic template 를 사용하면 간단하게 구현할 수 있어 , 안전하고 낭비인 오브젝트도 불필요한 것은 좋지만...)cout
로 출력하도록 operator<<
로 외형 깨끗하게 로그를 출력하고 싶다.operator<<
를 받고 로그를 출력할 수 있는 객체가 필요하다 (≃ operator<<
class
__FILE__
__LINE__
__PRETTY_FUNCTION__
의 결합성 → 직접. .operator<<
는 처리계에 의해 분해능이 불충분cout
또는.cout
or std::chrono::steady_clock
( Windows ) 를 구분하면 실용 상당히 곤란하지 않게 된다 → usagi::chrono::default_clock ( 이런 일도 있을까 ) .boost::timer::cpu_timer
는 있지만 아무것도 하지 않는 로그 오브젝트에 boost::chrono::steady_clock
초고 이후에 추가한 변경
Reference
이 문제에 관하여(C++의 약간의 앱으로 살짝 사용하기 쉬운 간이 로거의 구현 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/usagi/items/d4aec8d3f748f4ba9d6a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)