#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编码。