windows编程按小时生成日志文件

Posted nanqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

//extern const char* g_pLogPath;

string createLogFileName();
string GetTime();
int  myLog(const char* pSourcePath, const char* pFunName, const long lLine, const char* fmt, ...);
void myLogStr(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText);


#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
",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指定的文件中  
    //直到出现字符串结束的为止。 
    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;
}

void myLogStr(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText)
{
    if (pLogText == NULL)
        return;
    int nLogLen = strlen(pLogText);
    if (nLogLen == 0)
        return;
    int nSourceLen = strlen(pSourcePath);
    int nFunLen = strlen(pFunName);
    char szLine[10] = { 0 };
    sprintf(szLine, "%ld", lLine);
    int nLineLen = strlen(szLine);
    int nSpaceLen = 80 - nSourceLen - nFunLen - nLineLen;
    string strTime = GetTime();
    FILE* fp = NULL;
    fp = fopen(createLogFileName().c_str(), "a+");
    fwrite(strTime.c_str(), strTime.size(), 1, fp);
    fwrite(" ", 1, 1, fp);
    fwrite(pSourcePath, nSourceLen, 1, fp);
    for (int i = 0; i<nSpaceLen; ++i)
        fwrite(" ", 1, 1, fp);
    fwrite(pFunName, nFunLen, 1, fp);
    fwrite(":", 1, 1, fp);
    fwrite(szLine, nLineLen, 1, fp);
    fwrite(" ", 1, 1, fp);
    fwrite(pLogText, nLogLen, 1, fp);
    fwrite("
", 1, 1, fp);
    fclose(fp);
}

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%
", "hello...", 123, "hello...");
    }
    string test = "结束打印";
    WRITELOG("%s
", test.c_str());
    WRITELOG("
");
    system("pause");
    return 0;
}

 

以上是关于windows编程按小时生成日志文件的主要内容,如果未能解决你的问题,请参考以下文章

log4j.xml日志输出(如何按小时输出日志文件)

log4j.xml日志输出(如何按小时输出日志文件)

java中如何一次请求生成一个日志文件高并发下可用

对log4j产生的日志文件进行监控

Java编程系列java用POIItext生成并下载PPTPDF文件

Nginx 访问日志轮询切割