使用?QSettings 配置?Log4Qt

在 Log4Qt 的初始化過程中,除了會使用環(huán)境變量之外,它還會通過 QSettings 讀取配置。也就是說,在使用 Logger 之前,需要針對 QSettings 做一些基本設(shè)置:
組織名和應(yīng)用名:通過
QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()指定,并且這些名稱需要能被QSettings找到。分組:需要有一個名為 Log4Qt 的分組,在這個組下面還要有一個子組
Properties。配置內(nèi)容:需要符合 Log4Qt 配置語法規(guī)則。
在 Windows 中,可以在注冊表中添加相應(yīng)的配置。例如,路徑:計算機\HKEY_CURRENT_USER\SOFTWARE\MyOrganisation\MyApplication\Log4Qt\Properties:

當然,手動添加比較麻煩。有一個簡單的辦法,就是下面所說的用程序設(shè)置 - setupLog4Qt()。
1
使用 QSettings 配置
為了實現(xiàn)這個功能,可以自定義 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 能正確的進行讀寫。
在 setupLog4Qt() 中,我們創(chuàng)建了一個組“Log4Qt/Properties”,并且對 rootLogger 進行了一些簡單的配置:
#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 的日志級別設(shè)置為 INFO
s.beginGroup("Log4Qt");
s.setValue("Debug", "INFO");
// 配置日志輸出至文件 logger.log,使用級別 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;
}
為了更好地說明效果,我們分以下幾步進行:
在運行程序之前,打開注冊表,這時并不會有 Log4Qt 相關(guān)的配置。
第一次運行程序之后,重新打開注冊表(或者按 F5 刷新),你會發(fā)現(xiàn) Log4Qt 所需的配置已經(jīng)生成了,并且會輸出日志。
刪除或者注釋掉 setupLog4Qt() 部分(注冊表中的配置已經(jīng)有了,不需要再次設(shè)置了),再次運行程序,依然會輸出日志。
根據(jù)配置,在運行程序時,會生成一個名為 logger.log 的日志文件:

可以看到,它里面包含了所有的日志記錄。




關(guān)注公眾號「高效程序員」??,一起優(yōu)秀!
