windows编程按小时生成日志文件
这是一个简单的日志记录方法,为了避免单个日志文件过大,所以每个小时生成一个新的日志文件
注意:g_pLogPath 可以带路径,但是必须手动创建好路径,保证目录存在。而且要详细到log文件名,不能带后缀,后缀默认为.log
后缀名需要在createLogFileName()中修改,可以改为.txt
log.h
#pragma once #define WRITE_LOG_ENABLE //启用日志打印 #include <string> #include <Windows.h> #include <stdio.h> using std::string; using std::wstring; string createLogFileName(); string GetTime(); int myLog(const char* pSourcePath, const char* pFunName, const long lLine, const char* fmt, ...); #ifdef WRITE_LOG_ENABLE #define WRITELOG(format, ...) myLog(__FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__) #else #define WRITELOG(format, ...) #endif
log.cpp
#include "Log.h" #include "StdAfx.h" #include <string> #include <Windows.h> #include <stdio.h> using std::string; using std::wstring; const char* g_pLogPath = ".\\log\\test"; string createLogFileName() { char logPath[128] = { 0 }; SYSTEMTIME st; ::GetLocalTime(&st); char szTime[26] = { 0 }; sprintf(szTime, "%04d-%02d-%02d-%02d", st.wYear, st.wMonth, st.wDay, st.wHour); sprintf(logPath, "%s%s%s", g_pLogPath, szTime, ".log"); // printf("%s\n",logPath); return logPath; } string GetTime() { SYSTEMTIME st; ::GetLocalTime(&st); char szTime[26] = { 0 }; sprintf(szTime, "%04d-%02d-%02d %02d:%02d:%02d %d ", st.wYear, st.wMonth, st.wDay, st.wHour, \ st.wMinute, st.wSecond, st.wMilliseconds); return szTime; } int myLog(const char* pFileName, const char* pFunName, const long lLine, const char* fmt, ...) { int ret = 0; //va_list是一个字符串指针,用于获取不确定个数的参数 va_list args; //读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中 //的参数列表,从低地址到高地址一个一个的把参数内容读出来的过程 va_start(args, fmt); //该函数会根据参数fmt字符串来转换格式并格式化数据,然后将结果输出到参数Stream指定的文件中 //直到出现字符串结束的\0为止。 FILE* fp = NULL; fp = fopen(createLogFileName().c_str(), "a+"); string strTime = GetTime(); fprintf(fp, "%s ", strTime.c_str());//写时间 int nFileNameLen = strlen(pFileName); char szLine[10] = { 0 }; sprintf(szLine, "%ld", lLine); int nLineLen = strlen(szLine); int nSpaceLen = 30 - nFileNameLen - nLineLen; for (int i = 0; i < nSpaceLen; ++i) { fwrite(" ", 1, 1, fp); } fprintf(fp, "%s:%ld ", pFileName, lLine); ret = vfprintf(fp, fmt, args); //获取完所有参数之后,为了避免发生程序瘫痪,需要将 ap指针关闭,其实这个函数相当于将args设置为NULL va_end(args); fflush(fp); fclose(fp); return ret; }
main.cpp
// WriteLog.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "log.h" int _tmain(int argc, _TCHAR* argv[]) { for (int i = 0; i < 5; i++) { WRITELOG("打印%s%d%s%\n", "hello...", 123, "hello..."); } string test = "结束打印"; WRITELOG("%s\n", test.c_str()); WRITELOG("\n"); system("pause"); return 0; }