一个简单的日志记录功能。记录格式为:[MM-DD HH:MM:SS] logStr
其中设置有日志级别,可根据不同的日志性质,选择调用不同的接口。
TraceLog.h
//=========================================================================
// FILE: [TraceLog]
// AUTH: Wayne.Hu
// DATE: 2014/08/05 22:26:51
// CITY: 苏州
// DESC: 日志输出
//=========================================================================
#ifndef __TRACELOG_2014_8_5_H__
#define __TRACELOG_2014_8_5_H__
#include
#include
using namespace std;
// 日志输出类型
enum ETL_OUT_TYPE
{
ETL_OT_FILE = 0x01, // 输出日志到文件
ETL_OT_CONSOLE = 0x02, // 输出日志到控制台
ETL_OT_END
};
// 日志级别
enum ETL_LEVEL
{
ETL_NULL = -1,
ETL_ALL, // 输出所有
ETL_TEST, // 输出测试信息及以上
ETL_NORMAL, // 输出普通日志及以上
ETL_WARNING, // 输出警告及以上
ETL_ERROR, // 输出错误级以上
ETL_BASE, // 输出基础信息
ETL_MAX
};
// 输出日志
void TraceTest(const char* formant, ...);
void TraceNormal(const char* formant, ...);
void TraceWarning(const char* formant, ...);
void TraceError(const char* formant, ...);
void TraceBase(const char* formant, ...);
// 日志输出-单例
class TraceLog
{
public:
// 单例
static TraceLog* GetInstance();
// 设置日志级别
void SetTraceLevel(ETL_LEVEL eLevel);
// 设置日志名
void SetLogFileName(const char* strName);
// 设置日志输出类型
void SetLogOutType(int nType);
// 输出日志(带时间信息输出)
void Trace(ETL_LEVEL eLevel, const char* log);
protected:
// 写日志文件
void WriteLogfile(ETL_LEVEL eLevel, const char* strLog);
private:
// 构造
TraceLog():m_bFirst(true),m_nOutType(ETL_OT_FILE),m_eLevel(ETL_NORMAL),m_strName("TraceLog.log"){}
// 成员变量
bool m_bFirst;
int m_nOutType;
ETL_LEVEL m_eLevel;
string m_strName;
};
#endif//__TRACELOG_2014_8_5_H__
#include "TraceLog.h"
#include
#include
#include
// 字符数组最大值
#define TL_TEMPMAX 4096
// 回车换行符
#define TL_RETURN "\r\n"
// 输出日志
void TraceTest(const char* formant, ...)
{
char temp[TL_TEMPMAX] = {0};
va_list val;
va_start(val,formant);
_vsnprintf_s(temp, TL_TEMPMAX, formant, val);
va_end(val);
TraceLog::GetInstance()->Trace(ETL_TEST, temp);
}
void TraceNormal(const char* formant, ...)
{
char temp[TL_TEMPMAX] = {0};
va_list val;
va_start(val,formant);
_vsnprintf_s(temp, TL_TEMPMAX, formant, val);
va_end(val);
TraceLog::GetInstance()->Trace(ETL_NORMAL, temp);
}
void TraceWarning(const char* formant, ...)
{
char temp[TL_TEMPMAX] = {0};
va_list val;
va_start(val,formant);
_vsnprintf_s(temp, TL_TEMPMAX, formant, val);
va_end(val);
TraceLog::GetInstance()->Trace(ETL_WARNING, temp);
}
void TraceError(const char* formant, ...)
{
char temp[TL_TEMPMAX] = {0};
va_list val;
va_start(val,formant);
_vsnprintf_s(temp, TL_TEMPMAX, formant, val);
va_end(val);
TraceLog::GetInstance()->Trace(ETL_ERROR, temp);
}
void TraceBase(const char* formant, ...)
{
char temp[TL_TEMPMAX] = {0};
va_list val;
va_start(val,formant);
_vsnprintf_s(temp, TL_TEMPMAX, formant, val);
va_end(val);
TraceLog::GetInstance()->Trace(ETL_BASE, temp);
}
//=========================================================================
// public
//=========================================================================
// 单例
TraceLog* TraceLog::GetInstance()
{
static TraceLog instance;
return &instance;
}
// 设置日志级别
void TraceLog::SetTraceLevel(ETL_LEVEL eLevel)
{
m_eLevel = eLevel;
}
// 设置日志名
void TraceLog::SetLogFileName(const char* strName)
{
m_strName = strName;
}
// 设置日志输出类型
void TraceLog::SetLogOutType(int nType)
{
m_nOutType = nType;
}
//=========================================================================
// protected
//=========================================================================
// 输出日志(带时间信息输出)
void TraceLog::Trace(ETL_LEVEL eLevel, const char* log)
{
// 第一次记录日志,先清空
if (m_bFirst)
{
m_bFirst = false;
FILE* pF = NULL;
fopen_s(&pF, m_strName.c_str(), "w+");
if (!pF)
{
return;
}
fclose(pF);
}
// 日志级别不够
if (eLevel < m_eLevel)
{
return;
}
// 获取日期,输出格式为:[MM-DD HH:MM:SS] logStr
time_t nowtime;
struct tm timeinfo;
time( &nowtime );
localtime_s(&timeinfo, &nowtime );
char tempOut[4096] = {0};
_snprintf_s(tempOut, 4096, "[%02d-%02d %02d:%02d:%02d] %s\r\n", timeinfo.tm_mon + 1, timeinfo.tm_mday,
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, log);
bool bOutFile = (m_nOutType & ETL_OT_FILE) != 0;
bool bOutConsole = (m_nOutType & ETL_OT_CONSOLE) != 0;
// 输出到日志文件
if (bOutFile)
{
WriteLogfile(eLevel, tempOut);
}
// 输出到控制台
if (bOutConsole)
{
std::cout << tempOut;
}
}
//=========================================================================
// private
//=========================================================================
// 写日志文件
void TraceLog::WriteLogfile(ETL_LEVEL eLevel, const char* strLog)
{
// 打开文件
FILE* pF = NULL;
fopen_s(&pF, m_strName.c_str(), "a");
if(pF)
{
fwrite(strLog, strlen(strLog), 1, pF);
fclose(pF);
}
}
//=========================================================================
// FILE: [TestMain]
// AUTH: Wayne.Hu
// DATE: 2014/08/09 12:50:37
// CITY: 苏州
// DESC: 基础库测试文件
//=========================================================================
#include
#include "TraceLog.h"
using namespace std;
void main()
{
TraceLog::GetInstance()->SetTraceLevel(ETL_ALL);
TraceLog::GetInstance()->SetLogOutType(ETL_OT_FILE | ETL_OT_CONSOLE);
TraceTest("测试一下:%d", 9527);
TraceNormal("Test TraceNormal:%d", 6520);
TraceWarning("Test TraceWarning:%d", 41);
TraceError("Test TraceError:%d", 2758);
TraceBase("Test TraceBase:%d", 41);
return;
}