一篇學(xué)會(huì)使用 QSettings 配置 Log4Qt
本文轉(zhuǎn)載自微信公眾號(hào)「高效程序員」,作者Waleon。轉(zhuǎn)載本文請(qǐng)聯(lián)系高效程序員公眾號(hào)。
在 Log4Qt 的初始化過程中,除了會(huì)使用環(huán)境變量之外,它還會(huì)通過 QSettings 讀取配置。也就是說,在使用 Logger 之前,需要針對(duì) QSettings 做一些基本設(shè)置:
- 組織名和應(yīng)用名:通過 QCoreApplication::setOrganizationName() 和 QCoreApplication::setApplicationName() 指定,并且這些名稱需要能被 QSettings 找到。
- 分組:需要有一個(gè)名為 Log4Qt 的分組,在這個(gè)組下面還要有一個(gè)子組 Properties。
- 配置內(nèi)容:需要符合 Log4Qt 配置語法規(guī)則。
在 Windows 中,可以在注冊(cè)表中添加相應(yīng)的配置。例如,路徑:計(jì)算機(jī)\HKEY_CURRENT_USER\SOFTWARE\MyOrganisation\MyApplication\Log4Qt\Properties:
當(dāng)然,手動(dòng)添加比較麻煩。有一個(gè)簡(jiǎn)單的辦法,就是下面所說的用程序設(shè)置 - setupLog4Qt()。
1使用 QSettings 配置
為了實(shí)現(xiàn)這個(gè)功能,可以自定義 QCoreApplication:
- #ifndef MY_APPLICATION_H
- #define MY_APPLICATION_H
- #include <QCoreApplication>
- class MyApplication : public QCoreApplication
- {
- Q_OBJECT
- public:
- MyApplication(int &argc, char **argv);
- ~MyApplication();
- void setupLog4Qt();
- };
- #endif // MY_APPLICATION_H
在構(gòu)造函數(shù)中,為應(yīng)用程序設(shè)置一些基本信息 - OrganizationName、ApplicationName 以及 OrganizationDomain,以允許 QSettings 能正確的進(jìn)行讀寫。
在 setupLog4Qt() 中,我們創(chuàng)建了一個(gè)組“Log4Qt/Properties”,并且對(duì) rootLogger 進(jìn)行了一些簡(jiǎn)單的配置:
- #include "my_application.h"
- #include <log4qt/logger.h>
- #include <QSettings>
- MyApplication::MyApplication(int &argc, char **argv)
- : QCoreApplication(argc, argv)
- {
- // 設(shè)置應(yīng)用程序數(shù)據(jù),以允許 Log4Qt 初始化讀取正確的值
- setOrganizationName("MyOrganisation");
- setApplicationName("MyApplication");
- setOrganizationDomain("https://github.com/Waleon");
- }
- MyApplication::~MyApplication()
- {
- }
- void MyApplication::setupLog4Qt()
- {
- QSettings s;
- QStringList groups = s.childGroups();
- if (!groups.contains("Log4Qt")) {
- // 將 Log4Qt 的日志級(jí)別設(shè)置為 INFO
- s.beginGroup("Log4Qt");
- s.setValue("Debug", "INFO");
- // 配置日志輸出至文件 logger.log,使用級(jí)別 INFO
- s.beginGroup("Properties");
- s.setValue("log4j.rootLogger", "INFO, logFile");
- s.setValue("log4j.appender.logFile", "org.apache.log4j.FileAppender");
- s.setValue("log4j.appender.logFile.file", "logger.log");
- s.setValue("log4j.appender.logFile.layout", "org.apache.log4j.TTCCLayout");
- s.setValue("log4j.appender.logFile.layout.dateFormat", "ISO8601");
- }
- }
這樣一來,通過調(diào)用 setupLog4Qt() 就能夠設(shè)置 Log4Qt 的配置信息了:
- #include <QCoreApplication>
- #include <log4qt/logger.h>
- #include "my_application.h"
- int main(int argc, char *argv[])
- {
- MyApplication app(argc, argv);
- // 設(shè)置配置信息
- app.setupLog4Qt();
- // 現(xiàn)在,可以使用 logger 了。
- Log4Qt::Logger* logger = Log4Qt::Logger::rootLogger();
- logger->trace("This is a trace message.");
- logger->debug("This is a debug message.");
- logger->info("This is a info message.");
- logger->warn("This is a warn message.");
- logger->error("This is a error message.");
- logger->fatal("This is a fatal message.");
- return 0;
- }
為了更好地說明效果,我們分以下幾步進(jìn)行:
在運(yùn)行程序之前,打開注冊(cè)表,這時(shí)并不會(huì)有 Log4Qt 相關(guān)的配置。
第一次運(yùn)行程序之后,重新打開注冊(cè)表(或者按 F5 刷新),你會(huì)發(fā)現(xiàn) Log4Qt 所需的配置已經(jīng)生成了,并且會(huì)輸出日志。
刪除或者注釋掉 setupLog4Qt() 部分(注冊(cè)表中的配置已經(jīng)有了,不需要再次設(shè)置了),再次運(yùn)行程序,依然會(huì)輸出日志。
根據(jù)配置,在運(yùn)行程序時(shí),會(huì)生成一個(gè)名為 logger.log 的日志文件:
可以看到,它里面包含了所有的日志記錄。