作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员
在 Log4Qt 中,有一个很重要的类 - Logger,用于提供日志服务。那么,如何获取 logger 呢?
关于这部分,Log4Qt 中有一个简单的描述:
Request a logger by either calling Log4Qt::Logger::logger or using LOG4QT_DECLARE_QCLASS_LOGGER
其实,除了这两种方式外,还有另一种方式 LOG4QT_DECLARE_STATIC_LOGGER
可供选择。
Log4Qt::Logger::logger
通过基础配置和 rootLogger,完成 Log4Qt 的一个简单使用:
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 一个简单的基础配置
Log4Qt::BasicConfigurator::configure();
// 获取 rootLogger
Log4Qt::Logger* logger = Log4Qt::Logger::rootLogger();
// 输出
logger->debug("Hello, Log4Qt!");
return a.exec();
}
输出如下:
16 [0x0000026c077bf3c0] DEBUG root - Hello, Log4Qt!
LOG4QT_DECLARE_QCLASS_LOGGER
关于 LOG4QT_DECLARE_QCLASS_LOGGER
,先来了解下它是如何定义的(在 logger.h
中):
#define LOG4QT_DECLARE_QCLASS_LOGGER \
private: \
mutable Log4Qt::ClassLogger mLog4QtClassLogger; \
public: \
inline Log4Qt::Logger *logger() const \
{ return mLog4QtClassLogger.logger(this); } \
private:
可以看到,该宏声明了一个成员函数,用于检索使用它的类的 Logger。在第一次调用时,通过调用 Logger::logger(const char *pName)
来请求 Logger,指针被存储以在随后的调用中返回。
看一个简单的示例,了解下如何使用它:
#ifndef MY_LOGGER_H
#define MY_LOGGER_H
#include
#include
class MyLogger : public QObject
{
Q_OBJECT
LOG4QT_DECLARE_QCLASS_LOGGER
public:
MyLogger() {}
void debug(const QString &message) { logger()->debug(message); }
};
#endif // MY_LOGGER_H
main.cpp 内容如下:
#include
#include
#include "my_logger.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 一个简单的基础配置
Log4Qt::BasicConfigurator::configure();
// 使用自定义的 logger
MyLogger logger;
logger.debug("Hello, Log4Qt!");
return a.exec();
}
输出如下:
16 [0x00000167090c2040] DEBUG MyLogger - Hello, Log4Qt!
LOG4QT_DECLARE_STATIC_LOGGER
和 LOG4QT_DECLARE_QCLASS_LOGGER
一样,LOG4QT_DECLARE_STATIC_LOGGER
也被定义在 logger.h
中:
#define LOG4QT_DECLARE_STATIC_LOGGER(FUNCTION, CLASS) \
static Log4Qt::Logger *FUNCTION() \
{ \
static Log4Qt::Logger * p_logger(Log4Qt::Logger::logger(#CLASS )); \
return p_logger; \
}
该宏声明了一个静态函数 FUNCTION
,该函数返回一个指向 Logger
的指针。在第一次调用时,通过调用 Logger::logger( #CLASS )
来请求 Logger,指针被存储以在随后的调用中返回。
使用也非常简单,对上面的 MyLogger
稍作修改:
#ifndef MY_LOGGER_H
#define MY_LOGGER_H
#include
#include
LOG4QT_DECLARE_STATIC_LOGGER(logger, MyLogger)
class MyLogger : public QObject
{
Q_OBJECT
public:
MyLogger() {}
void debug(const QString &message) { logger()->debug(message); }
};
#endif // MY_LOGGER_H
输出如下:
16 [0x0000020574392900] DEBUG MyLogger - Hello, Log4Qt!