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

📄 log.cpp

📁 简易的日志管理。
💻 CPP
字号:
#include "stdafx.h"
#include "Log.h"
#include "stdio.h"
#include "windows.h"

char *log_level_string[5] = {"FINE", "DEBUG", "INFO", "WARNING", "ERROR"};

#define CURRENT_LEVEL	LOG_LEVEL_FINE
#define LOG_ENABLE 1

extern int vuser_id;
extern Logger *mplog;

Logger::Logger()
{
	sprintf(log_file, "%s\\%s\\mmsdido.log", ROOT_DIR, LOG_DIR);
	fp = NULL;
}

int Logger::init()
{
	if (!LOG_ENABLE) return 0;

	fp = fopen(log_file, "wb");
	if (fp == NULL)
	{
		printf("\nFailed to create log file:%s.", log_file);
	}
	
	fseek(fp, 0, SEEK_END);

	return 0;
}

void Logger::writeBIN(LOG_LEVEL level, char *file_name, int line_number, char *str, char *buf, int length)
{
	struct tm tmNow;	
	time_t timeNow;
	int len;

	if (!LOG_ENABLE) return;

	// filter unnecessary log info according to the specified log level
	if (level < CURRENT_LEVEL) return;

	len = 0;
	time(&timeNow);	
	tmNow = *localtime(&timeNow);		// copy the current date-time.	

	len += _snprintf(log_buf+len, MAX_SIZE_LOGITEM - len, 
		"\n[%d][%s][%2.2d:%2.2d:%2.2d][%s:%d]: %s", (int) GetCurrentThreadId(), log_level_string[level], 
		tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec,
			file_name, line_number, str);

	fprintf(stdout, log_buf);
	if (fp)
	{
		fprintf(fp, log_buf);		
	}
	
	int i, j, k;
	int sbuf[16];

	j = 0;
	fprintf(stdout, "\r\n");
	fprintf(fp, "\r\n");

	for (i = 0; i < length; i++)
	{
		unsigned char c = buf[i];

		if (i%2 == 0)
		{
			fprintf(stdout, " ");
			fprintf(fp, " ");
		}
		
		
		if (c <= 0x0f) {
			fprintf(stdout, "0%x", c);
			fprintf(fp, "0%x", c);
		}
		else {
			fprintf(stdout, "%x", c);
			fprintf(fp, "%x", c);
		}

		sbuf[j] = c;
		j++;
		if (j == 16)
		{
			fprintf(stdout, "    ");
			fprintf(fp, "    ");
			
			for (k = 0; k < j; k++)
			{
				char ch = sbuf[k];
				if ( !(ch >= 33 && ch <= 126)) 
					ch = '.';
				
				fprintf(stdout, "%c", ch);
				fprintf(fp, "%c", ch);
			}

			fprintf(stdout, "\r\n");
			fprintf(fp, "\r\n");
			j = 0;
		} 
		
	}

	for (i = 0; i < 16 - j; i++)
	{
		fprintf(stdout, "  ");
		fprintf(fp, "  ");
		if (i%2 == 0)
		{
			fprintf(stdout, " ");
			fprintf(fp, " ");
		}
	}
		
	fprintf(stdout, "    ");
	fprintf(fp, "    ");
	
	for (k = 0; k < j; k++)
	{
		char c = sbuf[k];
		if ( !(c >= 33 && c <= 126)) 
		c = '.';
				
		fprintf(stdout, "%c", c);
		fprintf(fp, "%c", c);
	}

	fflush(fp);
	
}

void Logger::write(LOG_LEVEL level, char *file_name, int line_number, const char *format, ...)
{
	va_list ap;	
	struct tm tmNow;	
	time_t timeNow;
	int len;

	if (!LOG_ENABLE) return;

	// filter unnecessary log info according to the specified log level
	if (level < CURRENT_LEVEL) return;

	len = 0;
	time(&timeNow);	
	tmNow = *localtime(&timeNow);		// copy the current date-time.	

	len += _snprintf(log_buf+len, MAX_SIZE_LOGITEM - len, 
		"\n[%d][%s][%2.2d:%2.2d:%2.2d][%s:%d]: ", (int) GetCurrentThreadId(), log_level_string[level], 
		tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec,
		file_name, line_number);
	
	// parse args.
	va_start(ap, format);
	len += _vsnprintf(log_buf+len, MAX_SIZE_LOGITEM - len, format, ap);
	va_end(ap);

	fprintf(stdout, log_buf);

	if (fp)
	{
		fprintf(fp, log_buf);
		fflush(fp);
	}
	
}

int Logger::close()
{
	if (!LOG_ENABLE) return 0;
	if (fp)	fclose(fp);
	return 0;
}

⌨️ 快捷键说明

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