获取 Log4Qt 中的 logger

作者: 一去、二三里
个人微信号: 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!

你可能感兴趣的:(Log4Qt,Log4Qt-日志,Qt,Qt-日志,Qt-log)