c++ 日志(写到文件)

这是一个C++的日志记录类实现,用于将不同级别的日志信息(ERROR、WARN、INFO、DEBUG)写入文件。类FLOG包含初始化、设置日志级别和输出到文件的功能,并具备文件大小限制,超过限制时会创建新的日志文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/************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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值