QT log4qt 记录日志

news2024/9/17 9:00:03

一.环境

Qt 5.15.2
log4qt

二.源码

1.编译 log4qt 源码,生成dll文件,并将.h 拷贝至项目目录

在这里插入图片描述
在这里插入图片描述
2.main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <QDir>
#include "Log4Qt/logmanager.h"
#include "Log4Qt/patternlayout.h"
#include "Log4Qt/consoleappender.h"
#include "Log4Qt/dailyfileappender.h"

//终端输出记录
void InitConsoleLog()
{
    QDir dir;
    dir.mkdir(QApplication::applicationDirPath() + "../logs/");

    //Logger:记录器,有一个根Logger,可以有多个其他Logger
    Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();; //根Logger,name为root
    // Log4Qt::Logger *mylog1 = Log4Qt::Logger::logger("Mylog1");  //其他Logger,name为Mylog1的
    logger->setLevel(Log4Qt::Level::DEBUG_INT); //设置日志输出级别
    Log4Qt::LogManager::setHandleQtMessages(true); //处理qt调试输出信息,将qDebug之类的信息重定向,不开启这个qDebug()、qWri

    /****************PatternLayout配置日志的输出格式****************************/
    Log4Qt::PatternLayout *layout = new Log4Qt::PatternLayout();
    layout->setConversionPattern("%d{yyyy-MM-dd hh:mm:ss} [%p] %m %n");
    layout->activateOptions(); // 激活Layout

    /***************************配置日志的输出位置***********/
    //ConsoleAppender:输出到控制台
    Log4Qt::ConsoleAppender *appender = new Log4Qt::ConsoleAppender(layout, Log4Qt::ConsoleAppender::STDOUT_TARGET);
    appender->activateOptions();
    logger->addAppender(appender);

    //DailyFileAppender:每天新建一个文件,保存当天的日志,超过指定的天数,删除最开始的日志
    Log4Qt::DailyFileAppender *dailiAppender = new Log4Qt::DailyFileAppender;
    dailiAppender->setLayout(layout); //设置输出格式
    dailiAppender->setFile("logs/console/console.log"); //日志文件名:固定前缀
    dailiAppender->setDatePattern("_yyyy_MM_dd"); //日志文件名:根据每天日志变化的后缀
    dailiAppender->setAppendFile(true); //true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是false
    dailiAppender->setKeepDays(30); //设置保留天数
    dailiAppender->activateOptions();
    logger->addAppender(dailiAppender);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    InitConsoleLog();
    MainWindow w;
    w.show();
    return a.exec();
}

3.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>

#include <Log4Qt/logmanager.h>
#include <Log4Qt/patternlayout.h>
#include <Log4Qt/consoleappender.h>
#include <Log4Qt/dailyfileappender.h>
#include <Log4Qt/rollingFileAppender.h>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    void DebugLogs(QString test);
private:
    Log4Qt::Logger *logger;
private:
    void InitOwnLog();
};
#endif // MAINWINDOW_H

4.mainwindow.cpp


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    DebugLogs("Test Message ");


    InitOwnLog();


    logger->info("Hello !");

    DebugLogs("123456");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::DebugLogs(QString test)
{
    qDebug() << "[" <<  __FILE__  << "][" <<  __FUNCTION__ << "][" << __LINE__ << "] -> " << test;
}

void MainWindow::InitOwnLog()
{
    logger = Log4Qt::Logger::rootLogger();
    logger->setLevel(Log4Qt::Level::INFO_INT); //设置日志输出级别

    /****************PatternLayout配置日志的输出格式****************************/
    Log4Qt::PatternLayout *layout = new Log4Qt::PatternLayout();
    layout->setConversionPattern("%d{yyyy-MM-dd hh:mm:ss} [%p] %m %n");
    layout->activateOptions(); // 激活Layout

    /***************************配置日志的输出位置***********/
    Log4Qt::DailyFileAppender *dailiAppender = new Log4Qt::DailyFileAppender;
    dailiAppender->setLayout(layout); //设置输出格式
    dailiAppender->setFile("logs/ownLogs/ownLogs.log"); //日志文件名:固定前缀
    dailiAppender->setDatePattern("_yyyy_MM_dd"); //日志文件名:根据每天日志变化的后缀
    dailiAppender->setAppendFile(true); //true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是false
    dailiAppender->setKeepDays(30); //设置保留天数
    dailiAppender->activateOptions();
    logger->addAppender(dailiAppender);
}

三.运行

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场离职潮:年轻人的选择与挑战

近年来&#xff0c;随着社会的发展和个人价值观的变化&#xff0c;越来越多的人开始主动或被动地离开职场。这一现象在社交网络上引发了广泛的讨论&#xff0c;甚至出现了专门分享离职经历的“离职博主”。为了深入了解这一趋势背后的真实情况&#xff0c;近日相关机构展开了一…

【传输层协议】UDP和TCP协议

UDP协议 UDP协议全称为User Datagram Protocol&#xff0c;用户数据报协议。UDP协议报文格式如下&#xff1a; 16UDP长度。表示整个数据报的最大长度&#xff0c;即UDP首部UDP数据。这个字段帮助我们确保在网络字节流中获取完整的UDP报文信息。校验和&#xff1a;用于检测数…

法兰式满油阀SPF-125-12C、STF-125-12C

法兰式满油阀又名预充阀、充液阀&#xff0c;合金钢和球墨铸铁材质&#xff0c;体积小&#xff0c;易于拆卸&#xff0c;低压损&#xff0c;流量大&#xff0c;构造简单&#xff0c;耐久性佳&#xff0c;可直接装置于油缸盖侧&#xff0c;SPF-32-12C、STF-32-12C、SPF-50-12C、…

ZooKeeper中间件监控指标解读

监控易是一款功能全面的IT监控软件&#xff0c;能够实时监控各类IT资源和应用的状态&#xff0c;包括中间件、数据库、网络设备等。对于ZooKeeper这一重要的分布式协调服务中间件&#xff0c;监控易提供了详尽的监控指标&#xff0c;帮助用户全面了解ZooKeeper集群的运行状态。…

鸿蒙(API 12 Beta2版)NDK开发【使用Node-API接口进行异步任务开发】

使用Node-API接口进行异步任务开发 场景介绍 napi_create_async_work是Node-API接口之一&#xff0c;用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用&#xff0c;以避免阻塞主线程&#xff0c;确保应用程序的性能和响应性能。例如以下场景&#xff1a; 文件…

最新版Polyverse - Music Bundle Deal [06.2024],win和mac,支持intel和M1芯片

一。Polyverse插件套装 Polyverse - Music Bundle Deal 1.释放您的创作潜力 无论您是希望突破创作极限的音乐制作人&#xff0c;还是寻求新颖创新方式来增强混音的音频工程师&#xff0c;Polyverse 捆绑包交易都具有非凡的价值&#xff0c;可以帮助您将音乐提升到一个新的水平…

【数学建模】【优化算法】:【MATLAB】从【一维搜索】到】非线性方程】求解的综合解析

目录 第一章&#xff1a;一维搜索问题 黄金分割法 股票交易策略优化 总结&#xff1a; 第二章&#xff1a;线性规划 线性规划&#xff08;Simplex 算法&#xff09; 生产计划优化 总结&#xff1a; 第三章&#xff1a;无约束非线性优化问题 梯度下降法 神经网络训练…

Python中导入不同文件夹中的函数

1、代码举例&#xff1a;from Python_CodeFile.LDAP3.del_file.Get_Computer_Dn import get_computer_dn # 以上代码导入路径为&#xff1a;Python_CodeFile/LDAP3/del_file/Get_Computer_Dn.py 文件中的get_computer_dn函数。

传统放牧方式与北斗科技的碰撞:北三短报文头羊定位追踪器PD28守护放牧生活

在大草原的广袤天地中&#xff0c;放牧生活是蒙古族人民的传统之一。然而&#xff0c;除了美丽和自由&#xff0c;放牧生活也伴随着一些危险。以前由于科技落后&#xff0c;人工成本低&#xff0c;主要依靠人力去放牧&#xff0c;牧民放牧顶风踏雪走个几十公里都极为寻常。除了…

AI识别智能称重-收银系统源码

系统概况 专门为零售行业的连锁店量身打造的收银系统&#xff0c;适用于常规超市、生鲜超市、水果店、便利店、零食专卖店、服装店、母婴用品、农贸市场等类型的门店使用。同时线上线下数据打通&#xff0c;线下收银的数据与小程序私域商城中的数据完全同步&#xff0c;如商品…

【ROS 最简单教程 005/300】ROS + VSCode 开发环境快速搭建

VSCode 全称 Visual Studio Code&#xff0c;是微软出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大 本篇将以最简单的方法引导基于 VSCode 的&#xff0c;超全面开发环境的搭建及相关配置完全不了解 ROS 编程的友友&#xff0c;建议先看 &#x1f449;快速体验 指…

WIFI7在游戏领域引发的变革

随着无线技术的快速进步&#xff0c;游戏体验正变得愈加丰富、复杂和逼真。现在最新的WIFI 7技术将带来新的飞跃&#xff0c;不仅有望重新定义网络游戏的体验&#xff0c;还有可能彻底革新整个游戏产业。可以想象一下&#xff0c;在未来&#xff0c;游戏世界不再有延迟和连接中…

【嵌入式】一种基于串口命令的模块测试API模板

本文主要记录一种用于嵌入式开发中【模块测试】通用模板&#xff0c;使用 getopt_long()函数作为串口命令行解析的工具&#xff0c;从而进行测试代码逻辑的编写。 本文以ADC 和 uart 测试为例&#xff0c;介绍函数的使用以及测试代码的编写 【测试环境说明 】 本文是在 rt-thr…

一篇长文搭建AI大模型应用平台架构

在研究了6家知名公司如何部署生成式AI应用程序后&#xff0c;注意到它们的平台有很多相似之处。概述了生成式AI大模型应用平台的常见组件、它们的作用以及它们的实现方式。尽力保持架构的通用性&#xff0c;但某些应用程序可能会有所不同。 Generative AI大模型应用平台整体架…

数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter

【PyTorch】图像多分类项目 目录 StratifiedShuffleSplit transforms.ToTensor Counter StratifiedShuffleSplit sss StratifiedShuffleSplit(n_splits1, test_size0.2, random_state0) 创建StratifiedShuffleSplit对象&#xff0c;用于将数据集划分为训练集和测试集。 …

农业物联网气象站的工作原理

TH-NQ10农业物联网气象站是一款集成了物联网与气象技术的创新设备&#xff0c;它在现代农业中扮演着重要角色&#xff0c;为农业生产提供了精准、实时的气象数据支持。以下是对农业物联网气象站的详细介绍&#xff1a; 定义与特点 农业物联网气象站通过物联网技术将气象观测设…

详解校门外的树(树状数组)

前言 在看之前建议先看一下 【学习笔记】详解树状数组-CSDN博客 题目 思路 建立两个树状数组,维护左括号与右括号。 假设有一个长度为10的数轴&#xff0c;我们要将区间[ 2 , 5 ]中种树&#xff0c;这时&#xff0c;我们将 2 处放一个左括号 ” ( ” ,5处放一个 ” )” &…

负载均衡的作用、负载均衡常用处理方式、四层和七层负载均衡的区别、及配置方法

一、负载均衡的作用 解决服务器的高并发压力&#xff0c;提高应用程序的处理性能&#xff1b; 提供故障转移&#xff0c;实现高可用&#xff1b; 通过添加或减少服务器数量&#xff0c;增强网站的可扩展性&#xff1b; 在负载均衡器上进行过滤&#xff0c;可以提高系统的安…

FreeModbus学习——定时器

FreeModbus版本&#xff1a;1.6 协议栈初始化时会初始化定时器&#xff1a; eMBInit → eMBRTUInit → xMBPortTimersInit( ( USHORT ) usTimerT35_50us ) 协议栈使能时会使能定时器&#xff1a; eMBEnable → pvMBFrameStartCur → eMBRTUStart → vMBPortTimersEnable 定时…

【Vulnhub系列】Vulnhub_Dr4g0n_b4ll 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Dr4g0n_b4ll靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境搭建 选择打开.ovf 文件 配置名称和路径 打开后调整网络连接模式为【NAT】即可 二、信息收集 1、主机…