记录日志文件TraceLog

一个简单的日志记录功能。记录格式为:[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 <stdlib.h>
#include <string>
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__

TraceLog.cpp

#include "TraceLog.h"
#include <time.h>
#include <stdarg.h>
#include <iostream>

// 字符数组最大值
#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);
	}
}

TestMain.cpp

//=========================================================================
//	FILE:	[TestMain]
//	AUTH:	Wayne.Hu
//	DATE:	2014/08/09 12:50:37
//	CITY:	苏州
//	DESC:	基础库测试文件
//=========================================================================

#include <iostream>
#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;
}


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值