📄 log.c
字号:
// 版权说明:
// 版本号:V1.0
// 生成日期:2004.8.6
// 内容:本文件主要是创建系统运行所需要的环境,
// 可以做为系统守护进程方式运行,也可以为其它方式运行
// 作者:刘青山
// 修改时间:2004.9.20
//////////////////////////////////////////////////////////////////////
#include <time.h>
#include "natsvr.h"
#include "log.h"
static FILE* m_hFile = NULL ;
static char m_szFileName[MAX_PATH];
static char m_szAppName[80];
static pthread_mutex_t flock;
//////////////////////////////////////////////////////////////////////
#define _MAX_SIZEOFLOGFILE 409600000 // 日志文件的最大长度
//////////////////////////////////////////////////////////////////////
static char *LogStr[]=
{
"",
"Error",
"Warn ",
"Info ",
"Debug"
};
static void WriteLog(const char *pszDump, int iLen)
{
if (m_hFile == NULL)
{
return;
}
pthread_mutex_lock(&flock);
// 检查文件大小
// fseek(m_hFile, 0L, SEEK_END);
unsigned long dwSize = ftell(m_hFile);
if(dwSize > _MAX_SIZEOFLOGFILE)
{
fclose(m_hFile);
unlink(m_szFileName);
m_hFile = fopen(m_szFileName, "w");
if (m_hFile == NULL)
{
pthread_mutex_unlock(&flock);
return;
}
}
fwrite(pszDump, iLen, 1, m_hFile);
pthread_mutex_unlock(&flock);
// 显示到用户界面
DisplayInfo(pszDump);
}
/**********************************************************************
函数名称:OpenLog
功能描述:打开指定的日志文件
参数说明:
const char *szFileName --
返 回 值:
bool -- true: Successful, false: Failed.
作 者:liuqs 生成时间:2002-11-17
备 注:
**********************************************************************/
bool OpenLog(const char *szFileName)
{
if (szFileName == NULL)
{
return false;
}
m_hFile = fopen(szFileName, "a");
if (m_hFile == NULL)
{
return false;
}
pthread_mutex_init(&flock, NULL);
strcpy(m_szFileName, szFileName);
return true;
}
/**********************************************************************
函数名称:CloseLog
功能描述:关闭日志文件
返 回 值:void
作 者:liuqs 生成时间:2002-11-17
备 注:
**********************************************************************/
void CloseLog()
{
if (m_hFile != NULL)
{
pthread_mutex_lock(&flock);
fclose(m_hFile);
pthread_mutex_unlock(&flock);
m_hFile = NULL;
pthread_mutex_destroy(&flock);
}
}
/**********************************************************************
函数名称:LogOut
功能描述:向日志文件中输出带格式的字符串
参数说明:
const char *szFormat -- 参数格式同 printf
返 回 值:void
作 者:liuqs 生成时间:2002-11-17
备 注:
**********************************************************************/
void LogOut(int iLevel, const char *szFormat, ...)
{
char szTm[MAX_PATH];
time_t nTime = time(NULL);
struct tm *ptm = localtime(&nTime);
if (iLevel > KLOG_LEVEL)
{
return ;
}
if (m_hFile == NULL)
{
DisplayInfo( "LogOut(),the log file can't open" );
return;
}
char buf[4096];
va_list arglist;
va_start(arglist, szFormat);
vsprintf(buf, szFormat, arglist);
va_end(arglist);
pthread_mutex_lock(&flock);
// 检查文件大小
// fseek(m_hFile, 0L, SEEK_END);
unsigned long dwSize = ftell(m_hFile);
if(dwSize > _MAX_SIZEOFLOGFILE)
{
fclose(m_hFile);
unlink(m_szFileName);
m_hFile = fopen(m_szFileName, "w");
if (m_hFile == NULL)
{
pthread_mutex_unlock(&flock);
return;
}
}
sprintf(szTm, "[%s] %d-%02d-%02d %02d:%02d:%02d ",
LogStr[iLevel], ptm->tm_year+1900,
ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
fwrite(szTm, strlen(szTm), 1, m_hFile);
fwrite(buf, strlen(buf), 1, m_hFile);
fwrite("\x0A", 1, 1, m_hFile);
pthread_mutex_unlock(&flock);
// 显示到用户界面
//DisplayInfo(buf);
return;
}
/**********************************************************************
函数名称:IsOpenLog
功能描述:判断日志文件是否已打开
返 回 值:
bool -- true: Successful, false: Failed.
作 者:liukeai 生成时间:2002-12-08
备 注:
**********************************************************************/
bool IsOpenLog()
{
if (m_hFile != NULL)
{
return true;
}
else
{
return false;
}
}
/**********************************************************************
函数名称:DisplayInfo
功能描述:向用户界面显示信息
参数说明:
const char *pszInfo --
返 回 值:void
作 者:liuqs 生成时间:2002-12-08
备 注:LogOut() 方法每次调用该函数
**********************************************************************/
void DisplayInfo(const char *pszInfo)
{
#ifdef _DEBUG
time_t t = time(NULL);
struct tm *ptm = localtime(&t);
printf("%02d:%02d:%02d %s: %s \n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec, m_szAppName, pszInfo);
#endif
}
void SetAppName(const char *pAppName)
{
if (pAppName != NULL)
strcpy(m_szAppName, pAppName);
}
void MemDump(unsigned char *pucaAddr, long lLength)
{
int i,j,n;
int iPage = 20;
int iTemp;
char caTmp[100];
char caBuf[1650];
unsigned char *pcPtr;
pcPtr=pucaAddr;
caBuf[0]='\0';
while ( pcPtr < (pucaAddr + lLength))
{
for (j=0;j <= (lLength-1)/16 ; j++)
{
if (j == (j/iPage)*iPage)
{
strcpy(caTmp,"Displacement ");
strcat(caTmp,"-1--2--3--4--5--6--7--8-Hex-0--1--2--3--4--5--6");
strcat(caTmp," --ASCII Value--\n");
WriteLog( caTmp,strlen(caTmp));
}
iTemp = j*16;
if (iTemp < 10)
{
sprintf(caTmp,"0000%d",iTemp);
}
else
{
if (iTemp < 100)
{
sprintf(caTmp,"000%d",iTemp);
}
else
{
if (iTemp < 1000)
{
sprintf(caTmp,"00%d",iTemp);
}
else
{
if (iTemp < 10000)
{
sprintf(caTmp,"0%d",iTemp);
}
else
{
sprintf(caTmp,"%d",iTemp);
}
}
}
}
if (iTemp < 16)
{
sprintf(caTmp,"%s(0000%x) ",caTmp,iTemp);
}
else
{
if (iTemp < 256)
{
sprintf(caTmp,"%s(000%x) ",caTmp,iTemp);
}
else
{
if (iTemp < 4096)
{
sprintf(caTmp,"%s(00%x) ",caTmp,iTemp);
}
else
{
if (iTemp < 65536)
{
sprintf(caTmp,"%s(0%x) ",caTmp,iTemp);
}
else
{
sprintf(caTmp,"%s(%x) ",caTmp,iTemp);
}
}
}
}
for (i=0;(i<16) && (pcPtr < (pucaAddr+lLength));i++)
{
if (*pcPtr < 16)
{
sprintf(caTmp,"%s0%x ",caTmp,*pcPtr);
}
else
{
sprintf(caTmp,"%s%2x ",caTmp,*pcPtr);
}
pcPtr += 1;
}
for (n=0;n < 16-i ;n++)
{
sprintf(caTmp,"%s ",caTmp);
}
sprintf(caTmp,"%s ",caTmp);
pcPtr = pcPtr - i;
for (n=0;n < i ;n++)
{
if ((*pcPtr <= 31) && (*pcPtr >= 0))
{
sprintf(caTmp,"%s*",caTmp);
}
else
{
sprintf(caTmp,"%s%c",caTmp,*pcPtr);
}
pcPtr += 1;
}
strcat(caBuf,caTmp);
strcat(caBuf,"\n");
if (j == (j/iPage)*iPage)
{
WriteLog( caBuf,strlen(caBuf));
caBuf[0]='\0';
}
} /* end of for */
} /* end of while */
WriteLog(caBuf,strlen(caBuf));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -