www.pudn.com > xml2db.rar > clog.cpp
/** *@file clog.h *@brief 记录文件日志的工具类 * *Author: cuichao@boco.com.cn \n *ChangeLog: \n * 2005-9-27 19:48: create file \n */ #include#include #include #include #include #include #include #include #include "clog.h" using namespace std; static string m_errstr; static const char * Time2Str(int sec) { static char strbuf[22]; struct tm *tm_now; tm_now=localtime(&sec); tm_now->tm_year += 1900; tm_now->tm_mon ++; sprintf(strbuf, "%04d-%02d-%02d %02d:%02d:%02d", tm_now->tm_year, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec); return strbuf; } struct CLog::dm { ofstream m_fo; long m_cur_size; long m_max_size; string m_fn; }; CLog::CLog():_dm(0) { } CLog::~CLog() { if(_dm!=0) { _dm->m_fo.close(); delete _dm; _dm=0; } } bool CLog::init(const char *fn,long max_len) { if(_dm!=0 ) { _dm->m_fo.close(); delete _dm; _dm=0; } _dm= new dm(); _dm->m_fo.open(fn,ios_base::app); if(!(_dm->m_fo.is_open())) { m_errstr ="Error(init): open file "; m_errstr += fn; return false; } struct stat _tat; if(stat(fn,&_tat)==-1) { _dm->m_cur_size=0; } else { _dm->m_cur_size=_tat.st_size; _dm->m_fn=fn; _dm->m_max_size=max_len; } return true; } bool CLog::cleanup() { if(_dm!=0 ) { _dm->m_fo.close(); delete _dm; _dm=0; } return true; } long CLog::write(const char *msg) { const char *str_time=Time2Str(time(NULL)); long msg_size=strlen(msg)+strlen(str_time); _dm->m_cur_size+=msg_size; (_dm->m_fo)< m_fo).fail()) { _dm->m_fo.close(); _dm->m_fo.open((_dm->m_fn).c_str(),ios_base::app); } if((_dm->m_cur_size)>=(_dm->m_max_size)) { _dm->m_fo.close(); remove((_dm->m_fn+".OLD").c_str()); rename(_dm->m_fn.c_str(),(_dm->m_fn+".OLD").c_str()); _dm->m_fo.open((_dm->m_fn).c_str()); _dm->m_cur_size=0; } return msg_size; } const char* CLog::GetErrstr() { return m_errstr.c_str(); }