|
本帖最后由 zuiwuchang 于 2016-10-18 11:36 编辑
c/c++ 中一直沒有 孤鍾意的 日誌庫 boost1.54開始 提供了一個 boost::log 才少有 解決 此問題 然 boost::log 雖然強大 然不能滿足 孤的需求
對於 應用程序 日誌 使用 boost::log 應該是 最好的 選擇 (http://www.boost.org/doc/libs/1_62_0/libs/log/doc/html/index.html)
然 作為 調試用的 日誌 輸出 選擇boost::log 就 太過不明智了
首先 boost::log 需要 依賴其它幾個 需要編譯的 boost組件 故不編譯 boost 無法使用
boost 環境 太大 對於 一些 短小的 代碼 加入 boost::log 調試 不太 合宜
故 孤 實現了一個調試用的 日誌輸出 庫
孤所有實現 全部使用 宏 在release 時 去掉 宏標記 即可 將 debug代碼 全部 移除
先看 一段 示例代碼
- #include <fstream>
- //#define KING_DEBUG_USE_DEBUG
- #define KING_DEBUG_USE_RELEASE
- //可選的 替代 tag
- #define KING_DEBUG_TAG_TRACE "[TRACE]"
- #define KING_DEBUG_TAG_DEBUG "[DEBUG]"
- #define KING_DEBUG_TAG_INFO "[INFO]"
- #define KING_DEBUG_TAG_FAULT "[FAULT]"
- #define KING_DEBUG_TAG_ERROR "[ERROR]"
- //可選 定義
- //#define KING_DEBUG_SHOW_FILE 0
- //#define KING_DEBUG_SHOW_LINE 0
- //#define KING_DEBUG_SHOW_TAG 1
- //#define KING_DEBUG_COUT_FLUSH 0
- //std::ofstream G_fileLog("log.txt",std::ios::out|std::ios::trunc);
- //#define KING_DEBUG_STREAM G_fileLog
- #define KING_DEBUG_X
- #include <king/debug.hpp>
- int main()
- {
- KING_DEBUG_X_SECTION(
- puts("KING_DEBUG_X_SECTION");
- )
- KING_DEBUG_SECTION(
- puts("KING_DEBUG_SECTION");
- )
- KING_TRACE("test "<<KING_DEBUG_TAG_TRACE<<" lv = "<<_KING_DEBUG_LV_TRACE)
- KING_DEBUG("test "<<KING_DEBUG_TAG_DEBUG<<" lv = "<<_KING_DEBUG_LV_DEBUG)
- KING_INFO("test "<<KING_DEBUG_TAG_INFO<<" lv = "<<_KING_DEBUG_LV_INFO)
- KING_FAULT("test "<<KING_DEBUG_TAG_FAULT<<" lv = "<<_KING_DEBUG_LV_FAULT)
- KING_ERROR("test "<<KING_DEBUG_TAG_ERROR<<" lv = "<<_KING_DEBUG_LV_ERROR)
- KING_FORMAT_TRACE("test format %s lv = %d",KING_DEBUG_TAG_TRACE,_KING_DEBUG_LV_TRACE);
- KING_FORMAT_DEBUG("test format %s lv = %d",KING_DEBUG_TAG_DEBUG,_KING_DEBUG_LV_DEBUG);
- KING_FORMAT_INFO("test format %s lv = %d",KING_DEBUG_TAG_INFO,_KING_DEBUG_LV_INFO);
- KING_FORMAT_FAULT("test format %s lv = %d",KING_DEBUG_TAG_FAULT,_KING_DEBUG_LV_FAULT);
- KING_FORMAT_ERROR("test format %s lv = %d",KING_DEBUG_TAG_ERROR,_KING_DEBUG_LV_ERROR);
- return 0;
- }
复制代码
KING_XXX 使用 c++ std::cout 的 << 風格 輸出 日誌到相應 等級 日誌
KING_FORMAT_XXX 使用 c printf 風格 寫入日誌
- #include <king/debug.hpp>
复制代码
是需要包含的 實現文件 在此之前 定義指定的 宏 可以 改變 宏行為
日誌等級存在如下 幾種
- KING_DEBUG_TRACE
- KING_DEBUG_DEBUG
- KING_DEBUG_INFO
- KING_DEBUG_FAULT
- KING_DEBUG_ERROR
复制代码
在 include debug.hpp 之前 必須先定義 相應等級 否則 所有 相應宏 都被替換為空 (如 #define KING_DEBUG_ERROR)
如果定義了 KING_DEBUG_USE_RELEASE KING_DEBUG_FAULT KING_DEBUG_ERROR 將被自動啟用
如果定義了 KING_DEBUG_USE_DEBUG 所有日誌等級 都被啟用
KING_XXX_SECTION 定義 一段 代碼 只有在 相應 日誌等級下 才被啟用
其實 就是
#ifdef KING_DEBUG_XXX
XXX
#endif
的簡寫罷了
KING_DEBUG_X_SECTION 是和日誌等級 無關 而在 定義了 KING_DEBUG_X 時 被 啟用 的 代碼
KING_DEBUG_STREAM 是一個 默認定義 為 std::cout 的 輸出流 可以將它 替換為其它任何 重載了 << 操作符的 示例 如 示例中 註釋掉的 G_fileLog 可將 日誌 輸出 到文件
所有 輸出 默認時 不保證 線程 安全的 然存在如下兩個宏
- KING_DEBUG_LOCK
- KING_DEBUG_UNLOCK
复制代码
在 include 定義 這兩個宏 實現 你自己的 同步操作 KING_DEBUG_LOCK 在日誌輸出前被調用 KING_DEBUG_UNLOCK在日誌輸出後被調用
https://github.com/zuiwuchang/ki ... lude/king/Debug.hpp |
上一篇: Win32程序设计 1-窗口框架基础 2-名称前缀绘图下一篇: 自动更新文件头标记
|