gpt4 book ai didi

c++ - 实现一个正交日志级别,该级别将其转储到套接字中

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:27 25 4
gpt4 key购买 nike

我正在使用增强日志,并且想要实现一个独立于现有日志级别的额外日志级别。

如果有一个监听客户端连接到守护程序套接字,则该日志级别将按需激活(与当前配置的日志级别无关)。

这可能实现吗?

我怀疑可以通过自定义接收器实现按需功能,该接收器将丢弃或发送数据。但是如何将其与其余的日志记录代码集成在一起?

最佳答案

让我们分离您想要实现的目标。如果我正确理解:

  • 您希望一些日志记录通过套接字发送到另一个进程。
  • 仅需要发送选择的日志记录,而其他则不需要。
  • 您想在运行时启用或禁用此功能。

  • 通过扩展或自定义Boost.Log的不同部分,可以实现所有这些点。让我们看看如何实现这些目标。

    1.创建一个自定义接收器后端。

    Boost.Log使用 sinks处理日志记录。它没有提供通过套接字发送记录的接收器,因此您需要编写一个记录,这是正确的。这上面有一个 tutorial。请注意,您只需要编写一个后端,即实际发送记录的部分。库已经以几种前端的形式提供了实现线程同步和过滤的部分,您可以将其与自定义后端一起使用。

    此处的重要决定是您要通过网络发送日志记录的格式。最容易实现的是基于文本的格式,因为您可以使用库提供的 formatters来组成日志记录中的字符串。如果需要二进制格式,则必须自己实现序列化(也许在 Boost.Serialization或其他库的帮助下)。您最可能要做的是从 log record views中提取属性值,以便将它们序列化为适合发送的二进制形式。稍后我们将返回属性。

    实现接收器后端后,您可以选择合适的前端并将接收器添加到 the logging core中。此操作可以在应用程序启动时完成一次,即使此时无需发送日志记录也可以完成。

    2.使用属性标记日志记录。

    您想要记录的任何类型的数据都用 attributes表示。这包括时间戳,严重性级别甚至日志消息本身。日志记录基本上是这些属性生成的值的集合,具有相关的属性名称。如果要将某些日志记录与其他日志记录区分开(以通过接收器有选择地发送它们),则必须使用不同的属性对其进行标记。严重性级别不适合此操作,因为正如您所说,无论级别如何,您都希望发送记录。

    您可以使用 channels作为将某些日志记录路由到新接收器的方法。 channel 是另一个属性(通常是字符串),可以通过 filters进行分析,以阻止某些接收器的日志记录并传递给其他接收器。 channel ,严重性级别以及与此相关的任何其他属性都可以一起使用,以形成传递给库的日志记录。例如, here是同时支持 channel 和严重性级别的常用记录器。

    还有其他标记日志记录的方法。例如,您可以使用 scoped attributes使用属性标记在特定范围内创建的日志记录。这种方法的优势在于,这种方式可以标记通过任何记录器创建的任何日志记录,而不必访问该记录器。

    3.配置过滤器。

    正如我已经提到的,为了选择将哪些日志记录保存到接收器,您必须将 filter设置到接收器。筛选器由接收器前端管理,因此您不必在后端实现它。筛选器将检查应用程序发出的每个日志记录的属性值,并且仅传递满足条件的那些记录。例如,您可以设置一个过滤器,该过滤器将仅传递带有附加的channel属性的特定值的记录。或者,您可以设置一个始终返回false的过滤器,从而有效地禁用通过接收器的日志记录。您可以随时设置过滤器,因此可以根据要求修改日志记录行为。您只需要将指向接收器的指针放在某个地方,以便能够在需要时为其设置过滤器。

    关于c++ - 实现一个正交日志级别,该级别将其转储到套接字中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31429825/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com