在编写Java库时检测日志框架

在编写Java库时检测日志框架,java,logging,Java,Logging,我正在编写一个java库,它将被一些外部web应用程序使用。让我们假设每个应用程序都可以使用不同的日志系统,比如应用程序A在log4j上使用slf4j,而应用程序B:在logback上使用log4j2(log4j2->slf4j->logback),或者只使用普通logback 现在我想使用当前的日志框架来记录库中的一些消息 哪种方式可以检测客户端当前使用的日志系统 如何动态记录到检测到的日志系统 我以前做过类似的事情,通过检测特定类(slf4j的典型类)是否在类路径上,然后使用一些直接记录到s

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

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

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

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

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

    例如,您的库将根据
    slf4japi
    构建。如果应用程序想要使用Log4J,它将提供a)Log4J和b)从SLF4J到Log4J的桥接(这样你可以通过SLF4J登录,它仍然会在Log4J中结束)

    不要试图检测任何东西

    假设应用程序A在log4j上使用slf4j,应用程序B:在logback上使用log4j2

    在上面的示例中,应用程序A已经设置为使用您的库(因为它提供了slf4j api),而应用程序B也已经准备就绪(因为它提供了logback,而logback恰好也引入了slf4j api)。如果应用程序B在j.u.l上使用log4j2,它还需要从sfl4j拉入一个桥接器到j.u.l)

    一般来说,只有一个日志后端(由应用程序决定和配置),但是可以有许多日志API(以便您需要的所有库都可以有它们喜欢的一个)通过管道进入其中


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

    我认为您的问题进入了“固执己见”的领域。“什么是最好的方法”太不具体了。对于一个人来说,任何工作都是“最好的”,其他人可能有更高的要求。伊姆霍:我觉得你的方法还可以。@GhostCat:我明白了。我重新措辞了第一个问题。谢谢你的意见。Log4J2结束Logback?你的意思是Log4J2->SLF4J->Logback?@Kayman:是的,这就是我的意思……我会解决这个问题。这听起来不错,因为Log4J2还提供了Log4J2和SLF4J之间的桥梁,所以正如你所建议的,我将针对SLF4J spi进行构建。。。。但对于以下情况,您会怎么说:应用程序C是遗留的,使用log4j,而应用程序所有者不想提供桥接。。此外,在不允许桥接的情况下,还存在使用logback的应用位置D。我知道这听起来很尴尬(事实上这不是我的情况),但这也是检测loggin系统IMHO的另一个原因。如果应用程序C或应用程序D想要使用这个库,他们需要为库需要的API提供一个日志后端。没有理由不添加此选项(如果不允许某个特定的实现,则可能会有自定义的实现或noop记录器)。可以将其视为库的必需依赖项。如果您的库只需要使用JDK,您可以使用j.u.l.(但这有点痛苦)。好的,这是合理的。我将按照您的建议重新使用slft4j api。