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