来自百度文库~
头文件.h:
#pragma once
#include <strstream>
//定义宏LOG_FILE(level,…)
//该宏函数可以写带文件名、行号、时间和信息的log
#define LOG_FILE(level,...)\
{\
myLog *log=new myLog();\
log->LogFileNum(__FILE__,__LINE__,level,##__VA_ARGS__); \
delete log;\
}
//定义宏LOG_FUN(level,…)
//该宏函数可以写带模块名,时间和信息的log
#define LOG_FUN(level,...)\
{\
myLog *log=new myLog();\
log->LogFunction(__FUNCTION__,level,##__VA_ARGS__); \
delete log;\
}
//定义LOG(...)
//该宏函数写最基本的日志,与printf()一样,具体格式有用户定义;
#define LOG(...)\
{\
myLog *log=new myLog();\
log->LogPrintf(##__VA_ARGS__); \
delete log;\
}
enum E_LOG_LEVEL{
/** fatal */ LOG_LEVEL_FATAL = 000,
/** alert */ LOG_LEVEL_ALERT,
/** crit */ LOG_LEVEL_CRIT,
/** error */ LOG_LEVEL_ERROR,
/** warn */ LOG_LEVEL_WARN,
/** notice */ LOG_LEVEL_NOTICE,
/** info */ LOG_LEVEL_INFO,
/** debug */ LOG_LEVEL_DEBUG,
/** trace */ LOG_LEVEL_TRACE,
/** notset */ LOG_LEVEL_NOTSET,
/** unknown */ LOG_LEVEL_UNKNOWN
};
#define LOG_ERROR LOG_LEVEL_ERROR
#define LOG_WARN LOG_LEVEL_WARN
#define LOG_INFO LOG_LEVEL_INFO
#define LOG_DEBUG LOG_LEVEL_DEBUG
class myLog
{
public:
myLog(void);
~myLog(void);
// 要写入log的文件名;
char *m_szFilename;
// 写log;
bool WriteLog(const char * szFileName, const char * strMsg);
// 日志接口函数;
bool LogInfo(
const char *strFile,
const int &iLineNum,
const int &iPriority,
const char *strMsg,
const char *strCatName
);
// 初始化;
void LogInit(void);
//带时间文件路径和行号的写日志格式;
bool LogFileNum(
const char *strFile,
const int &iLineNum,
const int &iPriority,
const char* format,
...
);
//带时间和功能模块名的日志;
bool LogFunction(
const char *strFun,
const int &iPriority,
const char* format,
...
);
//日志内容由客户自己定义;
bool LogPrintf(
const char* format,
...
);
};
实现文件.cpp:
/*
错误解决:
#error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version...
解决方法:右击项目-->属性-->配置属性-->常规,然后在右边的“项目默认值”中的“MFC的使用”选项中选择“在共享 DLL 中使用 MFC”,在运行,解决了。
*/
//日志的实现;
#include <iostream>
#include <afx.h>
#include "myLog.h"
const char *Level[] = { "FATAL", "ALERT", "CRIT", "ERROR", "WARN", "NOTICE", "INFO", "DEBUG", "TRACE", "NOTSET", "UNKNOWN" };
#define MAXLINSIZE 4096
myLog::myLog(void)
:m_szFilename(NULL)
{
LogInit();//用于初始化日志的文件名
}
myLog::~myLog(void)
{
}
// 写log;
bool myLog::WriteLog(const char * szFileName, const char * strMsg)
{
FILE * fp = fopen(szFileName, "at+");
if (NULL == fp)
{
return false;
}
fprintf(fp, "%s\r\n", strMsg);
fflush(fp);
fclose(fp);
return TRUE;
}
// 初始化;
void myLog::LogInit(void)
{
m_szFilename = "./log.log";
}
//带时间文件路径和行号的写日志格式;
bool myLog::LogFileNum(
const char *strFile,
const int &iLineNum,
const int &iPriority,
const char *format,
...
)
{
SYSTEMTIME systime;
char logstr[MAXLINSIZE + 1];
char logMsg[2 * MAXLINSIZE];
va_list argp;
va_start(argp, format);
if (NULL == format || 0 == format[0])
return false;
_vsnprintf(logstr, MAXLINSIZE, format, argp);
va_end(argp);
GetLocalTime(&systime);
sprintf(logMsg, "[%04d-%02d-%02d %02d:%02d:%02d] %s| %d |%s |%s",
systime.wYear, systime.wMonth, systime.wDay,
systime.wHour, systime.wMinute, systime.wSecond,
strFile, iLineNum, Level[iPriority], logstr);
WriteLog(m_szFilename, logMsg);
return true;
}
//带时间和功能模块名的日志;
bool myLog::LogFunction(
const char *strFun,
const int &iPriority,
const char* format,
...
)
{
SYSTEMTIME systime;
char logstr[MAXLINSIZE + 1];
char logMsg[2 * MAXLINSIZE];
va_list argp;
va_start(argp, format);
if (NULL == format || 0 == format[0])
return false;
_vsnprintf(logstr, MAXLINSIZE, format, argp);
va_end(argp);
GetLocalTime(&systime);
sprintf(logMsg, "[%04d-%02d-%02d %02d:%02d:%02d] %s|%s |%s",
systime.wYear, systime.wMonth, systime.wDay,
systime.wHour, systime.wMinute, systime.wSecond,
strFun, Level[iPriority], logstr);
WriteLog(m_szFilename, logMsg);
return true;
}
//日志内容由客户自己定义;
bool myLog::LogPrintf(
const char* format,
...
)
{
char logstr[MAXLINSIZE + 1];
va_list argp;
va_start(argp, format);
if (NULL == format || 0 == format[0])
return false;
_vsnprintf(logstr, MAXLINSIZE, format, argp);
va_end(argp);
WriteLog(m_szFilename, logstr);
return true;
}
调用:
#include "myLog.h"
LOG_FUN(LOG_LEVEL_NOTICE,"##################################################################");
或
LOG_FILE(LOG_LEVEL_INFO, "======[ Send Spitslot ==> %s ]=====", "your message");