簡易ログクラス

8774 ワード

ログを打つことは開発に不可欠な機能であり、ブレークポイントよりもよく使用でき、可用性が広い.
昔、私はいつも習慣的なprintf、cout、ログをコンソールに印刷しました.
私が発見するまで、これはログを見る以外に、何の乱用もありません.
あなたのプログラムはテストのところに提出して、プログラムは意外に現れて、あなたはテストがあなたに崩壊の当時のログを提供することを期待することができなくて、すぐに現場に着くことができなくて、書く輪の目を発動して原因を覚えます.
だから、ログはスクリーンに印刷する以外に、日からファイルまで書きます...
 1     //     .

 2     class Log {

 3     public:

 4         //     .

 5         class End {};

 6 

 7         Log()

 8         {

 9         }

10 

11         ~Log()

12         {

13             _logfile.close();

14         }

15 

16         template <class T>

17         Log &operator <<(const T &value)

18         {

19             if (open())

20             {

21                 _osstream << value;

22             }

23             return *this;

24         }

25 

26         Log &operator <<(const End &e)

27         {

28             auto now = std::chrono::system_clock::now();

29             auto time = std::chrono::system_clock::to_time_t(now);

30             auto str = ctime(&time);

31             _osstream << "
" << str << "
"; 32 const auto &logstr = _osstream.str(); 33 _osstream.str(""); 34 _logfile << logstr << std::endl; 35 cocos2d::log("[log] %s", logstr.c_str()); 36 return *this; 37 } 38 39 private: 40 bool open() 41 { 42 if (!_logfile.is_open()) 43 { 44 auto path = FileUtils::getInstance()->getWritablePath(); 45 auto full = path + "/game.log"; 46 _logfile.open(full, std::ios::app); 47 48 *this << "


-----------------game begin-----------------
" << End(); 49 } 50 return !!_logfile; 51 } 52 std::ofstream _logfile; 53 std::ostringstream _osstream; 54 };

これはC++スタイルのログクラスで、リロード演算子<<によって対流に書き込む.
再ロードEndにより印刷、書き込みが実行する.
このEndは空のクラスで、主に区別して終了作業を実行させるために使用されます.
書き込み内容はstirngstreamで保存され、終了時にクリアされます.
1 extern Log glog;

2 

3 glog << 123 << "|" << "hehehe" << Log::End;

私たちは上にこのように使うことができます.
多くの場合、文字列を一度に書き込むだけです.
 
マクロを定義することができます
extern lutils::Log glog;



#ifdef MMC_LOG

#define LLOG(str) \

    glog << __FILE__ << "|" << __LINE__ << "|" << str << lutils::Log::End()

#else

#define LLOG(str)

#endif

そして必要に応じてLLOG("log 1")..
このLLOGはMMCを通してLOGスイッチで制御...