C++实现一个简单全局写日志函数

2022-12-24 14:42:37 1604人已围观 59已点赞 12人已收藏

简介在C++程序运行过程中,经常需要将程序的运行信息输出到文件中,以便跟踪程序运行结果。本文实现一个C++简单全局写日志函数,直接在项目开发中复用即可,感兴趣的朋友可以参考一下。

全局写日志函数

声明

// 写日志
int WriteLog(char* fmt, ...);

实现

// 写日志
int WriteLog(char* fmt, ...)
{
	// 设置日志文件路径
	char fileName[MAX_PATH];
	TCHAR szFileToFind[MAX_PATH];
	WIN32_FIND_DATA wfd;
	BOOL rValue = FALSE;

	CString strModule = _T("");
	// 得到当前模块路径
	TCHAR tcModule[MAX_PATH] = TEXT("");
	GetModuleFileName(NULL, tcModule, MAX_PATH);
	strModule = tcModule;
	int iFind = strModule.ReverseFind('\\');
	strModule = strModule.Left(iFind);
	strModule += TEXT("\\Logs");

	_tcscpy(szFileToFind, strModule.GetString());
	HANDLE hFind = FindFirstFile(szFileToFind, &wfd);
	if ((hFind != INVALID_HANDLE_VALUE) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
	{
		rValue = TRUE;
	}
	FindClose(hFind);
	if (rValue == FALSE)
	{
		SECURITY_ATTRIBUTES  attrib;
		attrib.bInheritHandle = FALSE;
		attrib.lpSecurityDescriptor = NULL;
		attrib.nLength = sizeof(SECURITY_ATTRIBUTES);
		if (FALSE == ::CreateDirectory(szFileToFind, &attrib))
		{
			return -1;
		}
	}

	SYSTEMTIME st;
	GetLocalTime(&st);
	USES_CONVERSION;
	sprintf(fileName, "%s\\cppszw_%04d%02d%02d.log", T2A(szFileToFind), st.wYear, st.wMonth, st.wDay);

	// 打开文件
	FILE* pFile = fopen(fileName, "a");
	if (pFile == NULL)
	{
		return -1;
	}

	va_list arg;
	va_start(arg, fmt);

	// 写日志
	fprintf(pFile, "%04d-%02d-%02d %02d:%02d:%02d.%03d: ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
	vfprintf(pFile, fmt, arg);

	va_end(arg);

	fprintf(pFile, "\n"); // 换行
	fflush(pFile);
	fclose(pFile);

	return 0;
}

需要包含头文件:

#include <io.h>


更多为你推荐