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();
}