小型日志类

设计成单独一个头文件

#pragma once

#include <windows.h>
#include <fstream>
#include <ctime>
#include <string>
using namespace std;

#define DEBUGLOG "Debug"
#define EXCEPTION "Exception"
#define RESULT "Result"
#define TASKLOG "Task"
#define XML "Xml"

#define MAX_FILES 3
#define MAX_SIZE 1024*1024*4

class log4nb
{
private:
         log4nb( const char* logfileName )
         {
             memset(localID,0,sizeof(localID));

             memset(exception,0,sizeof(exception));
             memset(result,0,sizeof(result));
             memset(debug,0,sizeof(debug));
             memset(xml,0,sizeof(xml));
             memset(task,0,sizeof(task));

             sprintf_s(debug,sizeof(debug),"%s.log",logfileName);
             sprintf_s(exception,sizeof(exception),"%s.log",EXCEPTION);
             sprintf_s(result,sizeof(result),"%s.log",RESULT);
             sprintf_s(task,sizeof(task),"%s.log",TASKLOG);
             sprintf_s(xml,sizeof(xml),"%s.log",XML);
         }
 
        static log4nb* _instance;
        ofstream* pf_normal;
        ofstream* pf_exception;
        ofstream* pf_result;
        ofstream* pf_task;
        ofstream* pf_xml;    
private:
    char debug[50];
    char exception[50];
    char result[50];
    char task[50];
    char xml[50];
    char localID[50];
public:
         ~log4nb()
         {
              _instance = NULL;
         }
		 //设置当前日志信息类型
         void inline setLocalID(const char* id)
         {
            if( strlen(id) > 0 )
                strcpy_s(localID,sizeof(localID),id);
         }
 
         static log4nb* GetPtr( const char* fileName )
         {
            
                  if(!_instance)
                            _instance = new log4nb(fileName);
                  return(_instance);
         }
 
         static log4nb& GetObj( const char* fileName )
         {
                  if(!_instance)
                            _instance = new log4nb(fileName);
                  return(*_instance);
         }
		 //输出不含时间戳的DEBUG日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& Write(T val)
         {
             return Write(val,pf_normal);
         }
		 //输出含时间戳的DEBUG日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& tmWrite(T val)
         {
             pf_normal = new ofstream (debug, ios::app);
             log4nb& log = tmWrite(val,pf_normal);
             logscroller(pf_normal,debug);
             return log;
         }
		 //输出含时间戳的Exception日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& tmException(T val)
         {
             pf_exception = new ofstream(exception,ios::app);
             log4nb& log = tmWrite(val,pf_exception);
             logscroller(pf_exception,exception);
             return log;
         }
		 //输出含时间戳的Result日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& tmResult(T val)
         {
             pf_result = new ofstream(result,ios::app);
             log4nb& log = tmWrite(val,pf_result);
             logscroller(pf_result,result);
             return log;
         }
		 //输出含时间戳的Task日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& tmTask(T val)
         {
             pf_task = new ofstream(task,ios::app);
             log4nb& log = tmWrite(val,pf_task);
             logscroller(pf_task,task);
             return log;
         }
		 //输出含时间戳的Xml日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& tmXml(T val)
         {
			 pf_xml = new ofstream(xml,ios::app);
			 log4nb& log = tmWrite(val,pf_xml);
			 logscroller(pf_xml,xml);
			 return log;
         }
		 //输出不含时间戳的DEBUG日志,可传入任意重载了<<操作符的对象
         template<class T> inline log4nb& operator<< (T val)
         {
			pf_normal = new ofstream(debug,ios::app);
            (*pf_normal) << val ;
			pf_normal->flush();
			logscroller(pf_normal,debug);
			return *this;
         }

private:
         template<class T> inline log4nb& Write(T val,ofstream* pf)
         {
			 (*pf) << val;
			 pf->flush();
			 return *this;
         }
        
         template<class T> inline log4nb& tmWrite(T val,ofstream* pf)
         {
            char strBuf[100];       
            time_t ltime;
            time( <ime );
            struct tm today;
            localtime_s(&today,<ime );
            sprintf_s(strBuf,sizeof(strBuf), "%4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d  |  %s  > ",
                today.tm_year+1900, today.tm_mon+1, today.tm_mday, today.tm_hour,
                today.tm_min, today.tm_sec,localID);
       
            (*pf) << strBuf << val << "\r\n";
            pf->flush();
            return *this;
         }

         void logscroller(ofstream* pf,const char* name)
         {
              int beg = 0;
              int end = 0;

              pf->seekp(0,ios::beg);
              beg = pf->tellp();
              pf->seekp(0,ios::end);
              end = pf->tellp();
              if( (end-beg) > MAX_SIZE )
              {
                  pf->close();
                  char* first = new char[MAX_PATH];
                  char* second = new char[MAX_PATH];
                  for(int i = MAX_FILES;i >= 2;i--)
                  {
                      sprintf_s(first,MAX_PATH,"%s.%d",name,i-1);
                      sprintf_s(second,MAX_PATH,"%s.%d",name,i);
                      ::MoveFileEx(first,second,MOVEFILE_REPLACE_EXISTING);
                  }
                  sprintf_s(first,MAX_PATH,"%s.%d",name,1);
                  ::MoveFileEx(name,first,MOVEFILE_REPLACE_EXISTING);
                  delete first;
                  delete second;
              }else pf->close();
         }
 
};

log4nb* log4nb::_instance;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值