c++日志库spdlog

spdlog是一个用c++编写的日志库,下载地址:https://github.com/gabime/spdlog。

支持系统:
Linux (gcc 4.8.1+, clang 3.5+)
Windows (visual studio 2013+, cygwin/mingw with g++ 4.9.1+)
Mac OSX (clang 3.5+)

特性:
1.非常快
2.使用简单,只需包含头文件
3.没有任何依赖库
4.异步模式下非常快,每秒可达数百万条日志
5.自定义日志格式
6.支持单/多线程
7.多种输出目标
8.可运行时调整日志级别

使用例子:

/*需要包含的头文件*/
#include "spdlog/spdlog.h"

#include <cstdlib> // EXIT_FAILURE
#include <iostream>
#include <memory>

void async_example();
void syslog_example();

namespace spd = spdlog;
int main(int, char*[])
{
    try
    {
        /*输出到控制台的日志,线程安全*/
        // Multithreaded color console
        auto console = spd::stdout_logger_mt("console", true);
        console->info("Welcome to spdlog!");
        console->error("An info message example {}..", 1);

        /*支持数据格式化输出*/
        // Formatting examples
        console->warn("Easy padding in numbers like {:08d}", 12);
        console->critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
        console->info("Support for floats {:03.2f}", 1.23456);
        console->info("Positional args are {1} {0}..", "too", "supported");

        console->info("{:<30}", "left aligned");
        console->info("{:>30}", "right aligned");
        console->info("{:^30}", "centered");

        spd::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name) function");

        // Runtime log levels
        /*运行时调整全局日志输出等级*/
        spd::set_level(spd::level::info); //Set global log level to info
        /*这条日志不会输出,debug没有达到输出等级*/
        console->debug("This message shold not be displayed!");
        /*调整日志输出等级*/
        console->set_level(spd::level::debug); // Set specific logger's log level
        /*输出debug日志*/
        console->debug("This message shold be displayed..");

        /*输出到文件的日志*/
        // Create basic file logger (not rotated)
        auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic.txt");
        my_logger->info("Some log message");

        /*创建环形输出日志*/
        // Create a file rotating logger with 5mb size max and 3 rotated files
        auto rotating_logger = spd::rotating_logger_mt("some_logger_name", "logs/mylogfile", 1048576 * 5, 3);
        for (int i = 0; i < 10; ++i)
            rotating_logger->info("{} * {} equals {:>10}", i, i, i*i);

        /*每天2:30分创建新日志文件的日志*/
        // Create a daily logger - a new file is created every day on 2:30am
        auto daily_logger = spd::daily_logger_mt("daily_logger", "logs/daily", 2, 30);
        daily_logger->info(123.44);

        // Customize msg format for all messages
        /*调整日志输出格式*/
        spd::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***");
        rotating_logger->info("This is another message with custom format");

        /*根据宏来判定是否输出日志*/
        // Compile time debug or trace macros.
        // Enabled #ifdef SPDLOG_DEBUG_ON or #ifdef SPDLOG_TRACE_ON
        SPDLOG_TRACE(console, "Enabled only #ifdef SPDLOG_TRACE_ON..{} ,{}", 1, 3.23);
        SPDLOG_DEBUG(console, "Enabled only #ifdef SPDLOG_DEBUG_ON.. {} ,{}", 1, 3.23);

        // Asynchronous logging is very fast..
        // Just call spdlog::set_async_mode(q_size) and all created loggers from now on will be asynchronous..
        /*异步模式日志,非常快……*/
        async_example();

        // syslog example. linux/osx only..
        /*linux/osx下的syslog日志*/
        syslog_example();

        /*关闭所有日志*/
        // Release and close all loggers
        spdlog::drop_all();
    }

    catch (const spd::spdlog_ex& ex)
    {
        std::cout << "Log failed: " << ex.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

/*异步模式日志例子*/
void async_example()
{
    size_t q_size = 4096; //queue size must be power of 2
    spdlog::set_async_mode(q_size);
    auto async_file = spd::daily_logger_st("async_file_logger", "logs/async_log.txt");
    for (int i = 0; i < 100; ++i)
        async_file->info("Async message #{}", i);
}
/*syslog日志例子*/
//syslog example (linux/osx only)
void syslog_example()
{
#if defined (__linux__) || defined(__APPLE__)
    std::string ident = "spdlog-example";
    auto syslog_logger = spd::syslog_logger("syslog", ident, LOG_PID);
    syslog_logger->warn("This is warning that will end up in syslog. This is Linux only!");
#endif
}       

你可能感兴趣的:(C++,spdlog)