Qt c实现自定义日志

C/C++实现网上银行系统:从C/S架构到高性能服务端开发实战 网络编程与高性能服务端开发是构建现代分布式系统的核心技术基础。其核心原理在于通过Socket API实现进程间通信,并运用多线程、I/O多路复用等并发模型处理海量请求。掌握这些底层技术对于开发金融交易、游戏服务器、中间件等对性能与可靠性要求极高的系统至关重要。在实际应用中,开发者需深入理解TCP/IP协议栈、字节序处理、粘包拆包等细节,并合理运用线程池、数据库连接池等技术优化资源管理。本文通过一个完整的C/C++网上银行系统项目,具体展示了如何基于经典的C/S架构,从零构建一个具备高并发处理能力、严谨事务安 阅读详情

0 前言

自定义的日志功能, 之前已经介绍过使用log4qt和qInstallMessageHandler实现日志输出

这个是用c实现的日志功能

 

1 实现效果

输出格式 [时间] [日志类型] [错误返回值] 日志内容

定位文件和行号

 

2 目录结构

 

3 源码

main.cpp

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"

int main(void)
{
	//C语言自带宏
	// __FILE__: 左右两边都有2个下划线,当前__FILE__所在的文件, %s
	// __LINE__: 当前__LINE__所在的行, %d

	printf("file = %s\nline = %d\n", __FILE__, __LINE__);

	int a = 10;

	LOG(__FILE__, __LINE__, 0, -1, "nolog = %d\n", a);
	LOG(__FILE__, __LINE__, 1, -1, "debug = %d\n", a);
	LOG(__FILE__, __LINE__, 2, -1, "info = %d\n", a);
	LOG(__FILE__, __LINE__, 3, -1, "warn = %d\n", a);
	LOG(__FILE__, __LINE__, 4, -1, "error = %d\n", a);

	printf("\n");
	system("pause");
	return 0;
}

Log.h

#ifndef _LOG_H_
#define _LOG_H_

#define FILENAME	"./debug.log"

/*
#define IC_NO_LOG_LEVEL			0
#define IC_DEBUG_LEVEL			1
#define IC_INFO_LEVEL			2
#define IC_WARNING_LEVEL		3
#define IC_ERROR_LEVEL			4;
*/

/************************************************************************/
/* 
const char *file:文件名称,写:__FILE__
int line:文件行号,写:__LINE__
int level:错误级别
		0 -- 没有日志
		1 -- debug级别
		2 -- info级别
		3 -- warning级别
		4 -- err级别
int status:错误码
const char *fmt:可变参数
*/
/************************************************************************/
//实际使用的Level
extern int  LogLevel[5];
void LOG(const char *file, int line, int level, int status, const char *fmt, ...);

#endif

Log.c

#define  _CRT_SECURE_NO_WARNINGS 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "Log.h"

#define MAX_STRING_LEN 		10240

//Level类别
#define NO_LOG_LEVEL			0
#define DEBUG_LEVEL			1
#define INFO_LEVEL			2
#define WARNING_LEVEL		3
#define ERROR_LEVEL			4

int  LogLevel[5] = {NO_LOG_LEVEL, DEBUG_LEVEL, INFO_LEVEL, WARNING_LEVEL, ERROR_LEVEL};

//Level的名称
char ICLevelName[5][10] = {"NOLOG", "DEBUG", "INFO", "WARNING", "ERROR"};

static int Error_GetCurTime(char* strTime)
{
	struct tm*		tmTime = NULL;
	size_t			timeLen = 0;
	time_t			tTime = 0;	
	
	tTime = time(NULL);
	tmTime = localtime(&tTime);
	//timeLen = strftime(strTime, 33, "%Y(Y)%m(M)%d(D)%H(H)%M(M)%S(S)", tmTime);
	timeLen = strftime(strTime, 33, "%Y.%m.%d %H:%M:%S", tmTime);
	
	return timeLen;
}

static int Error_OpenFile(int* pf)
{
	char	fileName[1024];
	
	memset(fileName, 0, sizeof(fileName));
#ifdef WIN32
	sprintf(fileName, "%s",FILENAME);
#else
	sprintf(fileName, "%s", FILENAME);
#endif
    
    *pf = open(fileName, O_WRONLY|O_CREAT|O_APPEND, 0666);
    if(*pf < 0)
    {
        return -1;
    }
	
	return 0;
}

static void Error_Core(const char *file, int line, int level, int status, const char *fmt, va_list args)
{
    char str[MAX_STRING_LEN];
    int	 strLen = 0;
    char tmpStr[64];
    int	 tmpStrLen = 0;
    int  pf = 0;
    
    //初始化
    memset(str, 0, MAX_STRING_LEN);
    memset(tmpStr, 0, 64);
    
    //加入LOG时间
    tmpStrLen = Error_GetCurTime(tmpStr);
    tmpStrLen = sprintf(str, "[%s] ", tmpStr);
    strLen = tmpStrLen;

    //加入LOG等级
    tmpStrLen = sprintf(str+strLen, "[%s] ", ICLevelName[level]);
    strLen += tmpStrLen;
    
    //加入LOG状态
    if (status != 0) 
    {
        tmpStrLen = sprintf(str+strLen, "[ERRNO is %d] ", status);
    }
    else
    {
    	tmpStrLen = sprintf(str+strLen, "[SUCCESS] ");
    }
    strLen += tmpStrLen;

    //加入LOG信息
    tmpStrLen = vsprintf(str+strLen, fmt, args);
    strLen += tmpStrLen;

    //加入LOG发生文件
    tmpStrLen = sprintf(str+strLen, " [%s]", file);
    strLen += tmpStrLen;

    //加入LOG发生行数
    tmpStrLen = sprintf(str+strLen, " [%d]\n", line);
    strLen += tmpStrLen;
    
    //打开LOG文件
    if(Error_OpenFile(&pf))
	{
		return ;
	}
	
    //写入LOG文件
    write(pf, str, strLen);
    //IC_Log_Error_WriteFile(str);
    
    //关闭文件
    close(pf);
    
    return ;
}


void LOG(const char *file, int line, int level, int status, const char *fmt, ...)
{
    va_list args;
	
	//判断是否需要写LOG
//	if(level!=IC_DEBUG_LEVEL && level!=IC_INFO_LEVEL && level!=IC_WARNING_LEVEL && level!=IC_ERROR_LEVEL)
	if(level == NO_LOG_LEVEL)
	{
		return ;
	}
	
	//调用核心的写LOG函数
    va_start(args, fmt);
    Error_Core(file, line, level, status, fmt, args);
    va_end(args);
    
    return ;
}

 

基于Qt的局域网高效文件传输与即时通讯系统设计与实现 本文详细介绍了基于Qt框架设计并实现一个集高效文件传输与即时通讯于一体的局域网应用系统。该系统借鉴“飞鸽传书”理念,采用C/S混合P2P架构,核心实现了支持断点续传的稳定文件传输功能与实时聊天功能,专为团队内部安全、高效的数据共享与沟通场景打造。 阅读详情

相关推荐

QT日志库:log4Qt及Qt自带日志库使用

Log4Qt是使用Trolltech Qt Framework的Apache Software Foundation Log4j包的C ++端口。它旨在供开源和商业Qt项目使用。所以 Log4Qt 是Apache Log4J 的Qt移植版,所以看Log4J的资料应该是最直接有效的(因为 Log4Qt的直接资料太少了)。Log4Qt主要是用来记录日志(有助于程序调试)。有3个主要的组件:1、Logger提供日志记录服务,可以有多个Logger存在,每个有它们自己的名字。

m0_58233509的博客 2131

Qt中自定义日志输出格式,并写入文件

1.重写方法 using namespace std; //日志代码互斥锁 QMutex logMutex; QString timePoint; void LogMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { logMutex.lock();...

HuntCode的专栏 1342

QT开发-日志管理

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + S

weixin_41747615的博客 748

Qt实现记录日志文件log

概述 Qt有两种实现记录日志的方式,第一种是安装自定义的Qt消息处理程序,自动输出程序产生的调试消息、警告、关键和致命错误消息的函数;第二种是自定义一个类,可以在程序指定位置打印输出指定的内容。 第一种qInstallMessageHandler方式 自定义消息处理函数,然后安装该函数,注意此时QDebug的消息将会输出在日志文件,Qt程序调式时不再打印。 main.cpp #include "widget.h" #include <QApplication> #include <QMut

weixin_40355471的博客 1万+

qt 日志输出 QMessageLogger QDebug QLoggingCategory qDebug qt_message_output() qInstallMessageHandler()

qt 日志输出 QMessageLogger QDebug QLoggingCategory qDebug qt_message_output() qInstallMessageHandler() QLoggingRegistry QLoggingRule

qiushangren的专栏 3547

【Qt开发指南】如何利用QDebug和QFile实现自定义Logger类进行高效的日志记录与保存管理(包含示例代码)

在本文中,我们展示了如何使用 Qt 中的 QDebug、QFile、QTextStream 和 QDateTime 类,自定义一个 Logger 类,实现高效的日志记录与管理。通过重定向 QDebug 的输出,可以方便地将调试信息保存到日志文件中,便于后续分析和查看。

科技改变人类,技术成就未来 1486

一个基于Qt的C++日志类

一个简单的多线程日志类

博客 480

使用C++和QT实现日志系统

从0到1,手把手带你使用QT的qInstallMessageHandler函数结合qDebug,qInfo实现自定义的日志系统,支持输出日志到文件和控制台,支持自动检测日志文件大小,支持自动更新日志文件修改日期,自动备份,自动删除一个月前的日志文件,支持多线程程序, 支持扩展,可输出日志到数据库,网络,或服务器,支持扩展,可使用config文件进行配置

KanHai8080的博客 1928

qt log输出:分类;定时更新文件;带文件名、函数名、行号

在 CMake 中定义宏,比如,你可以使用命令或者直接在中设置。下面是如何在 CMakeLists.txt 文件中定义宏的示例:# 方法一:使用 add_definitions(全局定义)# 方法二:使用 target_compile_definitions(针对特定目标定义)在上面的示例中,是你的项目目标名称(比如可执行文件或库),是你的源代码文件。方法一使用会在全局范围内定义宏,这意味着它会影响到所有后续添加的目标。方法二使用。

xie__jin__cheng的博客 1696

ESP32-P4 GPIO双域架构:HP/LP分离、寄存器级控制与低功耗工程实践

GPIO(通用输入输出)是嵌入式系统中最基础且高频使用的硬件接口,其性能、灵活性与功耗特性直接影响产品实时性与续航能力。现代高性能MCU如ESP32-P4通过HP/LP双电源域分离、可编程IO复用(IO MUX)、信号交换矩阵及硬件自动化机制(如ETM事件、Sigma-Delta调制),将传统GPIO升级为兼具模拟能力、亚微秒响应与微安级待机的智能外设子系统。其核心价值在于实现引脚功能动态重构、中断零延迟处理、Deep-sleep期间自主唤醒与多核安全操作。典型应用场景涵盖工业PLC信号采集、电池供电传感器

weixin_35949153的博客 96

Linux Component概述和高通component的使用

为了让subsystem按照一定顺序初始化设备才提出来的。subsystem中由很多设备模块,内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video device),这时就要用到component框架。例如v4l2 subdev和v4l2 video device中,谁依赖谁先创建?

lz_1990的专栏 1610

基于Spdlog + Qt的日志显示框架设计与实现

本文介绍了一种基于Spdlog和Qt的日志显示框架设计方案,适用于CAE软件开发。该框架通过将Spdlog高性能日志库与Qt界面控件结合,实现跨模块、线程安全的彩色日志输出功能。核心设计包括:封装为单例DLL供所有模块共享;提供简洁API接口;支持多输出目标(界面、控制台、文件);确保线程安全。关键技术点涉及Qt跨线程UI更新、单例模式实现和字符串格式化处理。该方案具有低耦合、高复用特点,能显著提升开发调试效率,并可扩展日志过滤、导出等功能。

XXM的博客 218

Zynq UltraScale+ MPSoC-AMP(linux+裸机)

接着 Zynq UltraScale+ MPSoC-双核裸机AMP继续 平台工具:zcu106,vitis2020.2,petalinux2019.2 文章目录1.cpu1跑裸机2.cpu0跑linux2.1petalinux设置2.2 app3.生成BOOT.bin4.zcu106测试 1.cpu1跑裸机 参照Zynq UltraScale+ MPSoC-双核裸机AMP建立的工程进行修改。BSP中stdin与out修改为uart1,uart1给裸机用,uart0给linux用。 ddr空间裸机与linu

zhuxl24的博客 5195

QT的使用-----Debug调试信息输出到文件中

将CDFPSK.dll动态库加到运行目录下并在main.c文件中加如以下代码: #include <QLibrary> void myMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString& msg); int main(int argc, char *argv[]) { ...

sbllb的博客 1031

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1856

海思Hi3516CV610开发实战:在Ubuntu 22.04上从零构建嵌入式Linux开发环境

本文详细介绍了在Ubuntu 22.04上为海思Hi3516CV610开发板搭建嵌入式Linux开发环境的完整流程。从虚拟机配置、系统安装到基础环境设置,提供了实用技巧和常见问题解决方案,帮助开发者高效构建适用于智能视觉处理的开发环境。

weixin_29197699的博客 510

qt 调用 libzdb数据库链接池的方法

qt 调用 libzdb 数据库链接池的方法

weixin_43481260的博客 297

Mplus—验证性因素分析(Confirmatory Factor Analysis, CFA)

介绍一阶和二阶验证性因素分析概况及在Mplus中的操作方法。

m0_54401011的博客 1万+

Qt日志输出及QsLog日志库

本文主要介绍Qt日志输出系统和QsLog日志库的使用,QsLog是一个基于Qt的QDebug类的易于使用的记录器。

慢慢记录,慢慢更新。 4749

模型算力需求估算

(Billion Parameters,简称B)和训练/推理的计算任务复杂度,结合硬件计算能力(例如每秒浮点运算次数,FLOPS)来估算。以下是详细的方法和公式说明,以及实际的计算示例。算力需求的估算依赖于参数量、模型架构及硬件性能,结合训练/推理场景的特定要求来计算。通过上述公式和示例,我们可以定量分析不同任务的算力需求,并合理配置硬件资源以优化运行效率。结论:推理任务相对较轻,单台H100可以在30秒内完成此任务。推理算力需求一般远低于训练,因为只需要执行前向传播。,可以将训练时间缩短到约。

形上得其象,形下合于数;阴阳自济,玄理自明。 8952

24、中性原子量子计算:原理、方法与实验

本文系统介绍了中性原子量子计算的原理、方法与实验进展。重点阐述了利用碱金属原子作为量子比特,通过磁光阱、光偶极阱和光晶格等技术实现原子捕获与控制的方法。同时,详细分析了单量子比特门操作和量子态工程的实现手段,并总结了相关实验结果与未来发展方向。该技术路线为构建大规模量子计算系统提供了可行方案。

ol789012的博客 243

Qt自定义日志输出

可以再CMakeLists.txt中添加以下设置用于控制日志是否输出,如果不禁止注释掉即可。如果最后需要将日志输出到文件中,可以叫ChatGPT修改即可。,安装这个函数以后,整个项目全局使用,不需要再重新安装。我们可以创建一个命名空间用于存放这个自定义日志输出。以下是详细版的修改版本,只保存主要的信息。

weixin_73186358的博客 926

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Qt-异常捕获以及日志记录

Qt中的异常捕获以及Qt捕获不到异常现象的原因及解决方案,日志的接入及使用方法。

qq_48498725的博客 7565

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Qt】QLoggingCategory基础-查看Qt源码中的日志

QT的应用程序在运行过程中,自己程序的日志,我们是可以控制并打印输出的。另外,Qt框架内部也包含大量重要的日志输出,只不过这些日志默认处于禁止状态。当遇到需要深入Qt框架内调查的问题时,若需查看部分Qt源码运行时日志,这时候就需要打开qt源码的日志开关了。

qq_43331089的博客 625

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

下载地址 https://github.com/MEONMedical/Log4Qt 参考博客 Qt开发笔记:log4Qt介绍、编译和使用 Log4Qt的基本使用 姊妹篇 《Qt日志重定向qInstallMessageHandler,输出至文件及网络》 --- ...

$firecat利白的代码足迹$ 4131

Qt日志功能实战:如何用qInstallMessageHandler自定义日志输出(含完整代码示例)

本文深入探讨了如何利用Qt的qInstallMessageHandler函数,将基础的qDebug、qWarning等日志输出升级为可定制、企业级的日志系统。通过完整的代码示例,详细讲解了从线程安全的文件日志记录到支持分级控制、文件滚动的高级日志管理器设计,帮助开发者构建稳定高效的Qt应用日志架构。

nn3456的博客 548
上一篇: Qt qInstallMessageHandler 安装消息句柄实现简单日志功能
下一篇: 内存泄漏检测
Empty_Android
博客等级 码龄10年 98粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值