Qt日志库Log4Qt的使用,支持文件名/行号/函数名的log打印输出

简介: Qt日志库Log4Qt的使用,支持文件名/行号/函数名的log打印输出

下载地址


https://github.com/MEONMedical/Log4Qt



工程源码v1.5.1版本有几处需要修改


1、用户自己的.pro文件新增以下内容

#################日志库的引入########################
##https://github.com/MEONMedical/Log4Qt
include(Log4Qt-1.5.1/src/log4qt/log4qt.pri)
include(Log4Qt-1.5.1/build.pri)
include(Log4Qt-1.5.1/g++.pri)
QT          += concurrent
DEFINES     += LOG4QT_LIBRARY
DEFINES     += LOG4QT_EXPORT
INCLUDEPATH += Log4Qt-1.5.1/src/
INCLUDEPATH += Log4Qt-1.5.1/src/log4qt
DEPENDPATH  += Log4Qt-1.5.1/src/log4qt
###################################################


2、log4qt源码dailyfileappender.cpp需要添加头文件:


#include <QStringBuilder> //firecat add



3、Log4Qt-1.5.1\src\log4qt\ttcclayout.h:118, enum DateFormat has errors


已定义的变量ABSOLUTE和RELATIVE,会和Windows的头文件定义冲突。


C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\wingdi.h
/ * Coordinate Modes * /
#define ABSOLUTE 1
#define RELATIVE 2

请把enum DateFormat的变量ABSOLUTE和RELATIVE重命名。



属性相关的源文件查阅

Log4Qt-1.5.1\src\log4qt\patternlayout.h
 * \brief The class PatternLayout outputs a logging event based on a
 *        pattern string.
        \li c{section_count} : logger name with optional parameter section_count. Section count from end of logger name, sections delimiter is "::";
        \li d{format_string} : date with optional parameters in "{}"-brackets which used by QDateTime::toString();
        \li m : message
        \li p : level name
        \li r : relative date/time to start application
        \li t : thread name
        \li x : ndc name
        \li X : mdc name
        \li F : file name
        \li M : method name
        \li L : line number
Log4Qt-1.5.1\src\log4qt\helpers\patternformatter.cpp
void PatternFormatter::createConverter(QChar character,
                                       Log4Qt::FormattingInfo formattingInfo,
                                       const QString &option)
{
    Q_ASSERT_X(mConversionCharacters.indexOf(character) >= 0, "PatternFormatter::createConverter", "Unknown conversion character" );
    LogError e("Creating Converter for character '%1' min %2, max %3, left %4 and option '%5'");
    e << QString(character)
      << FormattingInfo::intToString(formattingInfo.mMinLength)
      << FormattingInfo::intToString(formattingInfo.mMaxLength)
      << formattingInfo.mLeftAligned
      << option;
    logger()->trace(e);
    switch (character.toLatin1())
    {
    case 'c':
        mPatternConverters << new LoggepatternConverter(formattingInfo,
                           parseIntegeoption(option));
        break;
    case 'd':
    {
        QString format = option;
        if (option.isEmpty())
            format = QStringLiteral("ISO8601");
        else if (option == QLatin1String("locale:long"))
            format = QLocale().dateTimeFormat(QLocale::LongFormat);
        else if (option == QLatin1String("locale:short"))
            format = QLocale().dateTimeFormat(QLocale::ShortFormat);
        else if (option == QLatin1String("locale:narrow"))
            format = QLocale().dateTimeFormat(QLocale::NarrowFormat);
        else if (option == QLatin1String("locale"))
            format = QLocale().dateTimeFormat(QLocale::ShortFormat);
        mPatternConverters << new DatePatternConverter(formattingInfo,
                                                       format);
        break;
    }
    case 'm':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::MESSAGE_CONVERTER);
        break;
    case 'p':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::LEVEL_CONVERTER);
        break;
    case 'r':
        mPatternConverters << new DatePatternConverter(formattingInfo,
                                                       QStringLiteral("RELATIVE"));
        break;
    case 't':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::THREAD_CONVERTER);
        break;
    case 'x':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::NDC_CONVERTER);
        break;
    case 'X':
        mPatternConverters << new MDCPatternConverter(formattingInfo,
                                                      option);
        break;
    case 'F':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::FILENAME_CONVERTER);
        break;
    case 'M':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::FUNCTIONNAME_CONVERTER);
        break;
    case 'L':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::LINENUMBER_CONVERTER);
        break;
    case 'l':
        mPatternConverters << new BasicPatternConverter(formattingInfo,
                                                        BasicPatternConverter::LOCATION_CONVERTER);
        break;
    default:
        Q_ASSERT_X(false, "PatternFormatter::createConverter", "Unknown pattern character");
    }
}



我个人的实践


QThread::currentThread()->setObjectName("MainThread");

MYLOG4QT_POINTER->debug("hello"); //这种方式不会输出文件名/行号/函数名

QString s = "sds";

MYLOG4QT_FATAL("hello2=%1,%2", 1234, s); //这种方式可以

完整的demo源码下载:https://download.csdn.net/download/libaineu2004/12293343


 


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2天前
|
关系型数据库 MySQL 数据库
mysql数据库bin-log日志管理
mysql数据库bin-log日志管理
|
2天前
|
存储 关系型数据库 数据库
关系型数据库文件方式存储LOG FILE(日志文件)
【5月更文挑战第11天】关系型数据库文件方式存储LOG FILE(日志文件)
8 1
|
3天前
|
运维 监控 安全
Java一分钟之-Log4j与日志记录的重要性
【5月更文挑战第16天】Log4j是Java常用的日志框架,用于灵活地记录程序状态和调试问题。通过设置日志级别和过滤器,可避免日志输出混乱。为防止日志文件过大,可配置滚动策略。关注日志安全性,如Log4j 2.x的CVE-2021-44228漏洞,及时更新至安全版本。合理使用日志能提升故障排查和系统监控效率。
14 0
|
4天前
|
C++
JNI Log 日志输出
JNI Log 日志输出
19 1
|
4天前
|
安全 Linux 网络安全
/var/log/secure日志详解
Linux系统的 `/var/log/secure` 文件记录安全相关消息,包括身份验证和授权尝试。它涵盖用户登录(成功或失败)、`sudo` 使用、账户锁定解锁及其他安全事件和PAM错误。例如,SSH登录成功会显示&quot;Accepted password&quot;,失败则显示&quot;Failed password&quot;。查看此文件可使用 `tail -f /var/log/secure`,但通常只有root用户有权访问。
171 4
|
4天前
|
运维 监控 数据可视化
日志服务 HarmonyOS NEXT 日志采集最佳实践
鸿蒙操作系统(HarmonyOS)上的日志服务(SLS)SDK 提供了针对 IoT、移动端到服务端的全场景日志采集、处理和分析能力,旨在满足万物互联时代下应用的多元化设备接入、高效协同和安全可靠运行的需求。
116801 10
|
4天前
|
存储 运维 大数据
聊聊日志硬扫描,阿里 Log Scan 的设计与实践
泛日志(Log/Trace/Metric)是大数据的重要组成,伴随着每一年业务峰值的新脉冲,日志数据量在快速增长。同时,业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算提出更高的要求。
|
4天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
4天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
89 1
|
4天前
|
弹性计算 运维 Shell

推荐镜像

更多