获取 Log4Qt 中的 logger
在 Log4Qt 中,有一个很重要的类 - Logger
,用于提供日志服务。由于 Logger 是分层架构中的核心对象,处于最上层,所以要想使用 Log4Qt 日志框架,这个对象必不可少(强制性要求)。
要获取 logger,可以使用以下几种方式:
调用
Logger::logger()
或者LogManager::logger()
使用
LOG4QT_DECLARE_QCLASS_LOGGER
使用
LOG4QT_DECLARE_STATIC_LOGGER
来看一些简单的示例,了解下如何使用它们。
1
调用 Logger::logger() 或者 LogManager::logger()
通过调用 Logger::logger()
或者 LogManager::logger()
并将类名作为参数,可以检索指向 logger
的指针。
来看 Log4Qt 的一个简单使用,通过基础配置和 rootLogger()
(根 logger,是 Logger::logger()
的一个特殊实现)来完成:
// main.cpp
#include <QCoreApplication>
#include <log4qt/basicconfigurator.h>
#include <log4qt/logger.h>
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();
}
输出如下:
4 [0x000002015b78f880] DEBUG root - Hello, Log4Qt!
2
使用 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
,指针被存储以在随后的调用中返回。
编写一个QObject
派生类,然后添加 LOG4QT_DECLARE_QCLASS_LOGGER
宏:
// my_logger.h
#ifndef MY_LOGGER_H
#define MY_LOGGER_H
#include <QObject>
#include <log4qt/logger.h>
class MyLogger : public QObject
{
Q_OBJECT
LOG4QT_DECLARE_QCLASS_LOGGER
public:
void debug(const QString &message) {
logger()->debug(message);
}
};
#endif // MY_LOGGER_H
然后,打印一条简单的日志信息:
// main.cpp
#include <QCoreApplication>
#include <log4qt/basicconfigurator.h>
#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();
}
输出如下:
4 [0x0000015a036ebf20] DEBUG MyLogger - Hello, Log4Qt!
3
使用 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
稍作修改:
// my_logger.h
#ifndef MY_LOGGER_H
#define MY_LOGGER_H
#include <log4qt/logger.h>
LOG4QT_DECLARE_STATIC_LOGGER(logger, MyLogger)
class MyLogger
{
public:
void debug(const QString &message) {
logger()->debug(message);
}
};
#endif // MY_LOGGER_H
输出如下:
5 [0x00000242cca31490] DEBUG MyLogger - Hello, Log4Qt!
·················· END ··················
关注后回复「1024」,获取海量学习资源