官方example.cpp中没有tcp输出日志的方法,在此对spdlog进行tcp输出日志进行实现:
1、功能实现
1.1 添加工厂
spdlog中不知为何没有实现tcp_logger的工厂,打开文件 “include\spdlog\sinks\tcp_sink.h”,找到文件末尾:
} // namespace sinks
} // namespace spdlog
在最后一行之前添加内容如下:
} // namespace sinks
//
// factory functions
//
template<typename Factory = spdlog::synchronous_factory>
inline std::shared_ptr<logger> tcp_logger_mt(const std::string &logger_name, sinks::tcp_sink_config skin_config)
{
return Factory::template create<sinks::tcp_sink_mt>(logger_name, skin_config);
}
} // namespace spdlog
并在此类中添加头文件
#include<spdlog/details/synchronous_factory.h>
1.2 编写demo
完成以上改动后,就可以向tcp服务端发送日志了,spdlog座作为tcp客户端,向tcp服务端发送ASCII码的字符串日志,每条日志间以换行结束
#include "spdlog.h"
#include "spdlog/sinks/tcp_sink.h"
void tcp_example()
{
spdlog::sinks::tcp_sink_config cfg("127.0.0.1", 11091);
auto my_logger = spdlog::tcp_logger_mt("tcplog", cfg);
my_logger->set_level(spdlog::level::debug);
my_logger->info("hello world");
}
2、小坑记录
如果日志初始化的时候,对应的tcp服务端没有启动,会抛出异常:
并且不会重连,此条日志会在控制台输出:
并不会保留此条日志的内容
而正常初始化的情况下,是可以自动重连tcp服务的。
spdlog的tcp类路径为:
include\spdlog\details\tcp_client.h \\linux
include\spdlog\details\tcp_client-windows.h \\windows
初始化连接失败会在此类的 connect 函数中抛出异常。