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));