首先 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);