如何在代码中启用/禁用 spdlog 日志记录?
How to enable/disable spdlog logging in code?
我正在我的应用程序中创建c ++库模块。 为了做日志记录,我使用 spdlog。 但是在生产环境中,我不希望我的 lib 模块执行任何日志记录。 实现打开/关闭的一种方法是在我的代码中乱扔 #ifdef 条件,例如......
#ifdef logging
// call the logger here.
#endif
我正在寻找一种避免编写这些条件的方法。 可能是一个包装器函数,用于执行 #ifdef 检查并编写它。 但是这种方法的问题在于我必须为每个日志记录方法编写包装器(例如信息,跟踪,警告,错误...
有没有更好的方法?
您可以使用set_level()
禁用日志记录:
auto my_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
#if defined(PRODUCTION)
my_logger->set_level(spdlog::level::off);
#else
my_logger->set_level(spdlog::level::trace);
#endif
spdlog::register_logger(my_logger);
在编译代码之前,您可以通过添加以下宏(在包含 spdlog.h 之前(来禁用所有日志记录:
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_OFF
#include<spdlog.h>
在文件 https://github.com/gabime/spdlog/blob/v1.x/include/spdlog/spdlog.h 中将其解释为注释:
//
// enable/disable log calls at compile time according to global level.
//
// define SPDLOG_ACTIVE_LEVEL to one of those (before including spdlog.h):
// SPDLOG_LEVEL_TRACE,
// SPDLOG_LEVEL_DEBUG,
// SPDLOG_LEVEL_INFO,
// SPDLOG_LEVEL_WARN,
// SPDLOG_LEVEL_ERROR,
// SPDLOG_LEVEL_CRITICAL,
// SPDLOG_LEVEL_OFF
//
使用此宏还可以加快生产代码的速度,因为日志记录调用已从代码中完全擦除。因此,这种方法可能比使用my_logger->set_level(spdlog::level::off);
但是,为了使完整的代码删除正常工作,您需要在日志记录时使用任一宏:
SPDLOG_LOGGER_###(logger, ...)
SPDLOG_###(...)
其中###
是TRACE
、DEBUG
、INFO
、WARN
、ERROR
、CRITICAL
之一。
后一个宏使用默认记录器spdlog::default_logger_raw()
,前者可以与您的自定义记录器一起使用。可变参数...
代表日志记录调用的常规参数:fmt 字符串,后跟一些要拼接到消息中的值。
我不知道spdlog。
但是,您可以在常用的包含文件之一中定义一个宏,以将日志调用替换为任何内容,或者调用编译器优化器将消除的空内联函数。
在"App.H"中
#ifndef LOG
#ifdef logging
#define LOG spdlog
#endif
#ifndef logging
#define LOG noop
#endif
#endif
你明白了吗?
这让您的大部分代码保持不变
- 嵌入方指针压缩已禁用
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- clang格式:禁用排序包含
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 如何在C++生成器中禁用"使用调试.dcus"
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 如何禁用 CPU 的无序执行
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何禁用VTK的热键
- 创建 Spdlog 异步文件记录器时遇到困难
- 在C++中禁用宏中的逗号
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 通过复制包含目录的内容来安装 spdlog
- 在VS Code中编译C / C ++时如何禁用自动创建EXE文件?
- 如何使用 CLANG 禁用格式安全错误?
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- 如何在QSplashScreen中禁用鼠标单击
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- 禁用地址共享注册表不起作用
- 如何在代码中启用/禁用 spdlog 日志记录?