VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 812|回复: 0

[交流] 孤實現的日誌庫

[复制链接]
74_avatar_middle
在线会员 发表于 2016-10-18 11:32:07 | 显示全部楼层 |阅读模式
本帖最后由 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代碼 全部 移除

先看 一段 示例代碼
  1. #include <fstream>

  2. //#define KING_DEBUG_USE_DEBUG
  3. #define KING_DEBUG_USE_RELEASE

  4. //可選的 替代 tag
  5. #define KING_DEBUG_TAG_TRACE "[TRACE]"
  6. #define KING_DEBUG_TAG_DEBUG "[DEBUG]"
  7. #define KING_DEBUG_TAG_INFO  "[INFO]"
  8. #define KING_DEBUG_TAG_FAULT "[FAULT]"
  9. #define KING_DEBUG_TAG_ERROR "[ERROR]"

  10. //可選 定義
  11. //#define KING_DEBUG_SHOW_FILE 0
  12. //#define KING_DEBUG_SHOW_LINE 0
  13. //#define KING_DEBUG_SHOW_TAG 1
  14. //#define KING_DEBUG_COUT_FLUSH 0

  15. //std::ofstream G_fileLog("log.txt",std::ios::out|std::ios::trunc);
  16. //#define KING_DEBUG_STREAM G_fileLog

  17. #define KING_DEBUG_X
  18. #include <king/debug.hpp>


  19. int main()
  20. {
  21.     KING_DEBUG_X_SECTION(
  22.         puts("KING_DEBUG_X_SECTION");
  23.     )

  24.     KING_DEBUG_SECTION(
  25.                        puts("KING_DEBUG_SECTION");

  26.     )


  27.     KING_TRACE("test "<<KING_DEBUG_TAG_TRACE<<" lv = "<<_KING_DEBUG_LV_TRACE)
  28.     KING_DEBUG("test "<<KING_DEBUG_TAG_DEBUG<<" lv = "<<_KING_DEBUG_LV_DEBUG)
  29.     KING_INFO("test "<<KING_DEBUG_TAG_INFO<<" lv = "<<_KING_DEBUG_LV_INFO)
  30.     KING_FAULT("test "<<KING_DEBUG_TAG_FAULT<<" lv = "<<_KING_DEBUG_LV_FAULT)
  31.     KING_ERROR("test "<<KING_DEBUG_TAG_ERROR<<" lv = "<<_KING_DEBUG_LV_ERROR)


  32.     KING_FORMAT_TRACE("test format %s lv = %d",KING_DEBUG_TAG_TRACE,_KING_DEBUG_LV_TRACE);
  33.     KING_FORMAT_DEBUG("test format %s lv = %d",KING_DEBUG_TAG_DEBUG,_KING_DEBUG_LV_DEBUG);
  34.     KING_FORMAT_INFO("test format %s lv = %d",KING_DEBUG_TAG_INFO,_KING_DEBUG_LV_INFO);
  35.     KING_FORMAT_FAULT("test format %s lv = %d",KING_DEBUG_TAG_FAULT,_KING_DEBUG_LV_FAULT);
  36.     KING_FORMAT_ERROR("test format %s lv = %d",KING_DEBUG_TAG_ERROR,_KING_DEBUG_LV_ERROR);

  37.     return 0;
  38. }
复制代码

KING_XXX 使用 c++ std::cout 的 << 風格 輸出 日誌到相應 等級 日誌
KING_FORMAT_XXX 使用 c printf 風格 寫入日誌

  1. #include <king/debug.hpp>
复制代码

是需要包含的 實現文件 在此之前 定義指定的 宏 可以 改變 宏行為

日誌等級存在如下 幾種
  1. KING_DEBUG_TRACE
  2. KING_DEBUG_DEBUG
  3. KING_DEBUG_INFO
  4. KING_DEBUG_FAULT
  5. 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 可將 日誌 輸出 到文件



所有 輸出 默認時 不保證 線程 安全的 然存在如下兩個宏
  1. KING_DEBUG_LOCK
  2. KING_DEBUG_UNLOCK
复制代码

在 include 定義 這兩個宏 實現 你自己的 同步操作 KING_DEBUG_LOCK 在日誌輸出前被調用 KING_DEBUG_UNLOCK在日誌輸出後被調用

https://github.com/zuiwuchang/ki ... lude/king/Debug.hpp

Debug.zip

1.71 KB, 下载次数: 0, 下载积分: 驿站币 -1





上一篇:Win32程序设计 1-窗口框架基础 2-名称前缀绘图
下一篇:自动更新文件头标记
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-25 13:00

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表