windows VS log 日志输出到一个文件

这篇博客详细介绍了如何实现一个C++的日志系统,包括log.h和log.cpp两个部分。日志系统通过预处理器宏定义控制是否启用日志打印,并提供了myLog函数用于格式化输出。在main函数中,展示了如何调用WRITELOG宏进行日志记录。

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

log.h 如下:
#pragma once  
#define WRITE_LOG_ENABLE        //启用日志打印

#include <string>  
#include <stdio.h>
using std::string;
using std::wstring;
extern const char* g_pLogPath;


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 <string>  
#include <Windows.h>  
#include <stdio.h>
#include<iostream>

using std::string;
using std::wstring;

const char* g_pLogPath = ".\\test.log";

string  GetTime()
{
    SYSTEMTIME st;
    ::GetLocalTime(&st);
    char szTime[26] = { 0 };
    sprintf_s(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;
    errno_t err;
    err = fopen_s(&fp,g_pLogPath,"a+");
    string strTime = GetTime();
    fprintf(fp, "%s ", strTime.c_str());//写时间

    int nFileNameLen = strlen(pFileName);
    char szLine[10] = { 0 };
    sprintf_s(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 函数测试: 

#include "log.h"
int main()
{
    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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值