C++网狐服务器引入开源日志库spdlog

很多人对日志库不以为然,包括网狐这种十几年的公司都不重视,其实日志库记录的东西能在线上出问题时高效解决,特别是别人写的东西,人又走了,出了问题,还可以用日志分析快速解决。要是没有日志记录,出了问题就疑东疑西,看别人代码去解决,那就是你加班的开始。。。

老版本的网狐框架是没有日志库的,到了后面的旗舰版本才有一个幼儿园版本的日志记录服务器。有也是一个垃圾,一是没写好,二是还经常崩溃,三还丢失日志,四日志服务器CPU经常20%-30%等等。以前还看到他们的代码每个桌子都创建一个文件,游戏里面还一大堆操作文件的代码。。。。。非常难看,还低效。这还能忍得了的!

为此我找了一个高级的异步开源日志------spdlog,其实开源日志库里面优秀的很多,选择这个是简单易用,可以异步,可以按日志等级打印,支持多线程等等,姿势很多。

且看我如何操刀:

先到GitHub - gabime/spdlog: Fast C++ logging library.开源库上下载下来,编译成lib,然后用类封装起来给各个模块包含使用。如何封装看下面

复制代码
#ifndef __H_LOGTOOL
#define __H_LOGTOOL
#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/cfg/env.h>  // support for loading levels from the environment  variable
#include <spdlog/fmt/ostr.h> // support for user defined types
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/daily_file_sink.h"

#ifdef _DEBUG
#pragma comment (lib,"./include/lib/spdlogd.lib")
#else
#pragma comment (lib,"./include/lib/spdlog.lib")
#endif
#define LOG_MAX_SIZE 2048
using namespace std;
using namespace spdlog;
class logTool
{
public:
	

	logTool(){
	}

	~logTool(){
		Tool->flush();
		spdlog::drop_all();
		spdlog::shutdown();
	}
	void init(string szServerName)//房间名称
	{
	     //spdlog::init_thread_pool(10000, 2);
			spdlog::cfg::load_env_levels();
		string fileName = "logs/daily" + szServerName + ".log";
		auto daily_logger = spdlog::daily_logger_mt<spdlog::synchronous_factory>("daily_logger", fileName, 0, 0);
		//下面这个支持多线程打印日志
		//auto daily_logger = spdlog::daily_logger_format_mt<spdlog::synchronous_factory>("daily_logger", fileName, 0, 0);
		daily_logger->flush_on(spdlog::level::warn);
		Tool = daily_logger;
	}
	void log(string szLogInfo)
	{
		Tool->info(szLogInfo);
	}
	void logWarn(string szLogInfo)
	{
		Tool->warn(szLogInfo);
	}
	void logError(string szLogInfo)
	{
		Tool->error(szLogInfo);
	}
	void flush()
	{
		Tool->flush();
	}
private:
	shared_ptr<spdlog::logger> Tool;
};

接着下一步是如何引入到服务器里面使用,也简单,几行代码搞定

复制代码
#include "..\..\全局定义\logTool.h"
logTool logex;
#define log(...) logex.log(__VA_ARGS__)

服务器停止处添加logex.flush();这让防止服务器关闭时没有及时写入文件。

接着看效果

就连打印日志样式也可以设置的,我只用了官方介绍的20%的功能就满足了我的工作需求。

磨刀不误砍柴工,有了日志库,再也不用担心出问题,无处可查,大大降低了加班的次数。

相关推荐
cup115 小时前
[Full Clock 技术复盘] 一、浏览器前端如何实现百毫秒级时间校准?时间 API 推荐、模拟 NTP 算法原理及局限
typescript·开源·api·时钟·时间同步
yyuuuzz5 小时前
独立站的技术基础与常见运维问题
大数据·运维·服务器·网络·数据库·aws
MC皮蛋侠客7 小时前
C++17 多线程系列(五):C++17 并行算法——从串行到并行的零成本迁移
c++·多线程
冬奇Lab7 小时前
每日一个开源项目(第118篇):SkillOpt - 像训练神经网络一样优化 LLM Agent 的技能
人工智能·开源·agent
妄想出头的工业炼药师8 小时前
GS slam mono
算法·开源
日取其半万世不竭9 小时前
iftop、nethogs 和 nload:Linux 服务器网络流量实时监控工具介绍
linux·运维·服务器
mounter62510 小时前
Linux 内核资源管理:控制组(cgroup)的演进与“策略组”新提案
linux·运维·服务器·cgroup·kernel
bksczm10 小时前
文件在磁盘中的存储方式
linux·运维·服务器
L16247610 小时前
OpenSSH 半自动升级方案(独立编译 + 手动迁移 + 重建 systemd 服务)
linux·服务器·ssh
Wpa.wk10 小时前
win环境本地文件上传远程服务器(scp/远程连接工具)
运维·服务器