C++ 如何在 Boost Global Logger 上设置严重性过滤器

2023-12-01

我已经尝试了几天来创建一个 Boost Global Logger 以便在整个应用程序中使用但我似乎无法获得全局记录器中设置的严重级别.

重要的:

请看下面安德烈的答案......它被标记为步骤(a)和(b),但我仍然没有得到正确的答案!


直接来自 Boost 文档here

...拥有一个或多个全局记录器会更方便 以便在需要时可以在任何地方轻松访问它们。在这方面 std::cout 是此类记录器的一个很好的例子。

该库提供了一种声明全局记录器的方法,可以 访问方式与 std::cout 非常相似。其实这个功能可以用 与任何记录器,包括用户定义的记录器。宣布全球 记录器,可以确保对这个记录器有线程安全的访问 来自应用程序代码的任何位置的实例。图书馆还 保证全局记录器实例即使在不同的环境中也是唯一的 模块边界。这甚至允许在仅标头中使用日志记录 可能被编译成不同模块的组件。


无论您使用什么宏来声明记录器,您都可以 使用logger的静态get函数获取logger实例 标签:

src::severity_logger_mt< >& lg = my_logger::get();

我从 Boost Logger 大师 Andrey 那里得知我的问题是严重性类型不匹配.

您已使用默认模板实例化了severity_logger_mt 参数,因此严重性级别属性的类型为 int。你的枚举 值被转换为 int 并发送到日志记录核心。你还没有 设置任何接收器,因此默认情况下使用默认接收器。水槽 尝试从日志记录中提取严重性级别属性值, 但未能做到这一点,因为它预计严重级别为 输入 boost::log::trivial::severity_level。在那次失败之后水槽 回退到 boost::log::trivial::severity_level::info 严重性。

如果您想使用枚举来表示严重级别,您必须:

------------------------------------------------(现在,这就是答案!!!)-- ------------------------------------------------

(a) 在记录器模板参数中指定它并

(b) 设置一个带有格式化程序的接收器,该格式化程序可以识别您的枚举。

但我不知道如何做到这一点,因为即使在尝试遵循他的指示之后,严重性级别看起来仍然会回落到 boost::log::trivial::severity_level::info 严重性。谁能帮我弄清楚如何在我的全局记录器中正确设置严重性?这是代码:

HEADER

#include <boost/log/trivial.hpp>
#include <boost/log/sources/global_logger_storage.hpp>

enum severity_level
{
    normal,
    warning,
    error,
    critical
};

BOOST_LOG_GLOBAL_LOGGER(logger, boost::log::sources::severity_logger_mt< severity_level >)

CPP

#include "GlobalLogger.h"

#include <boost/log/expressions/formatters/date_time.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/core/null_deleter.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/make_shared.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/sinks.hpp>
#include <fstream>

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace sinks = boost::log::sinks;
namespace attrs = boost::log::attributes;

bool onlyWarnings(const boost::log::attribute_value_set& set)
{
    return set["Severity"].extract<severity_level>() > 0;
}

void severity_and_message(const boost::log::record_view &view, boost::log::formatting_ostream &os)
{
    os << view.attribute_values()["Severity"].extract<severity_level>() << ": " <<
    view.attribute_values()["Message"].extract<std::string>();
}

BOOST_LOG_GLOBAL_LOGGER_INIT(logger, boost::log::sources::severity_logger_mt< severity_level >)
{
    boost::log::sources::severity_logger_mt< severity_level > logger;

    // add a text sink
    typedef sinks::asynchronous_sink<sinks::text_ostream_backend> text_sink;
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();

    // add "console" output stream to our sink
    boost::shared_ptr<std::ostream> stream{&std::clog, boost::null_deleter{}};
    sink->locked_backend()->add_stream(stream);

    // specify the format of the log message
    sink->set_formatter(&severity_and_message);

    // just log messages with severity >= SEVERITY_THRESHOLD are written
    sink->set_filter(&onlyWarnings);

    // "register" our sink
    logging::core::get()->add_sink(sink);

    logging::add_common_attributes();

    return logger;
}

main.cpp

#include <iostream>

#include "GlobalLogger.h"

using namespace std;

int main() {
    boost::log::sources::severity_logger_mt<  severity_level >& lg = logger::get();
    BOOST_LOG_SEV(lg, severity_level::normal) << "note";
    BOOST_LOG_SEV(lg, severity_level::warning) << "warning";
    BOOST_LOG_SEV(lg, severity_level::critical) << "critical";

    return 0;
}

我找到了一个更好的例子62.10。定义全局记录器的宏和一个工作版本这个问题。但工作示例没有使用 get() 方法。因此,在声明 BOOST_LOG_GLOBAL_LOGGER 后,我能够访问 log::get()但我还是无法让它认识到严重性.


我找到了 Boost Log 专家 Andrey。为了将来帮助其他人,我发布了我们的链接Sourceforge 讨论。在我的头在显示器上敲了很多次之后,他进行了解释并重新审视了工作版本这个问题。但我终于成功了!耶!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 如何在 Boost Global Logger 上设置严重性过滤器 的相关文章

随机推荐

  • 导航抽屉项目图标不显示原始颜色

    我试图在导航抽屉的菜单中的项目旁边显示一个图标 但由于某种原因 该图标始终显示为灰色 而不是原始颜色 棕色 有什么方法可以防止这种情况发生 以显示图标的原始颜色 MainActivity java public class MainActi
  • 如何更改默认 EditText 的样式

    我正在创建三个EditText在我的 xml 文件中使用如下代码
  • Python CSV:读取以逗号终止的行会导致空结果

    如果这是一个愚蠢的问题 请随意骚扰我 因为我自己找不到正确的答案 我正在尝试读取一个 CSV 格式的文件 其中每行都包含数据 并且每行都以逗号终止 像这样 1 1 1 1 当我尝试使用 Python 的 CSV 函数时 我使用以下代码 wi
  • 错误:“struct List”需要模板参数

    我正在尝试为 List 类创建自己的模板作为学习练习 不过 我在模板语法方面遇到了一些问题 现在收到以下错误消息 main cpp Line 8 instantiated from here error template argument
  • 对于 >2 个类别的结果,插入符训练方法不起作用(所有准确性结果都有问题)

    嗨 我知道之前有人问过类似的问题 但还没有明确的答案 或者我尝试了他们的解决方案但没有成功 使用 GBM 时出现插入符错误 但并非没有插入符 插入符训练方法抱怨有问题 所有 RMSE 指标值均缺失 我尝试使用插入符训练方法来预测分类结果 下
  • R.java自动生成文件

    在 android 2 1 和 2 2 中 R java 文件是自动生成的 但在2 0平台中我们必须构建R java文件 任何人都知道如何从程序生成 R java 文件 使用 clean 并在 eclipse 中构建 每次构建 androi
  • 即使设置了内容大小,UIScrollView 也不会滚动

    我的 UIScrollView 是一个约 4500px 的水平视图 用户需要水平滚动才能查看内容 我已将其设置如下 void viewDidLoad super viewDidLoad sview frame CGRectMake 0 0
  • 定点的 2 次幂近似

    目前 我正在使用一个小型查找表和线性插值 它非常快且足够准确 最大误差小于 0 001 然而我想知道是否有一个更快的近似值 由于指数的整数部分可以通过位移位来提取和计算 因此近似值只需在 1 1 范围内工作 我试图找到切比雪夫多项式 但对于
  • Msys2:两个 python 安装中的 readline

    我将编辑放在最上面 因此读者不需要找到当前状态 这是与中提到的两个 python 安装相关的特定问题Msys2 维护两个 python 安装 pacman Sl grep python grep installed mingw64 ming
  • Android Eclipse - 移动项目导致所有 R 引用错误

    我通过右键单击项目 gt 重构 gt 移动将我的项目移动到 Eclipse 上 这导致 起初 项目名称旁边显示一个感叹号 所以我重新启动了Eclipse 这删除了感叹号 但现在我的整个活动文件的 R 引用都有错误 我试过 删除 R java
  • JPA/hibernate大集合

    在具有两种类型实体 父实体和子实体 的场景中 家长 OneToMany 集合子项 默认情况下对子集合进行延迟加载 这种模式对于少数儿童来说效果很好 但如果儿童数量变得非常多 这似乎是不可持续的 因此 对于我认为子级数量会非常大的情况 我会使
  • C# Regex.Replace 匹配相同数量的字符

    我想知道如何将未知数量的等号 不少于 2 个 的正则表达式匹配替换为相同数量的下划线 到目前为止我得到了这个 text Regex Replace text 2 我应该使用什么作为第三个参数 编辑 最好是与所有语言兼容的正则表达式解决方案
  • 在 C# 中从 FLV 流中提取音频

    我想从 C 中的 FLV 流中提取音频流 我在谷歌上搜索 发现FLV提取 但它仅支持从 FLV 文件中提取 而不支持从流中提取 我怎样才能做到这一点 我没有找到任何东西 所以我必须自己写 它速度非常快 而且效果很好 这是代码 protect
  • 如何根据媒体大小显示不同的视频?

    我打算在网页上运行背景视频 我有不同的移动视频文件和桌面视频文件 我
  • JEdi​​torPane 超链接 swing html

    我很难让超链接在 JEditorPane 中工作 有人可以告诉我我在这里做错了什么吗 我希望能够单击链接和浏览器来打开该页面 提前致谢 D bottomText setText a href Yahoo a bottomText setEd
  • 无法从 gradle 构建脚本查询数据库

    我正在尝试从 gradle 脚本任务中查询数据库 我从一个 groovy 脚本开始来验证代码 import groovy sql Sql this class classLoader rootLoader addURL new URL fi
  • 在 Bat 或 VBS 中创建快捷方式

    我一直在努力为我的程序 批处理文件创建快捷方式 我想批量执行此操作 创建一个 VBS 文件来执行此操作 因为 至少我认为 批量无法创建快捷方式 但因为我不是at all熟悉VBS编码我根本不知道如何做 但我知道我想要怎样 我正在寻找一个可以
  • 在 Xamarin iOS 中的单页中强制横向模式?

    我使用依赖服务强制 Android 和 iOS 中的单个页面横向显示 这是针对 Android 的 public class OrientationService IOrientationService public void Landsc
  • 如何为Android创建图书应用程序?

    我想使用 android studio 构建一个简单的 Android 图书应用程序 其中包含 100 页纯文本内容 要输入的第一个活动 2 个用于导航到下一页和上一页的按钮以及页码指示器 此外 当单击页面指示器时 会弹出一个窗口用于输入特
  • C++ 如何在 Boost Global Logger 上设置严重性过滤器

    我已经尝试了几天来创建一个 Boost Global Logger 以便在整个应用程序中使用但我似乎无法获得全局记录器中设置的严重级别 重要的 请看下面安德烈的答案 它被标记为步骤 a 和 b 但我仍然没有得到正确的答案 直接来自 Boos