C ++ Pass Boost :: log severity level作为函数的参数

时间:2017-05-02 09:56:30

标签: c++ logging boost

我希望只有一个函数可以根据严重性级别编写解析省略号并将结果发送到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;
}

2 个答案:

答案 0 :(得分:1)

我的建议:创建自己的严重程度。它只是一个枚举!遵循该&#34;级别&#34;的源代码。 (使用你的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, ...) { ... }

答案 1 :(得分: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;
}