📄 xlog.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 + -