/**
* 用于输出log文件的类.
*/
#ifndef LOG_UTILS_H
#define LOG_UTILS_H
//log文件路径
#define LOG_FILE_NAME "log.txt"
//log文件最大字节数,大于该值时将清空原数据
#define LOG_FILE_MAX_SIZE 20 * 1024 * 1024
//启用开关
#define LOG_ENABLE
#include <fstream>
#include <string>
#include <ctime>
using namespace std;
//日志的类型
typedef enum log_rank {
Info,
Warning,
Error,
Fatal
}log_rank_t;
class CLog
{
public:
static void GetLogFilePath(CHAR* szPath)
{
memset(szPath, 0, MAX_PATH * sizeof(CHAR));
GetModuleFileNameA(NULL, szPath, MAX_PATH);
ZeroMemory(strrchr(szPath, '\\'), strlen(strrchr(szPath, '\\'))*sizeof(CHAR));
strcat(szPath, "\\");
strcat(szPath, LOG_FILE_NAME);
}
static void showArgs()
{
CHAR szPath[MAX_PATH] = { 0 };
GetLogFilePath(szPath);
ofstream fout(szPath, ios::app);
fout.seekp(ios::end);
fout <<endl;
fout.close();
}
//definition for 1 or more parameters -- 有参数时调用这个函数
template <typename T, typename... Args>
static void showArgs(T value, Args... args)
{
WriteLog(value);
showArgs(args...);
}
//输出一个内容,可以是字符串(ascii)、整数、浮点数、布尔、枚举
template <class T>
static void WriteLog(T x)
{
CHAR szPath[MAX_PATH] = { 0 };
GetLogFilePath(szPath);
ofstream fout(szPath, ios::app);
fout.seekp(ios::end);
fout << x << " ";
fout.close();
}
template <class T, typename... Args>
static void WriteLog(log_rank_t rank, const std::string function, const long line, T x, Args... args)
{
CHAR szPath[MAX_PATH] = { 0 };
GetLogFilePath(szPath);
ofstream fout(szPath, ios::app);
fout.seekp(0, fout.end);
size_t logFileSize = fout.tellp();
if (logFileSize > LOG_FILE_MAX_SIZE)
{
fout.close();
fout.open(szPath, ios::out);
}
else
fout.seekp(ios::end);
fout << GetSystemTime() << function << "\tline:" << line << "\t";
switch (rank)
{
case Info:fout << "info:\t"; break;
case Warning:fout << "warning:\t"; break;
case Error:fout << "error:\t"; break;
case Fatal:fout << "fatal:\t"; break;
default: fout << "info:\t"; break;
}
fout.close();
showArgs(x, args...);
}
private:
//获取本地时间,格式如"[2011-11-11 11:11:11] ";
static string GetSystemTime()
{
time_t tNowTime;
time(&tNowTime);
tm* tLocalTime = localtime(&tNowTime);
char szTime[30] = { '\0' };
strftime(szTime, 30, "[%Y-%m-%d %H:%M:%S] ", tLocalTime);
string strTime = szTime;
return strTime;
}
};
#ifdef LOG_ENABLE
//用下面这些宏来使用本文件
#define CYYZ_LOG_INFO(x, ...) CLog::WriteLog(Info,__FUNCTION__, __LINE__, x, ##__VA_ARGS__);
#define CYYZ_LOG_WARNING(x, ...) CLog::WriteLog(Warning,__FUNCTION__, __LINE__, x, ##__VA_ARGS__);
#define CYYZ_LOG_ERROR(x, ...) CLog::WriteLog(Error,__FUNCTION__, __LINE__, x, ##__VA_ARGS__);
#define CYYZ_LOG_FATAL(x, ...) CLog::WriteLog(Fatal,__FUNCTION__, __LINE__, x, ##__VA_ARGS__);
#else
#define CYYZ_LOG_INFO(x, ...)
#define CYYZ_LOG_WARNING(x, ...)
#define CYYZ_LOG_ERROR(x, ...)
#define CYYZ_LOG_FATAL(x, ...)
#endif
#endif