首页 > 解决方案 > 使用 Boost Logging 和 ERROR 优先级 3 到 syslog 数据库时出现问题

问题描述

我有一个使用 boost 日志记录的程序,并且大多数时候该程序将日志写入本地文件或通过 rsyslog 部署到 /var/log/messages 时。大多数时候我们只是对看到错误(boost::log::trivial::error)感兴趣,但是在开发时我们希望在更高级别进行日志记录。这种记录方法看起来一切都很好,我们还有几个 python 脚本也使用 rsyslog,它们也正常放入 /va/log/messages 没有问题。

作为开发人员,我最近的任务是将日志记录从 /va/log/messages 转移到 postgres 数据库表中,以允许外部客户端在可能发生错误时获得通知。无论如何,我已经设法通过对 /etc/rsyslog.conf 文件进行一些调整并将文件添加到我们的 postgres 数据库来登录到所述数据库。

在我的调试过程中,我注意到我的 C++ 应用程序每次将 LOG ERROR 写入 syslog 时,优先级(数据库表中的列)设置为 6 级(信息)而不是 3 级(错误)(来自 rsyslog 网页)。python 代码总是记录优先级 3。这使得现在很难过滤。我的升压配置如下:

   if (syslog)
   {
       // Create a backend
       m_syslogSink = boost::make_shared<syslog_sink>(
            boost::log::keywords::facility = boost::log::sinks::syslog::user,
            boost::log::keywords::use_impl = boost::log::sinks::syslog::native
        );

        // Set the straightforward level translator for the "Severity" attribute of type int
        m_syslogSink->locked_backend()->set_severity_mapper(
            boost::log::sinks::syslog::direct_severity_mapping<int>("Severity"));
        
        m_syslogSink->set_formatter(
            boost::log::expressions::stream
                << boost::log::expressions::if_(boost::log::expressions::has_attr(unitName))[
                        boost::log::expressions::stream << '[' << unitName << "] "
                    ]
                << boost::log::expressions::smessage
            );

        // Share the filter level with the file log level but don't allow trace
        m_syslogSink->set_filter(boost::bind(
            &LogFilter, &m_fileLogLevel,
            boost::log::trivial::debug, boost::log::trivial::fatal,
            LogSource::LogType::FILE_OR_SYSLOG, ::_1));

        // Register the syslog sink with the logging core
        core->add_sink(m_syslogSink);
    }

我们的 LOG_ERROR 分解为 BOOST_LOG_SEV(LogControl::getLog()->log, boost::log::trivial::error) << "A Error message";

任何人都知道为什么这可能是一个已知的错误?在 boost 库中,或者我做了一些愚蠢的事情,或者是不可能的。我正在使用 boost::log::trivial::error 级别。

/etc/rsyslog.conf 包含行 *.info;mail.none;authpriv.none;cron.none :ompgsql:127.0.0.1,syslog,rsyslog,secret 将其放入数据库。

并使用 python 代码引发 syslog 日志错误,该代码执行我想要的操作 syslog.syslog(syslog.LOG_ERROR, "ERROR message")

提前致谢。

标签: c++loggingboost

解决方案


推荐阅读