C++日志

0 资料

1 spdlog

1.1 简介

spdlog是一个用C++11编写的高性能日志库,优点:

复制代码
- 高性能
- 用法类似python的logging

1.2 安装

plain 复制代码
#include "spdlog/spdlog.h"

int main() {
	//Use the default logger (stdout, multi-threaded, colored)
  
  spdlog::info("hello spd");
  spdlog::info("hello {}, {}", "shuo", 29);   
  
  return 0;
}
  • 保存并退出,其文件目录如下
plain 复制代码
$ tree -L 2
.
|-- main.cpp
`-- spdlog
    |-- include
  • 编译测试代码(注意要用C++11的标准)
    • g++ --std=c++11 -I spdlog/include main.cpp

1.3 使用

1.3.1 基本使用

plain 复制代码
#include <iostream>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"  //支持输出到标准终端
#include "spdlog/sinks/basic_file_sink.h" // 支持保存到基础文档
#include "spdlog/sinks/rotating_file_sink.h" // 支持保存成滚动文档

int main(int, char* [])
{
    try 
    {
    		// 1、将日志打印到标准输出中
        auto console = spdlog::stdout_color_mt("console");
        console->set_level(spdlog::level::warn);  //设置日志记录器的输出日志等级
        console->info("Welcome to spdlog");
        
        // 2、将日志保存到文本中 (not rotated)
        auto my_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
        my_logger->info("hello");
        
        // 3、将文字保存到一个迭代的文本中,改文本最大5M,最多有3个文本
        auto file_logger = spdlog::rotating_logger_mt("file_logger", "myfilename", 1024 * 1024 * 5, 3);
        file_logger->info("hello file");
    }
    catch (const spdlog::spdlog_ex& ex)
    {
        std::cout << "Log initialization failed: " << ex.what() << std::endl;
    }
}

1.3.2 多个日志记录器共享一个日志文件

plain 复制代码
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/spdlog.h"
#include <iostream>
int main(int, char *[]) {
	// 设置文件异步共享终端
  auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>("logfile", 23, 59);
  // 创建日志异步发生器
  auto net_logger = std::make_shared<spdlog::logger>("net", daily_sink);
  auto hw_logger = std::make_shared<spdlog::logger>("hw", daily_sink);

  // 设置各个发生器的日志等级 (error, warn, info, debug)
  net_logger->set_level(spdlog::level::info);
  hw_logger->set_level(spdlog::level::debug);

  // 全局登记发生器,使之能使用spdlog::get(logger_name)的方式在其他地方被获取
  spdlog::register_logger(net_logger);

  net_logger->info("hello net_logger");
  hw_logger->info("hello hw_logger");
}

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

spdlog对于每个线程,都维护着一个全局的日志发生器,所有日志发生器在产生的时候都会被自动注册。在程序的其他地方,可以使用** auto 指针 = spdlog::get(日志发生器名称 );来获取改日志发生器的指针。如果该日志发生器不存在,则会返回空指针。因此,可以使用if(指针)**来判断是否有该日志发生器。

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

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

plain 复制代码
int main(int, char* [])
{
  ...

  logger_get test;
  test.print_hello();
}
相关推荐
m0_3807438711 分钟前
C++中的freopen的用法实例详解
开发语言·c++
Escalating_xu41 分钟前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
jimy11 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
m0_380743871 小时前
PHP 8.3 缓存清除不生效怎么排查
开发语言·php
朝朝辞暮i1 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
小凡geo2 小时前
本地商家 GEO:用脚本一键生成 FAQPage 结构化数据,让 AI 切片更稳
开发语言·人工智能·python·microsoft·搜索引擎·ai
朝朝辞暮i2 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
苏打豆2 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
波力海苔夹心脆6752 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
m0_380743872 小时前
Qt中导航栏实现的详细指南
开发语言·c++