【问题标题】:C++ Pass Boost::log severity level as argument to functionC++ 将 Boost::log 严重性级别作为参数传递给函数
【发布时间】:2017-05-02 09:56:29
【问题描述】:

我希望只有一个函数来编写日志,该函数会根据严重性级别解析省略号并将结果发送到 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 不接受变量,它需要预定义的级别常量之一。

标签: c++ logging boost


【解决方案1】:

关注boost log example并定义:

// 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;
}

【讨论】:

    【解决方案2】:

    我的建议:创建自己的严重性。这只是一个枚举!按照该“级别”的源代码(使用您的 IDE)查看它是一个简单的枚举。将其复制到您的实现中,并根据需要进行更改。这是how it looks(改名后):

    enum my_severity_level
    {
        trace,
        debug,
        info,
        warning,
        error,
        fatal
    };
    

    将它带到您的代码中,并根据需要使用它。

    那个write_log函数应该是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-27
      • 2015-06-09
      • 2023-04-07
      • 2014-02-22
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多