1说明
版本信息
#define SPDLOG_VERSION "0.16.3"
调用过程
#include "spdlog/spdlog.h"//只需要包含头文件即可编译调用
多线程区别
以mt结尾说明是多线程日志,加锁,避免脏写,以st结尾说明是单线程日志,不加锁,例如
rotating_logger_mt
rotating_logger_st
2简单使用例子
#include "spdlog/spdlog.h"
#include <iostream>
int main()
{
auto fileLogger = spdlog::basic_logger_mt("fengyuzaitu", "test.log");
//fileLogger->flush_on(spdlog::level::info);//调用情况下立即刷新日志到磁盘
std::string strURL = "fengyuzaitu51.cto";
int nFirstTime = 1;
fileLogger->info("Welcome to {0} {1} time!", strURL, nFirstTime);
return 0;
}
说明 0代表第一个参数,1代表第二个参数,通过{}包括,进行参数带入,类似
printf
linux编译指令:
g++ main.cpp -std=c++11 -I./thrdparty/spdlog/include
3 何时刷新到磁盘文件问题
默认情况下,不会立刻刷新到磁盘文件,只有等到缓存达到一定的数量,才会刷新到文件
上面例子是因为程序在退出的时候,调用析构函数,直接输出到文件
1 指定立即刷新到文件
spdlog::flush_on(spdlog::level::info);
只要是Info级别以上的立即刷新到文件
代码
#include "spdlog/spdlog.h"
#include <iostream>
int main()
{
auto fileLogger = spdlog::basic_logger_mt("fengyuzaitu", "test.log", true);
fileLogger->flush_on(spdlog::level::info);
int nCount = 0;
while(1)
{
fileLogger->info("Welcome to fengyuzaitu51.cto!");
sleep(3);
nCount++;
if(nCount > 100)
{
break;
}
}
return 0;
}
如果不调用 fileLogger->flush_on(spdlog::level::info);需要等待有五十条记录以后才会刷新到文件,跟等待时间没有关系
4控制台输出
//
// Create and register stdout/stderr loggers
//
std::shared_ptr<logger> stdout_logger_mt(const std::string& logger_name);
std::shared_ptr<logger> stdout_logger_st(const std::string& logger_name);
std::shared_ptr<logger> stderr_logger_mt(const std::string& logger_name);
std::shared_ptr<logger> stderr_logger_st(const std::string& logger_name);
//
// Create and register colored stdout/stderr loggers
//
std::shared_ptr<logger> stdout_color_mt(const std::string& logger_name);
std::shared_ptr<logger> stdout_color_st(const std::string& logger_name);
std::shared_ptr<logger> stderr_color_mt(const std::string& logger_name);
std::shared_ptr<logger> stderr_color_st(const std::string& logger_name);
简单应用例子
auto console = spdlog::stdout_color_st("console");
5日志回滚输出
//
// Create and register multi/single threaded rotating file logger
//
std::shared_ptr<logger> rotating_logger_mt(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files);
std::shared_ptr<logger> rotating_logger_st(const std::string& logger_name, const filename_t& filename, size_t max_file_size, size_t max_files);
try
{
m_Logger = spdlog::rotating_logger_mt(m_Name, "log/gb28181.log", 20 * 1024 * 1024, 20);
m_Logger->flush_on(spdlog::level::info);
}
catch (const spdlog::spdlog_ex& ex)
{
std::cout << "Log init failed:" << ex.what() << std::endl;
}
6 spdlog::flush_every函数未定义
当前版本不支持该函数刷新
7控制台和文件同时输出
std::string strFileName = "log/flvserver.log";
//fileLogger = spdlog::rotating_logger_mt("websocketflvserver", strFileName, 1024*1024*20, 20);
//fileLogger->flush_on(spdlog::level::info);
std::shared_ptr<spdlog::sinks::rotating_file_sink_mt> file_sink =std::make_shared<spdlog::sinks::rotating_file_sink_mt>(strFileName, 1024 * 1024 * 20, 20);
file_sink->set_level(spdlog::level::info);
std::shared_ptr<spdlog::sinks::stdout_sink_mt> consoleSink = std::make_shared<spdlog::sinks::stdout_sink_mt>();
std::vector<spdlog::sink_ptr> pSinks;
pSinks.push_back(consoleSink);
pSinks.push_back(file_sink);
fileLogger = std::make_shared<spdlog::logger>("web-flv", begin(pSinks), end(pSinks));