⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xlog.cpp

📁 BCB的学习资料
💻 CPP
字号:
//---------------------------------------------------------------------------


#pragma hdrstop

#include "XLog.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)
namespace zdhsoft
{

XLog::XLog()
{
    m_LogFileOut = false;
    m_StringsOut = false;
    m_IsSyncFlag = false;
    m_DateTimeFlag = false;
    m_LevelFlag = false;
    m_Level = LOG_LEVEL_DEBUG;
    m_LogFile = "C:\\xlog.log";//default file name
    m_fp = NULL;
    m_OutStrings = NULL;
    m_SyncFlag = new TCriticalSection();
    m_LogFileCount = 0;
    m_LogFileSize = 1024*1024;  //默认大小为1M
    m_MaxLogFileCount = 10;     //默认最大文件计数为10;
}
XLog::~XLog()
{
    if( m_fp != NULL ) fclose(m_fp);
    delete m_SyncFlag;
}
void XLog::Trace(char * fmt,...) 
{
   va_list argptr;
   va_start(argptr, fmt);
   __WriteLog(LOG_LEVEL_TRACE,fmt,argptr);
}
void XLog::Debug(char * fmt,...)
{
   va_list argptr;
   va_start(argptr, fmt);
   __WriteLog(LOG_LEVEL_DEBUG,fmt,argptr);
}
void XLog::Info (char * fmt,...)
{
   va_list argptr;
   va_start(argptr, fmt);
   __WriteLog(LOG_LEVEL_INFO,fmt,argptr);
}
void XLog::Error(char * fmt,...)
{
   va_list argptr;
   va_start(argptr, fmt);
   __WriteLog(LOG_LEVEL_ERROR,fmt,argptr);
}
void XLog::Fatal(char * fmt,...)
{
   va_list argptr;
   va_start(argptr, fmt);
   __WriteLog(LOG_LEVEL_FATAL,fmt,argptr);
}
void XLog::Trace(const AnsiString & strMessage)
{
    __WriteLog(LOG_LEVEL_TRACE,strMessage);
}
void XLog::Debug(const AnsiString & strMessage)
{
    __WriteLog(LOG_LEVEL_DEBUG,strMessage);
}
void XLog::Info (const AnsiString & strMessage)
{
    __WriteLog(LOG_LEVEL_INFO,strMessage);
}
void XLog::Error(const AnsiString & strMessage)
{
    __WriteLog(LOG_LEVEL_ERROR,strMessage);
}
void XLog::Fatal(const AnsiString & strMessage)
{
    __WriteLog(LOG_LEVEL_FATAL,strMessage);
}
void __fastcall XLog::__WriteLog(int iLogLevel,const AnsiString & strMessage)
{
    if( iLogLevel<m_Level || iLogLevel>4 ) return; //如果超出有效范围,则返回
    if( IsSyncFlag ) m_SyncFlag->Acquire();
    try{
        if( m_LogFileOut == false && m_StringsOut == false ) return; //如果没有打输出,则不输出
        static char *LevelString[] =
        {
            "TRACE",
            "DEBUG",
            " INFO",
            "ERROR",
            "FATAL",
        };
        static const AnsiString LN = "\n";

        if( m_fp != NULL || m_OutStrings != NULL)
        {
            AnsiString strPrompt;
            if( m_DateTimeFlag)
            {
                XDate aDate(Now());
                XTime aTime(Now());
                if( m_LevelFlag )
                {
                    strPrompt.printf("[%04d-%02d-%02d %02d:%02d:%02d.%03d,%s] ",
                        aDate.GetYear(),aDate.GetMonth(),aDate.GetDay(),
                        aTime.GetHour(),aTime.GetMinute(),aTime.GetSecond(),aTime.GetMillis(),
                        LevelString[iLogLevel]
                    );
                }
                else
                {
                    strPrompt.printf("[%04d-%02d-%02d %02d:%02d:%02d.%03d] ",
                        aDate.GetYear(),aDate.GetMonth(),aDate.GetDay(),
                        aTime.GetHour(),aTime.GetMinute(),aTime.GetSecond(),aTime.GetMillis()
                    );
                }
            }
            else
            {
                if( m_LevelFlag )
                {
                    strPrompt.printf("[%s] ",LevelString[iLogLevel]);
                }
                else
                {
                    //do nothing
                }
            }
            //AnsiString strTmp;
            //strTmp.vprintf(fmt,arglist);
            AnsiString strOut;
            strOut.printf("%s%s",strPrompt.c_str(),strMessage.c_str());
            //写入到文件
            if( m_fp != NULL && m_LogFileOut ){

                CheckLogFile();
                if( m_fp )
                {
                    fwrite(strOut.c_str(),strOut.Length(),1,m_fp);
                    fwrite(LN.c_str(),LN.Length(),1,m_fp);
                    fflush(m_fp);
                }
            }
            //写入到串数组
            if( m_OutStrings != NULL && m_StringsOut)
            {
                m_OutStrings->Add(strOut);
            }
        }
    }__finally
    {
        if( IsSyncFlag ) m_SyncFlag->Leave();
    }
}
void __fastcall XLog::__WriteLog(int iLogLevel, char * fmt, va_list arglist) 
{
    if( iLogLevel<m_Level || iLogLevel>4 ) return; //如果超出有效范围,则返回
    if( IsSyncFlag ) m_SyncFlag->Acquire();
    try{
        if( m_LogFileOut == false && m_StringsOut == false ) return; //如果没有打输出,则不输出
        static char *LevelString[] =
        {
            "TRACE",
            "DEBUG",
            " INFO",
            "ERROR",
            "FATAL",
        };
        static const AnsiString LN = "\n";

        if( m_fp != NULL || m_OutStrings != NULL)
        {
            AnsiString strPrompt;
            if( m_DateTimeFlag)
            {
                XDate aDate(Now());
                XTime aTime(Now());
                if( m_LevelFlag )
                {
                    strPrompt.printf("[%04d-%02d-%02d %02d:%02d:%02d.%03d,%s] ",
                        aDate.GetYear(),aDate.GetMonth(),aDate.GetDay(),
                        aTime.GetHour(),aTime.GetMinute(),aTime.GetSecond(),aTime.GetMillis(),
                        LevelString[iLogLevel]
                    );
                }
                else
                {
                    strPrompt.printf("[%04d-%02d-%02d %02d:%02d:%02d.%03d] ",
                        aDate.GetYear(),aDate.GetMonth(),aDate.GetDay(),
                        aTime.GetHour(),aTime.GetMinute(),aTime.GetSecond(),aTime.GetMillis()
                    );
                }
            }
            else
            {
                if( m_LevelFlag )
                {
                    strPrompt.printf("[%s] ",LevelString[iLogLevel]);
                }
                else
                {
                    //do nothing
                }
            }
            AnsiString strTmp;
            strTmp.vprintf(fmt,arglist);
            AnsiString strOut;
            strOut.printf("%s%s",strPrompt.c_str(),strTmp.c_str());
            //写入到文件
            if( m_fp != NULL && m_LogFileOut ){

                CheckLogFile();
                if( m_fp )
                {
                    fwrite(strOut.c_str(),strOut.Length(),1,m_fp);
                    fwrite(LN.c_str(),LN.Length(),1,m_fp);
                    fflush(m_fp);
                }
            }
            //写入到串数组
            if( m_OutStrings != NULL && m_StringsOut)
            {
                m_OutStrings->Add(strOut);
            }
        }
    }__finally
    {
        if( IsSyncFlag ) m_SyncFlag->Leave();
    }
}

void XLog::CheckLogFile() 
{
    //not check m_fp && m_LogFileOut
    int iLen = ftell(m_fp);
    if( iLen >= LogFileSize )
    {
        fclose(m_fp);
        AnsiString strTmp;
        if( m_LogFileCount >= m_MaxLogFileCount ) m_LogFileCount = 0;
        strTmp.printf("%s.%d",m_LogFile.c_str(),m_LogFileCount);
        m_LogFileCount++;
        //更换文件名
        if( FileExists( strTmp ) ) DeleteFile(strTmp);
        RenameFile(m_LogFile,strTmp);
        m_fp = fopen(m_LogFile.c_str(),"a");
    }
}
void XLog::CloseLogFileOut()
{
    m_SyncFlag->Acquire();
    m_LogFileOut = false;
    if( m_fp != NULL )
    {
        fclose(m_fp);
        m_fp = NULL;
    }
    m_SyncFlag->Leave();
}
void XLog::OpenLogFileOut()
{
    m_SyncFlag->Acquire();
    m_LogFileOut = true;
    if( m_fp == NULL )
    {
        FILE * fp = fopen(m_LogFile.c_str(),"a");
        if( fp != NULL)
        {
            if( m_fp != NULL ) fclose( m_fp );
            m_fp = fp;
        }
    }
    m_SyncFlag->Leave();
}
void XLog::CloseStringsOut()
{
    m_SyncFlag->Acquire();
    m_StringsOut = false;
    m_SyncFlag->Leave();
}
void XLog::OpenStringsOut()
{
    m_SyncFlag->Acquire();
    m_StringsOut = true;
    m_SyncFlag->Leave();
}

void __fastcall XLog::SetLevel(int v)
{
    if( v < 0 || v > 4 ) return;
    m_Level = v;
}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -