代码执行时记录日志是很有必要的,尤其在涉及到多进程、多线程调试或者是调试服务程序时。本分分享一个最近写的简单的日志类,希望有所帮助。不喜欢废话,上代码了:
头文件如下:
#pragma once
#include
using std::string;
using std::wstring;
class CSimpleLog
{
public:
CSimpleLog(void);
~CSimpleLog(void);
void Write(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText);
void Write(const char* pSourcePath, const char* pFunName, const long lLine, const wchar_t* pLogText);
void ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const char* pLogText, ...);
void ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const wchar_t* pLogText, ...);
protected:
string GetTime();
string U2A(const wstring& str);
};
extern CSimpleLog g_log;
#define SL_LOG(x) g_log.Write(__FILE__, __FUNCTION__, __LINE__, x)
#define SL_LOG1(x, p1) g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1)
#define SL_LOG2(x, p1, p2) g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1, p2)
#define SL_LOG3(x, p1, p2, p3) g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1, p2, p3)
实现文件:
#include "StdAfx.h"
#include "SimpleLog.h"
#include
CSimpleLog g_log;
const char* g_pLogPath="c:\\simple.log";
CSimpleLog::CSimpleLog(void)
{
}
CSimpleLog::~CSimpleLog(void)
{
}
void CSimpleLog::Write( const char* pSourcePath, const char* pFunName, \
const long lLine, const char* pLogText )
{
if ( pLogText == NULL )
return ;
int nLogLen=strlen(pLogText);
if ( nLogLen == 0 )
return ;
int nSourceLen=strlen(pSourcePath);
int nFunLen =strlen(pFunName);
char szLine[10]={0};
sprintf_s(szLine, "%ld", lLine);
int nLineLen=strlen(szLine);
int nSpaceLen=80-nSourceLen-nFunLen-nLineLen;
string strTime=GetTime();
FILE* fp=NULL;
fopen_s(&fp, g_pLogPath, "a+");
fwrite(strTime.c_str(), strTime.size(), 1, fp);
fwrite(" ", 1, 1, fp);
fwrite(pSourcePath, nSourceLen, 1, fp);
for (int i=0; i
这里把日志记录目录固定了,你也可以扩展下,提供一个设置保存路径的接口,或者是日志到了多大就换个文件来存储之类的。
如何使用?
你只需要在需要记录日志的地方加上宏:
SL_LOG
SL_LOG1
SL_LOG3
1,2,3分别表示的是参数的个数,至于参数的类型和C语言格式化输出一样的。
日志输出结果包含:时间、文件名、函数名、日志内容。