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

📄 log.c

📁 自己开发基于P2P通讯的网络服务器
💻 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 + -