首页 > 编程语言 > 详细

【C++】一个实用的日志分析工具

时间:2020-07-27 17:34:44      阅读:92      评论:0      收藏:0      [点我收藏+]

【C++】一个实用的日志分析工具

程序说明

  1. 通过C语言宏定义获取时间、文件、函数与行数;通过可变参数列表实现日志内容的传递;C语言宏定义包括:__FILE__、__FUNCTION__、__LINE__、__DATA__、__TIME__
  2. 为了精确到毫秒级别和跨平台,使用了C++11的Chrono;
  3. 根据使用场景和严重程度,将日志级别分为7类,具体类型见代码;
  4. 目前根据需求,将日志输出到了文件中;也可直接打印到控制台界面。按需使用。

代码展示(头文件)

#include <iostream>
#include <string>
#include <stdarg.h>
#include <vector>
#include <chrono>
#include <thread>
using namespace std;

// <!--配置参数:日志级别,0:系统 / 重要错误(Fatal),1 : 错误(Error),
//2 : 警告(Warn),3 : 注意(Notice), 4 : 提示(Info),
//5 : 调试(Debug),6 : 低级别调试Trace; 默认1 Error-->
#define FATAL_LOG(...)  Logger::GetSingletonInstance()->debug_log("FATAL",  __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define ERROR_LOG(...)  Logger::GetSingletonInstance()->debug_log("ERROR",  __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define WARN_LOG(...)   Logger::GetSingletonInstance()->debug_log("WARN" ,  __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NOTICE_LOG(...) Logger::GetSingletonInstance()->debug_log("NOTICE", __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define INFO_LOG(...)   Logger::GetSingletonInstance()->debug_log("INFO",   __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define DEBUG_LOG(...)  Logger::GetSingletonInstance()->debug_log("DEBUG",  __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define TRACE_LOG(...)  Logger::GetSingletonInstance()->debug_log("TRACE",  __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)

class Logger{
public:
	void init(string file_name){
		logger_file = fopen(file_name.c_str(), "a+");
	}

	void uninit(){
		fclose(logger_file);
	}

	static Logger* GetSingletonInstance(){
		static Logger s_logger;
		return &s_logger;
	}
	
	void debug_log(
		const char *logLevel,
		const char *file,
		const char *func,
		const int   iLine,
		const char *format, ...)
	{
		static char output[1024] = { 0 };
		va_list arglst;
		va_start(arglst, format);
		vsnprintf(output, sizeof(output), format, arglst);
		fprintf(logger_file, "%s|  [%s]  [%s][%s][%d]:%s\n", gettm(getTimeStamp()).c_str(), logLevel, file, func, iLine, output);
		va_end(arglst);
	}

private:
	FILE* logger_file;
	time_t getTimeStamp()
	{
		std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
		auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
		time_t timestamp = tmp.count();
		return timestamp;
	}

	string gettm(time_t timestamp)
	{
		//此处转化为东八区北京时间,如果是其它时区需要按需求修改
		time_t milli = timestamp+ (time_t)8 * 60 * 60 * 1000;
		auto mTime = std::chrono::milliseconds(milli);
		auto tp = std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>(mTime);
		auto tt = std::chrono::system_clock::to_time_t(tp);
		tm* ptm = gmtime(&tt);
		char date[128] = { 0 };
		sprintf(date, "%d-%02d-%02d %02d:%02d:%02d .%03d",
			(int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday,
			(int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec, milli % 1000);
		return std::string(date);
	}
};

代码展示(示例程序)

#include "logger_net.h"
using namespace chrono;

int main(int argc, char* argv[])
{
	string filename = "..\\ctx.txt";
	Logger::GetSingletonInstance()->init(filename);
	while (true)
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
		/*FATAL_LOG("fatal log test[%d], char[%s]", 0, "fatal");
		WARN_LOG("warn log test[%d], char[%s]", 10002, "warn");
		NOTICE_LOG("notice log test[%d], char[%s]", 100031, "notice");
		INFO_LOG("info log test[%d], char[%s]", 10001, "info");*/
		ERROR_LOG("error log test[%d], char[%s]", 10001, "error");
		DEBUG_LOG("debug log test[%d], char[%s]", 10005, "debug");
		//TRACE_LOG("trace log test[%d], info[%s]", 10006, "trace");
	}
	Logger::GetSingletonInstance()->uninit();
	return 0;
}

【C++】一个实用的日志分析工具

原文:https://www.cnblogs.com/fishily/p/13385104.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!