java - 编写Java库时检测日志框架

标签 java logging

我正在编写一个 Java 库,它将被一些外部 Web 应用程序使用。让我们假设每个应用程序都可以使用不同的日志系统,比如 App A 在 log4j 上使用 slf4j,而 App B:在 logback 上使用 log4j2 (Log4j2 -> slf4j -> logback) 或只是普通的 logback。

现在我想使用当前的日志框架来记录库中的一些消息。

  • 我可以通过哪种方式检测客户端当前使用的日志系统?
  • 如何动态登录到检测到的日志系统?

  • 我之前通过检测特定类(slf4j 的典型类)是否在类路径上,然后使用一些直接记录到 slf4j 的“loggingService”来做了类似的事情。我想知道这是否是正确的方法或者如何解决这个问题?

    最佳答案

    通常的方法是选择您的日志记录 API,并让使用您的库的应用程序为其提供实现(这可以只是连接实际使用的任何后端的桥梁)。

    例如,您的库将针对 slf4j-api 构建。 .如果应用程序想要使用 Log4J,它将提供 a) Log4J 和 b) 从 SLF4J 到 Log4J 的桥梁(以便您可以通过 SLF4J 登录,但它仍然以 Log4J 结束)。

    不要试图检测任何东西。

    say App A uses slf4j over log4j and App B: uses log4j2 over logback



    在上面的例子中,App A 已经设置好消费你的库(因为它提供了 slf4j-api),App B 也准备好了(因为它提供了 logback,这恰好也带来了 slf4j-api)。如果 App B 在 j.u.l 上使用 log4j2,它还需要在从 sfl4j 到 j.u.l 之间建立一个桥接。

    通常,只有一个日志记录后端(由应用程序决定和配置),但可以有许多日志记录 API(以便您需要的所有库都可以拥有他们喜欢的一个)。

    代码想要检测并直接与日志记录后端对话的唯一原因是您是否需要以编程方式配置它。通常只有应用程序引导代码需要这样做(如果有的话)。对于实际的日志记录,您只需与 API(您选择的)交谈即可。

    关于java - 编写Java库时检测日志框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662697/

    相关文章:

    java - 将按钮放在 JPanel 中的图像顶部?

    java - 使用匹配器的mockito的InvalidUseOfMatchersException

    java - 在Xwork中,不能将-validation.xml放置在与相应Action类相同的包中之外的其他位置

    java - 任何 Javascript Regex ReplaceAll 都像 Groovy 一样由匿名函数实现吗?

    javascript - 创建具有对数 Y 轴的图表

    java - 限制 log4j2 模式中的最大消息大小

    java - 尝试在泛型中使用原始类型时出现奇怪的编译时行为

    node.js - 首先在nodejs Winston logger中写入时间戳

    java - 如何使用 slf4j 读取 .properties 文件?

    Git 日志显示提交中有多个分支?