如何启用/禁用代码中的spdlog日志记录?

时间:2017-08-10 19:23:43

标签: c++ spdlog

我正在我的应用程序中创建c ++库模块。要进行日志记录,我使用spdlog。但是在生产环境中,我不希望我的lib模块进行任何日志记录。实现开启/关闭的一种方法是使用#ifdef条件(如...

)来丢弃我的代码
#ifdef logging
  // call the logger here.
#endif

我正在寻找避免编写这些条件的方法。可能是一个包装函数,它执行#ifdef检查并写入它。但这种方法的问题是我必须为每个日志记录方法编写包装器(例如信息,跟踪,警告,错误......)

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用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);

答案 1 :(得分:1)

我不知道spdlog。

但是,您可以在一个常用的包含文件中定义一个宏,无需替换日志调用,或者调用编译器优化器将消除的空内联函数。

“app.h”中的

#ifndef LOG

#ifdef logging
#define LOG spdlog
#endif

#ifndef logging
#define LOG noop
#endif

#endif

你明白了吗?

这使您的大多数代码都不受影响

答案 2 :(得分:1)

通过添加以下宏(在包含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_###(...)

其中###TRACEDEBUGINFOWARNERRORCRITICAL之一。

后一个宏使用默认的记录器spdlog::default_logger_raw(),前一个宏可与您的自定义记录器一起使用。可变参数...代表您的日志记录调用的常规参数:fmt字符串,后跟一些值以拼接成消息。