美文网首页Srs
spdlog教程:创建loggers

spdlog教程:创建loggers

作者: EVANMORE | 来源:发表于2017-08-21 17:48 被阅读2496次

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

    相关文章

      网友评论

        本文标题:spdlog教程:创建loggers

        本文链接:https://www.haomeiwen.com/subject/dyggrxtx.html