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

📄 debug.c

📁 输出文件,log
💻 C
字号:
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <syslog.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>

#include "debug.h"

//#include <ims_type.h>
#define MAX_BUF 4096


static char WORK_PATH[255];
static char LOG_FILE_NAME[50];

int DEBUG_LEVEL = INFO;

#define SHARED		1
#define EXCLUSIVE	2

char level_string[][10] = 
{
	"FATAL",
	"ERROR",
	"WARNING",
	"INFO",
	"DEBUG",
	"TRACE",
	"VERBOSE",
};  /*  以上字符串长度不能大于 10-1  */

char header[MAX_BUF];

void dbg_init(int level, char* workpath, char* log_name)
{
	DEBUG_LEVEL = level;
	snprintf(WORK_PATH, sizeof(WORK_PATH), "%s", workpath);
	snprintf(LOG_FILE_NAME, sizeof(LOG_FILE_NAME), "%s", log_name);
}
/********************************************
 *  拼接日志文件名,写入日志文件
 ********************************************/
int dbg_real_write(int mode, char *logbuf)
{
	static int errlog = 0;
	char logfile[MAX_BUF];
	int flags = O_RDWR|O_CREAT|O_APPEND;
	int logfd;

	if ( mode == SHARED )
		snprintf(logfile, MAX_BUF, "%s/log/%s",
			WORK_PATH, LOG_FILE_NAME);
	else
		snprintf(logfile, MAX_BUF, "%s/log/%s-%d",
			WORK_PATH, LOG_FILE_NAME, (int)getpid());

	if ( (logfd=open(logfile, flags, 0644)) < 0 )
	{
		int ferr = errno;
		if (!errlog)
		{
			openlog(LOG_FILE_NAME, LOG_PID, LOG_USER);
			syslog(LOG_CRIT, "Error open %s: %s\n", logfile, strerror(ferr));
			errlog = 1;
		}
		return 0;
	}
	write(logfd, logbuf, strlen(logbuf));
	close(logfd);

	return 1;
}



/********************************************
 *  拼接日志头格式
 ********************************************/
int dbg_write_header( int mode, int level, const char *fname, const char *pname, int line )
{
//	char logbuf[MAX_BUF];
	struct tm *now;
	struct timeval tv;

	int pid = (int)getpid();
	if ( level < FATAL ) level = FATAL;
	if ( level > VERBOSE ) level = VERBOSE;

	gettimeofday(&tv, NULL);
	now = localtime(&tv.tv_sec);

	snprintf( header, sizeof(header),
		"%d.%02d.%02d %02d:%02d:%02d.%06d %s %d %s:%s(%d)\n",
		now->tm_year+1900, now->tm_mon+1, now->tm_mday,
		now->tm_hour, now->tm_min, now->tm_sec, (int)tv.tv_usec,
		level_string[level], pid, fname, pname, line );

//	dbg_real_write(mode, logbuf);

	return (1);
}

int dbg_null_header(void)
{
	*header = '\0';
}

int dbg_header( int level, const char *fname, const char *pname, int line )
{
	int old_errno = errno;

	dbg_write_header((int)SHARED, level, fname, pname, line);

	errno = old_errno;
	return (1);
}


/*
	Same as dbg_header(), except share_mode = EXCLUSIVE
 */
int dbg_header2( int level, const char *fname, const char *pname, int line )
{
	int old_errno = errno;

	dbg_write_header((int)EXCLUSIVE, level, fname, pname, line);

	errno = old_errno;
	return (1);
}


/********************************************
 *  在日志文本的每一行前,加入4个空格的缩进
 *  日志文本的最后一行,加入一个换行符。
 ********************************************/
int dbg_write_text(int mode, char *logbuf)
{
	char wbuf[MAX_BUF];
	char *pl = logbuf, *pw;
	int blank = 4;	// 4 blanks indent
	int i;

	snprintf( wbuf, sizeof(wbuf), "%s", header );
	pw = wbuf + strlen(header);

	for ( i=0; i<blank; i++) *pw++ = ' ';

	while ( (pw<(wbuf+sizeof(wbuf)-1)) && (*pl!='\0') )
	{
		*pw = *pl;

		if ( (*pl=='\n') && (*(pl+1)!='\0') )
		{
			for ( i=0; (i<blank)&&(pw<(wbuf+sizeof(wbuf)-1)); i++)
				*(++pw) = ' ';
		}
		pw++, pl++;
	}
/* ======== 日志文本的最后一行,加入一个换行符。========= */
	*pw++ = '\n';
	if ( pw >= wbuf+sizeof(wbuf) ) pw--;
/* ====================================================== */
	*pw = '\0';

	dbg_real_write(mode, wbuf);

	return (1);
}


int dbg_text(const char *fmt, ...)
{
	int old_errno = errno;
	char logbuf[MAX_BUF];

	va_list args;
	va_start(args, fmt);
	vsnprintf(logbuf, sizeof(logbuf), fmt, args);
	logbuf[sizeof(logbuf)-1] = '\0';
	va_end(args);

	dbg_write_text((int)SHARED, logbuf);

	errno = old_errno;
	return (1);
}


/*
	Same as dbg_text(), except share_mode = EXCLUSIVE
 */
int dbg_text2(const char *fmt, ...)
{
	int old_errno = errno;
	char logbuf[MAX_BUF];

	va_list args;
	va_start(args, fmt);
	vsnprintf(logbuf, sizeof(logbuf), fmt, args);
	logbuf[sizeof(logbuf)-1] = '\0';
	va_end(args);

	dbg_write_text((int)EXCLUSIVE, logbuf);

	errno = old_errno;
	return (1);
}


int dbg_real_dump( const char *info, const unsigned char *buf, const int length, int mode)
{
	int i,j,k=0;
	int rem=0;
	unsigned char *logbuf = NULL;
	const int LINE_LEN = 80;
	/*  (4+5+3*16+2+16+1 = 76 < 80)  */
	/* Every line is less than 80 characters */
	unsigned char line[LINE_LEN];

	if (buf==NULL)
	{
		DebugLog(ERROR,("Warning: NULL pointer.\n"));
		return 0;
	}

	if ( (logbuf=(unsigned char*)malloc( LINE_LEN*((length+1)/16+2)+strlen(info)+5 + strlen(header) )) == NULL )
	{
		DebugLog(FATAL,("Error: Not enough memory.\n"));
		return 0;
	}

	sprintf( (char*)logbuf, "%s    %s    %d bytes\n", header, info, length );

	for ( i = 0; i < length; i+=16 )
	{
		snprintf( (char*)line, LINE_LEN, "    %.4d  ",i );
		strcat( (char*)logbuf, (char*)line );
		k += 16;
	   	if(k>length)
	   	{
	   		rem = k;
	   		k=length;
	   	}

		for (j=i; j<k; j++)
		{
			snprintf( (char*)line, LINE_LEN, "%.2X ",buf[j] );
			strcat( (char*)logbuf, (char*)line );
		}

		for (j=length; j<rem; j++)
			strcat( (char*)logbuf, "   " );

		strcat( (char*)logbuf, "; " );
		for (j=i; j<k; j++)
		{
			if ( buf[j] > 31 && buf[j] < 127 )
			{
				snprintf( (char*)line, LINE_LEN, "%c",buf[j] );
				strcat( (char*)logbuf, (char*)line );
			}
			else
				strcat( (char*)logbuf, "." );
		}
		strcat( (char*)logbuf, "\n" );
	}
	strcat( (char*)logbuf, "\n" );

	dbg_real_write(mode, (char*)logbuf);
	free(logbuf);

	return 1;
}



int dbg_dump( const char *info, const unsigned char *buf, const int length )
{
	return dbg_real_dump( info, buf, length, SHARED );
}


/*
	Same as dbg_text(), except share_mode = EXCLUSIVE
 */
int dbg_dump2( const char *info, const unsigned char *buf, const int length )
{
	return dbg_real_dump( info, buf, length, EXCLUSIVE );
}

⌨️ 快捷键说明

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