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