java - 将 JUL 日志记录定向到 SLF4J 不起作用

标签 java slf4j log4j2 sphinx4 jul-to-slf4j

我正在使用使用 java.util.logging 的第三方库 ( Sphinx )。我一直在尝试几种方法将其日志路由到 slf4j。我希望使用的日志库是Log4j2,其配置如下:

Configuration:
  properties:
    property:
    - name: logPath
      value: logs
    - name: logName
      value: flux
    - name: rootLevel
      value: info
    - name: useConsole
      value: ALLOW
  Appenders:
    Console:
      name: Console
      target: SYSTEM_OUT
      ThresholdFilter:
        level: ${sys:rootLevel}
        onMatch: ${sys:useConsole}
      PatternLayout:
        pattern: "%d{yyyy.MM.dd G HH:mm:ss,SSS z} %-5p [%t] %C{2} (%F:%L) - %m%n"
    RollingRandomAccessFile:
      name: File
      fileName: "${sys:logPath}/${sys:logName}.log"
      filePattern: "${sys:logPath}/${sys:logName}.%d{yyyy-MM-dd}.log"
      PatternLayout:
        pattern: "%d{yyyy.MM.dd G HH:mm:ss,SSS z} %-5p [%t] %C{2} (%F:%L) - %m%n"
      Policies:
        TimeBasedTriggeringPolicy:
          interval: 1
  Loggers:
    Root:
      level: ${sys:rootLevel}
      AppenderRef:
        - ref: File
        - ref: Console

我应用了在这个论坛和其他论坛上找到的所有解决方案,但没有成功。其中:

我将此 Maven 依赖项添加到我的 POM 中:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>1.7.20</version>
    </dependency>

我还尝试在静态 block 中调用它:

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();

并尝试设置系统属性:

System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");

在我上次尝试中,我传递了 VM 参数:

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

并得到以下异常:

Could not load Logmanager "org.apache.logging.log4j.jul.LogManager"
java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.util.logging.LogManager$1.run(LogManager.java:195)
at java.util.logging.LogManager$1.run(LogManager.java:181)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.logging.LogManager.<clinit>(LogManager.java:181)
at org.chatbot.stt.SttEngineDemo.<clinit>(SttEngineDemo.java:25)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)

我做错了什么吗?我还能尝试什么?

更新:

我还尝试将 jul 重定向到 log4j2,绕过 slf4j,因此改变了我原来的策略(感谢 @rgoers 的建议)。 为了做到这一点,我添加了以下依赖项:

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jul</artifactId>
        <version>2.5</version>
    </dependency>

还设置了系统属性 java.util.logging.manager 到:org.apache.logging.log4j.jul.LogManager

然后狮身人面像日志就消失了。我知道它们不会路由到我的 log4j2 记录器,因为大多数 Sphinx 日志的级别为 INFO,并且它们应该由 log4j2 处理。所以还是不正确。

最佳答案

如果您想将消息路由到 Log4j 2 为什么不直接使用 Log4j 2 的桥接器? log4j-jul-2.5.jar

关于java - 将 JUL 日志记录定向到 SLF4J 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36344905/

相关文章:

java - Java 内部类

java - Apache Kafka 系统错误处理

java.lang.ClassNotFoundException : org. apache.log4j.Level 异常

java - 使用多个记录器实例而不是使用单个静态记录器类有什么好处?

java - 范围报告 3 添加屏幕截图

java - 比较器compare()方法排序困惑

java - 错误: SLF4J: Class path contains multiple SLF4J bindings

java - 使用 Log4j 2 登录 Windows 事件日志

logging - 使用 Log4J 2 进行日志记录时,Jboss Wildfly 日志文件中的日志记录错误

java - log4j2:包括 PID