获取 Log4Qt 中的 logger

高效程序员

共 7271字,需浏览 15分钟

 ·

2021-04-03 22:21

在 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」,获取海量学习资源

浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报