C++写日志函数

首先 Log.h

#ifndef __LOG_H__
#define __LOG_H__
/*******************************************************************
* @版权信息:
* @文件名称:Log.h
* @摘    要:日志操作定义头文件
* @作    者:周勇
* @当前版本:1.0.0
* @日    期:2015年4月2日
* @备    注:线程安全日志类
*******************************************************************/
typedef enum _tagENUM_LOG_TYPE
{
    LOG_NONE,                //不开启日志
    LOG_ERROR,                //错误日志
    LOG_RTM,                    //运行日志
    LOG_DEBUG             //调试日志
}LOG_TYPE;





#define LOG_FILE_PATH        250
#define MAX_LOG_ROW_SIZE    500                //一行日志的大小
#define MAX_LOG_FILE_SIZE (10*1024*1024)    //日志文件大小    


//初始化日志
void InitLog();
//设置日志参数
void SetLogParam(int nLogLevel=LOG_RTM, int nLogFileSize = MAX_LOG_FILE_SIZE);
//写日志函数
void LOG(LOG_TYPE t, char* format, ...);

#endif //__LOG_H__

其次 Log.cpp

#include "Log.h"

/*
WriteLog: 写日志函数---如果日志文件超过指定大小 则从0开始
*/
int g_nLogLevel = 0;
int g_nLogFileSize = MAX_LOG_FILE_SIZE;
char g_szFileName[MAX_PATH] = { 0 };
CRITICAL_SECTION g_cs;
CRITICAL_SECTION g_avcs;

void InitLog()
{
    
    GetModuleFileNameA(NULL, g_szFileName, MAX_PATH);
    *strrchr(g_szFileName, '\\') = 0;
    strcat(g_szFileName, "\\RTSPLOG.log");

    InitializeCriticalSection(&g_cs);
    InitializeCriticalSection(&g_avcs);
}
void SetLogParam(int nLogLevel, int nLogFileSize)
{
    g_nLogLevel = nLogLevel;
    g_nLogFileSize = nLogFileSize;
}
void LOG(LOG_TYPE t, char* format, ...)
{
    EnterCriticalSection(&g_cs);

    FILE *pFile = NULL;
    int dwFileSize = 0;
    va_list arg;
    //char szFileName[LOG_FILE_PATH];
    SYSTEMTIME tm;
    char uchStrTime[LOG_FILE_PATH] = { 0 };
    char szMsg[1024] = { 0 };

    if (t > g_nLogLevel) goto END_LOG;

    /* 文件处理 */
    //sprintf_s(szFileName, LOG_FILE_PATH,"RTSPLOG.log");

    fopen_s(&pFile, g_szFileName, "a+");
    if (pFile == NULL)
    {
        goto END_LOG;
    }

    //限制大小
    fseek(pFile, 0, SEEK_END);
    dwFileSize = ftell(pFile);
    if (dwFileSize > g_nLogFileSize)
    {
        fclose(pFile);
        pFile = NULL;
        fopen_s(&pFile, g_szFileName, "w");
        dwFileSize = 0;
        if (pFile == NULL)
        {
            goto END_LOG;
        }
    }

    //获取当前时间
    //GetSystemTime(&tm);
    GetLocalTime(&tm);
    sprintf_s(uchStrTime, LOG_FILE_PATH, "%04d-%02d-%02d %02d:%02d:%02d:%03d",
        tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond, tm.wMilliseconds);

    fprintf(pFile, "%s\t", uchStrTime);
    switch (t)
    {
        case LOG_NONE:
            break;
        case LOG_ERROR:
            fprintf(pFile, "[ERR]");
            break;
        case LOG_RTM:
            fprintf(pFile, "[RTM]");
            break;
        case LOG_DEBUG:
            fprintf(pFile, "[DBG]");
            break;
    }
    //处理参数
    va_start(arg, format);
    vfprintf(pFile, format, arg);
    fprintf(pFile, "\n");
    fflush(pFile);
    va_end(arg);
    fclose(pFile);
END_LOG:
    LeaveCriticalSection(&g_cs);
}

用法:

实时信息打印:

 LOG(LOG_RTM, "Channel[0x%x]CIPCamera::ConnectCamera!", this);

错误信息打印

LOG(LOG_ERROR, "Channel0x%x]CIPCapture::avformat_find_stream_info failed!", this);


调试信息打印

LOG(LOG_DEBUG, "Channel[0x%x]ReadStream takes %d ms", this,GetTickCount() - dwTimeBegin);



猜你喜欢

转载自blog.csdn.net/zhouyongku/article/details/76238532