Srs

spdlog教程:创建loggers

2017-08-21  本文已影响2496人  EVANMORE

spdlog是一个用C++11编写的高性能日志库,官方文档是一个wiki page。
https://github.com/gabime/spdlog/wiki

Step 1 安装spdlog

spdlog的安装非常简单,从官网下载spdlog的代码。然后在你的工程中,头文件搜索路径包含spdlog的include路径就可以了。参看如下的CMakelists文件。

project (spdlog_tutorial)
cmake_minimum_required(VERSION 3.4)

set(CMAKE_CXX_STANDARD 11)

# 往工程中添加spdlog库,这个库是一个interface类型的库
add_library(spdlog INTERFACE)

# 包含这个interface库的工程路径
target_include_directories(
    spdlog
    INTERFACE
    "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/../spdlog-master/include>"
)

# spdlog会用到pthread库
find_package(Threads)

add_executable (spdlog_tutorial basic.cxx)
target_link_libraries(spdlog_tutorial spdlog ${CMAKE_THREAD_LIBS_INIT})

Step 2 创建一个控制台输出logger

参看如下的一段示例代码

#include <iostream>
#include "spdlog/spdlog.h"

int main(int, char* [])
{
    auto console = spdlog::stdout_color_mt("console");
    console->info("Welcome to spdlog");
    console->info("An info message example {}..", 1);
}

spdlog::stdout_color_mt("console")函数创建一个名字为console的console logger,把这个logger注册到spdlog的全局注册表中,并且返回指向这个logger的指针(shared_ptr)。
编译运行一下试试。

Step 3 通过spdlog::get("...")来访问一个已经创建的logger

在之前代码的基础上添加一个新的类logger_get,参看如下代码

class logger_get
{
    private:
    std::shared_ptr<spdlog::logger> _logger;
    public:
    log_test()
    {
        _logger = spdlog::get("console");
    }
    
    void print_hello()
    {
        _logger->info("helloworld");
        return;
    }
};

然后在main函数中试着调用这个类

int main(int, char* [])
{
  ...

  log_test test;
  test.print_hello();
}

运行一下看看结果

Step 4 创建一个写入文件的logger

利用工厂函数spdlog::basic_logger_mt("logger_name", "filename.txt")创建一个写入文件的logger

int main(int, char* [])
{
  auto my_logger = spdlog::basic_logger_mt("basic_logger", "basic.txt");

  for (int i = 0; i < 1000; i ++)
  {
    my_logger->info("Test File Logger {}", i);
  }
}

运行一下看看,是不是都写到basic.txt这个文件下了。

Step 5 手动创建一个logger

int main(int, char* [])
{
    auto sink = std::make_shared<spdlog::sinks::stdout_sink_mt>();
    auto my_logger = std::make_shared<spdlog::logger>("mylogger", sink);
    
    my_logger-> info("HelloWorld");
}

记住一个手动创建的logger通过Step3的函数没法儿访问,因为创建的过程中没有注册到spdlog里面。
可以通过spdlog::register_logger(my_logger)函数来注册手动创建的logger

int main(int, char* [])
{
    auto sink = std::make_shared<spdlog::sinks::stdout_sink_mt>();
    auto my_logger = std::make_shared<spdlog::logger>("mylogger", sink);
    
    my_logger-> info("HelloWorld");
    
    spdlog::register_logger(my_logger);
    
    auto test_logger = spdlog::get("mylogger");
    test_logger->info("getlogger::helloworld");
}

Step 6 创建多个文件loggers,记录到相同的文件中

手动创建logger的时候可以配置多个loggers记录日志到相同的文件中,参看如下这段代码

int main(int, char* [])
{
    auto sharedFileSink = std::make_shared<spdlog::sinks::simple_file_sink_mt>("basic.txt");
    auto firstLogger = std::make_shared<spdlog::logger>("loggerOne", sharedFileSink);
    auto secondLogger = std::make_shared<spdlog::logger>("loggerTwo", sharedFileSink);
    
    for(int i = 0; i < 10; i ++)
    {
        firstLogger->info("[loggerOne]: Hello {}.", i);
    }
    
    for(int j = 0; j < 10; j ++)
    {
        secondLogger->info("[loggerTwo]: Hello {}. ", j);
    }
}
上一篇下一篇

猜你喜欢

热点阅读