Уровни серьезности журнала повышения по сравнению с уровнями серьезности системного журнала - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь изменить свое приложение, чтобы использовать библиотеку Boost Log вместо входа в syslog. Уровни серьезности Boost Log определены в boost/log/trivial.hpp, где самый серьезный уровень имеет максимальное числовое число (5):

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

Однако, syslog определяет больше уровней серьезности, которые фактически стандартизированы RFC5424 - и самый серьезный уровень имеет минимальное числовое число (0 ).

Можно ли как-то определить мой собственный тип перечисления MySeverityLevels (возможно, близкий к RFC5424) и использовать различные регистраторы Boost Log (например, severity_logger) с этим новым типом, включая фильтрацию по уровню серьезности?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я отвечаю на свой вопрос. Код ниже реализует то, что я хотел:

#include <boost/log/common.hpp>
#include <boost/log/utility/setup/file.hpp>

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace keywords = boost::log::keywords;

enum class MySeverityLevel
{
  panic,
  alert,
  critical,
  error,
  warning,
  notice,
  info,
  debug
};

BOOST_LOG_ATTRIBUTE_KEYWORD(Severity, "Severity", MySeverityLevel)

int main()
{
  // ------ define sink
  logging::add_file_log
  (
    keywords::file_name = "test.log",
    keywords::filter = (Severity <= MySeverityLevel::error)
  );
  // ------ define logger
  src::severity_logger<MySeverityLevel> lg;
  // ------ output logging messages
  BOOST_LOG_SEV(lg, MySeverityLevel::panic) << "This is panic";
  BOOST_LOG_SEV(lg, MySeverityLevel::debug) << "This is debug";
}

Нет необходимости использовать сопоставления.

0 голосов
/ 19 ноября 2018

<boost_root>/libs/log/example/native_syslog содержит пример пользовательских уровней журнала, т.е. создайте перечисление для ваших уровней серьезности:

//! Define application-specific severity levels
enum severity_levels
{
    /* your own level */
    normal = 2,
    warning = 1,
    error = 0
};

и зарегистрируйте его в своей раковине

    // Create a syslog sink
    shared_ptr< sinks::synchronous_sink< sinks::syslog_backend > > sink(
        new sinks::synchronous_sink< sinks::syslog_backend >(
            keywords::use_impl = sinks::syslog::native,
            keywords::facility = sinks::syslog::local7));
     ........................
    // We'll have to map our custom levels to the syslog levels
    sinks::syslog::custom_severity_mapping< severity_levels > mapping("Severity");
    mapping[normal] = sinks::syslog::info;
    mapping[warning] = sinks::syslog::warning;
    mapping[error] = sinks::syslog::critical;

    sink->locked_backend()->set_severity_mapper(mapping);

    // Add the sink to the core
    logging::core::get()->add_sink(sink);
...