将 Boost::log 严重性级别作为参数传递给 C++ 函数

4

我希望只有一个函数来编写日志,该函数将解析省略号并根据严重程度级别将结果发送到 Boost::log。头文件中定义了不同的宏,这些宏将选择正确的严重程度级别。以下是代码:

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>

#define DEBUG(msg, ...)         Logger::write_log(debug,   msg, ##__VA_ARGS__);
#define INFO(msg, ...)          Logger::write_log(info,    msg, ##__VA_ARGS__);
#define WARNING(msg, ...)       Logger::write_log(warning, msg, ##__VA_ARGS__);
#define ERROR(msg, ...)         Logger::write_log(error,   msg, ##__VA_ARGS__);

namespace logging   = boost::log;

void write_log(auto level, const char *message, ...)
{
    char buffer[512];
    va_list args;

    // Parse ellipsis and add arguments to message
    va_start (args, message);
    vsnprintf (buffer, sizeof(buffer), message, args);
    va_end (args);

    BOOST_LOG_TRIVIAL(level) << buffer;
}

int main(int argc, char** argv)
{
    DEBUG("Test string %s", "additional string");

    return 0;
}

但是在编译过程中,我遇到了以下错误:

 error: 'level' is not a member of 'boost::log::v2s_mt_nt5::trivial'
         BOOST_LOG_TRIVIAL(level) << buffer;

看起来我的级别参数类型不正确。我也尝试使用logging::trivial::severity_level level代替auto level,但这没有帮助。我该如何修复这个错误?

更新:

这里有一个可行的解决方案:

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>

#define DEBUG(msg, ...)         Logger::write_log(debug,   msg, ##__VA_ARGS__);
#define INFO(msg, ...)          Logger::write_log(info,    msg, ##__VA_ARGS__);
#define WARNING(msg, ...)       Logger::write_log(warning, msg, ##__VA_ARGS__);
#define ERROR(msg, ...)         Logger::write_log(error,   msg, ##__VA_ARGS__);

namespace logging   = boost::log;

enum severity_level
{
    debug,
    info,
    warning,
    error,
    exception
};
src::severity_logger<severity_level> slg;

void write_log(severity_level level, const char *message, ...)
{
    char buffer[512];
    va_list args;

    // Parse ellipsis and add arguments to message
    va_start (args, message);
    vsnprintf (buffer, sizeof(buffer), message, args);
    va_end (args);

    BOOST_LOG_SEV(slg, level) << buffer;
}

int main(int argc, char** argv)
{
    DEBUG("Test string %s", "additional string");

    return 0;
}

BOOST_LOG_TRIVIAL不接受变量,它需要预定义的级别常量之一。 - n. m.
2个回答

2

请按照 Boost日志示例 的步骤进行操作,定义:

// severity levels
enum severity_level
{
    trace,
    debug,
    info,
    warning,
    error,
    fatal
};

您需要确保您的函数接受适当的类型:

void write_log(severity_level level, const char *message, ...){ ... }

另一个选项:

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>

#define DEBUG(msg, ...)         Logger::write_log(logging::trivial::debug,   msg, ##__VA_ARGS__);
#define INFO(msg, ...)          Logger::write_log(logging::trivial::info,    msg, ##__VA_ARGS__);
#define WARNING(msg, ...)       Logger::write_log(logging::trivial::warning, msg, ##__VA_ARGS__);
#define ERROR(msg, ...)         Logger::write_log(logging::trivial::error,   msg, ##__VA_ARGS__);

namespace logging = boost::log;

#define LOG_TRIVIAL(lvl)\
    BOOST_LOG_STREAM_WITH_PARAMS(::boost::log::trivial::logger::get(),\
        (::boost::log::keywords::severity = lvl))

void write_log(logging::trivial::severity_level level, const char *message, ...)
{
    char buffer[512];
    va_list args;

    // Parse ellipsis and add arguments to message
    va_start(args, message);
    vsnprintf(buffer, sizeof(buffer), message, args);
    va_end(args);

    LOG_TRIVIAL(level) << buffer;
}

int main(int argc, char** argv)
{
    DEBUG("Test string %s", "additional string");

    return 0;
}

1
我的建议是:创建自己的严重性级别。它只是一个枚举!使用你的IDE跟踪“level”的源代码,看看它是一个简单的枚举。将其复制到你的实现中,并根据需要进行更改。这是它的样子(在更改名称后):
enum my_severity_level
{
    trace,
    debug,
    info,
    warning,
    error,
    fatal
};

请将此代码放入您的代码中,并根据需要使用。

write_log 函数应该是这样的:

void write_log(my_severity_level level, const char *message, ...) { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接