在《C++ 日誌框架》一文中,我們介紹了一些主流的 C++ 日誌框架。至於選擇哪一個,可以參考該文中的 日誌選擇標準 小節內容。
對於很多人來說,第一選擇會是 Log4cpp、log4cplus、log4cxx、Log4Qt 中的一個,因為它們均移植自 Java 中著名的日誌框架 - Log4j,並且保持了 API 上的一致。

通過使用 Log4j,我們可以:
- 控制日誌的輸出格式;
- 通過定義日誌信息的級別,來更加細緻地控制日誌的生成過程;
- 控制日誌信息的輸出位置,例如:文件、控制檯、數據庫等;
- ……
最不可思議的是,這些都可以通過配置文件來靈活地控制,而無需修改源代碼。
使用 Log4j 系列的最大好處在於,只要熟練掌握其中一個,其它的幾個都可以信手拈來。即使是不同的語言環境,配置也不會有太大區別,並且使用方式也相當簡單。
衍生品這麼多,最終我選擇了 Log4Qt,原因很簡單:我的第一身份是 Qter。其實選擇哪個都無所謂,因為它們是一家,而我們主要是 學習 Log4j 的思想。
Log4Qt 簡介
Log4Qt 是 Apache Log4j 的 Qt 移植版,主要用於記錄日誌。
由於 Log4Qt 是基於 Qt 編寫的,所以它也繼承了 Qt 的跨平臺特性。也就是說,可以將其用於 Windows、Linux、以及 MacOS 平臺上。
- 主頁:http://log4qt.sourceforge.net
- 文檔:http://log4qt.sourceforge.net/html/index.html
由於 Log4Qt 的開發在 2009 年就終止了,所以其官網提供的源碼 僅支持 Qt4:
- for Qt4:https://sourceforge.net/projects/log4qt
但值得慶祝的是,有人提供了一個 兼容 Qt5 的版本:
- for Qt5:https://github.com/MEONMedical/Log4Qt
這個升級版很棒,不但可以將 Log4Qt 源碼添加至項目中,而且還可以將其編譯為庫,並且它還同時支持 CMake 和 qmake。
最重要的是,它還在持續升級,並且在老版本(for Qt4)的基礎上添加了很多新 Feature。
Log4Qt 分層架構
Log4Qt API 設計為 分層結構,其中每一層提供了執行不同任務的不同對象,這種設計為未來的發展提供了很好的可擴展性。
Log4Qt 對象分為:
- 核心對象:使用框架必不可少的強制性對象。
- 支持對象:幫助核心對象完成重要的任務。

核心對象:
- Logger 對象:處於最上層,負責捕獲日誌信息。
- Appender 對象:負責將日誌信息輸出到各種目的地,例如:控制檯、文件、數據庫等。
- Layout 對象:用於控制日誌輸出格式,該層有助於以可讀形式記錄信息。
支持對象:
- Level 對象:定義日誌信息的優先級:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。
- LogManager:負責從配置文件或配置類中讀取初始配置參數。
- Filter 對象:用於分析日誌信息,並進一步決定是否需要記錄信息。
- ObjectRenderer:用於向傳遞的各種 Logger 對象提供字符串表示(在 Log4Qt 中,尚未用到)。
編譯 Log4Qt
下載 Log4Qt(for Qt5),進行解壓縮,目錄結構如下所示:
可以看到,同時支持 CMake 和 qmake。其中,src 是需要特別關注的目錄,裡面包含了 Log4Qt 的所有源碼。
由於代碼結構已經組織好了,所以編譯 Log4Qt(以 Windows 為例)非常簡單:
- 使用 Qt Creator 打開 log4qt.pro。
- 執行 qmake -> 構建。
成功之後,在構建目錄下會生成 log4qt.lib、log4qt.dll 以及相應的示例程序。
配置 Log4Qt
要使用 Log4Qt,有兩種方式:將 Log4Qt 源碼添加至項目中,或者將其當做第三方庫來使用。
將 Log4Qt 源碼添加至項目中
在 Log4Qt-master/src/log4qt 目錄中,有一個很重要的文件 - log4qt.pri,通過它可以很容易地 將 Log4Qt 的源碼添加至項目中。
僅需在 .pro(自己的工程文件)添加如下配置:
將 Log4Qt 作為第三方庫使用
上面說過,編譯 Log4Qt 後,會生成相應的庫。所以如果想 將其作為第三方庫來使用 的話,也很方便。
僅需在 .pro(自己的工程文件)添加如下配置:
閱讀更多 奈優子 的文章