C++实现类似print函数的日志打印功能。C++运用可变参数的日志打印函数。

这篇博客介绍了一个用于记录日志的C++函数`LOG`,它能生成带有时间戳的日志文件,支持可变参数。通过检查目录、创建文件、格式化时间等方式确保日志的有效记录。函数使用方便,类似`print`,可以输出函数名、行号等信息。注意,该函数适用于多字节编码,不适用于Unicode环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <direct.h>//创建路径所需头文件
#include <fstream>//操作文件流所需头文件
#include <stdarg.h>//可变参数头文件
#include <time.h>//时间处理
void LOG(const char* pLogTxt, ...)
{
	//这里检测目录存在和创建的部分可以放到程序的初始化函数中,只检查一次就好了,避免每次打印都要检查一遍
	char pLogPath[40]{ "./BYLOG/" };//存放日志路径,这里仅支持一级目录,多级请参考多级目录的创建
	fstream DirectoryExists(pLogPath);
	if(!DirectoryExists)
		_mkdir(pLogPath);//判断日志目录是否存在,如果不存在则创建一个
	va_list args;//获取可变参数
	va_start(args, pLogTxt);//最后一个固定参数
	int nParameterLen = _vscprintf(pLogTxt, args) + 1;//获取可变参数长度以申请适当大小缓冲区
	char* buffer = new char[nParameterLen];
	vsprintf_s(buffer, nParameterLen, pLogTxt, args);//可变参数写入缓冲区
	va_end(args);
	SYSTEMTIME sys;
	GetLocalTime(&sys);//获取系统时间
	sprintf_s(pLogPath, _countof(pLogPath), "BYLOG\\by%4d-%02d-%02d.txt", sys.wYear, sys.wMonth, sys.wDay);//文件命名
	char pTimeNow[16];
	sprintf_s(pTimeNow, _countof(pTimeNow), "[%02d:%02d:%02d:%03d]", sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);//输出时间格式
	ofstream write; //文件操作对象,这里的声明和释放也可以分别放到初始化的函数和释放的函数里,避免重复的打开关闭文件流
	write.open(pLogPath, ios::app);//打开该文件,如果没有这个文件,会自动创建这个文件
	write << pTimeNow << buffer << endl;
	delete[] buffer;
	buffer = NULL;
	write.close(); // 输出完毕后关闭这个文件
	write.clear();
}

用法:

直接像print函数那样用就可以了,比如

LOG("函数:%-50s所在位置:%d行", __FUNCTION__, __LINE__);

打印效果
在这里插入图片描述
其中%-50s表示左对齐,长度不足50的话用空格对齐。__FUNCTION__宏表示打印函数名,__LINE__宏表示打印该行所在行数,如果需要打印所在文件路径,可以使用__FILE__宏。

ps:这个函数是针对多字节版本,并不适用与unicode编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值