c++ 日志(写到文件)

来源:互联网 发布:淘宝教学视频 编辑:程序博客网 时间:2024/05/17 23:11

/************filelog.h*****************************************************************************************/

#if !defined _FILE_FLOG_H
#define _FILE_FLOG_H
/*
 *日志写入文件,
 *
 *
 */

#include <iostream>
#include <ios>
#include <time.h>
#include <fstream>
#include <stdio.h>
#include <stdarg.h>
#include <string>
#include <sstream>
#include <errno.h>
#include <cutil.h>
#include <map>

using namespace std;
using namespace CPPSocket;

namespace CPPSocket
{
  class FLOG{
   public:
     typedef enum RANK
     {
      ERROR = 0,
      WARN  = 1,
      INFO  = 2,
      DEBUG = 3
     }LOGRANK;
   
   public:
    FLOG();
    ~FLOG();
    
    void init(map<string,string>& cfg);
    void init(string filename,LOGRANK rank=INFO,bool m_isBuf=false);
      FLOG& getTime(LOGRANK rank);
 
    template<class T> friend FLOG& operator<<(FLOG& out,T i)
    {
     if( out.m_rank <= out.m_initRank )
      out.m_os<<i;      
     return out;
     }
   
    friend FLOG& operator<<(FLOG& out,LOGRANK rank)  //设置日志级别
    {      
     out.m_rank = rank;
     return out;
     }
    
    friend FLOG& operator<<(FLOG& out,FLOG& lout)
    {
     return out;
    }
    
    friend FLOG& operator<<(FLOG& out,ostream& (*fendl)(ostream&))
    {
     if( out.m_rank <= out.m_initRank ){
      out.openlog();
      if(out.m_fileOpen){
       out.m_os<<"/n";
       out.m_logfile<<out.m_os.str();
       if(!out.m_isBuf) out.m_logfile<<flush;
      }else cout<<out.m_os.str()<<endl;                     
          out.m_os.str(""); //清空缓冲区
        }
        out.m_rank = FLOG::LOG_INFO; //恢复日志默认级别
        return out;
    }
    
   private:
    FLOG& operator=(FLOG& log);
    FLOG(FLOG& log);
     void openlog();
   private:
    string m_logname;
    string m_cur_logname;
    ofstream m_logfile;
    stringstream m_os;
    bool m_fileOpen;
    LOGRANK m_rank;
    LOGRANK m_initRank;
    bool m_isBuf;
   public:
    static const LOGRANK LOG_ERROR = ERROR;
    static const LOGRANK LOG_WARN  = WARN;
    static const LOGRANK LOG_INFO  = INFO;
    static const LOGRANK LOG_DEBUG = DEBUG;
  };
 
  namespace FILELOG
  {
    typedef  FLOG LOG; 
    extern FLOG mlog;
  }
 
}

using namespace CPPSocket::FILELOG;

#endif

/*******************************************filelog.cpp*****************************************/

#include "filelog.h"
#include <sstream>

using namespace CPPSocket;

namespace CPPSocket
{
 namespace FILELOG
 {
    FLOG mlog;
  }
 
  FLOG::FLOG():m_fileOpen(false),m_rank(INFO),m_initRank(INFO),m_isBuf(false)
  {
 
  }
 
  FLOG::~FLOG()
  {
   if(m_fileOpen){
    cout<<"[close file]"<<m_cur_logname<<endl;
    m_logfile.close();
    m_fileOpen = false;
   }
  }
 
  void FLOG::init(string filename,LOGRANK rank,bool isBuf)
  {    
   cout<<"into FLOG::init"<<endl;
   m_initRank = rank;
   m_isBuf = isBuf;
   if(filename.size()==0) return;
   m_logname = filename;
   m_cur_logname = m_logname + T::getTime();
   cout<<"[log file name]"<<m_cur_logname<<endl;
   m_logfile.open(m_cur_logname.c_str(),ios::out|ios::app);
   if(!m_logfile){
    m_fileOpen = false;
    return;
   }
   cout<<m_cur_logname<<"open sucess."<<endl;
   m_fileOpen = true;
  }
 
  void FLOG:: init(map<string,string>& cfg)
  {
   string fname = "";
   LOGRANK rank = INFO;
   bool isBuf = false;
   map<string,string>::iterator it = cfg.find("FILE");
   if(it != cfg.end()) fname = it->second;
   it = cfg.find("RANK");
   if(it != cfg.end()){
        if("ERROR" == it->second)      rank = LOG::LOG_ERROR;
        else if("WARN" == it->second)  rank = LOG::LOG_WARN;
        else if("INFO" == it->second)  rank = LOG::LOG_INFO;
        else if("DEBUG" == it->second) rank = LOG::LOG_DEBUG;
   }
   it = cfg.find("ISBUF"); 
   if(it != cfg.end()){
    if("TRUE" == it->second)       isBuf = true;
      else if("FALSE" == it->second) isBuf = false;
    }
   init(fname,rank,isBuf);
  }
 
  void FLOG::openlog()
  {   
   if(!m_fileOpen) return;
   if(1792*1024*1024 < m_logfile.tellp()){ // FLOG文件不超过1.8GB  
    m_logfile.close();
    m_cur_logname = m_logname + T::getTime();
    m_logfile.open(m_cur_logname.c_str(),ios::out|ios::app);
     if(m_logfile.fail()) m_fileOpen = false;
     else m_fileOpen = true;
   }
  }
 
  FLOG& FLOG:: getTime(LOGRANK rank)
  {
   m_rank = rank;
   
   if( m_rank <= m_initRank )
    m_os<<T::getTime1();

   return *this;
  }
 
}

 

/*******************************************************test.cpp*********************/

#include<iostream>

#incldue "filelog.h"

using namesapce std;

using namesapce CPPSocket;


int main(int argc,char * argv[])
{
 mlog.init("/tmp/log.log",LOG::LOG_ERROR);
 mlog<<LOG::LOG_ERROR<<T::getTime1()<<"test LOG_ERROR"<<endl;

 mlog.getTime(LOG::LOG_ERROR)<<"test LOG_ERROR"<<endl;
 mlog<<LOG::LOG_WARN<<T::getTime1()<<"test LOG_WARN"<<endl;
 mlog<<LOG::LOG_INFO<<T::getTime1()<<"test LOG_INFO"<<endl;
 mlog<<LOG::LOG_DEBUG<<T::getTime1()<<"test LOG_DEBUG"<<endl;  
 mlog<<LOG::LOG_ERROR<<T::getTime1()<<"test end---------"<<endl; 
 return 0;
}

原创粉丝点击