java - log4j-to-slf4j 未获取 log4j2.xml

标签 java openshift log4j2 java.util.logging open-liberty

尝试将 liberty 应用程序部署到 OCP 并将 liberty 日志记录与每个示例的应用程序日志记录合并:https://openliberty.io/blog/2020/05/19/log4j-openshift-container-platform.html

我们的应用程序使用 LOG4J2 来配置和运行日志记录。到目前为止,这适用于以下依赖项。

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
    </dependency>

并使用以下代码行告诉应用程序 log4J2.xml 文件所在的位置

Configurator.initialize(null, log4jConfigUrlFile);

我们的日志记录最终保存在日志文件中,一切都很好。然而,现在我们需要某种方法来使用 Log4J2 来配置我们的记录器,但日志记录本身必须在 JUL 中结束,以便 OCP 及其 EFK 堆栈可以使用它。

我一直在尝试使用以下依赖项。

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-to-slf4j</artifactId>
  <version>2.13.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.7</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

没有编译问题,程序启动,我看到控制台中出现日志记录。然而,当我尝试调整我们的 log4j2.xml (位于类路径上)并且例如不想看到它们仍然出现的信息消息时。看起来它没有加载或没有使用。我注意到的另一件事是 LoggingFactory 是 slf4j-jdk14 中的 LoggingFactory ,也许这是一个问题。我们也不能再使用配置器,因为它是 log4j-core 的一部分,并且您不能在同一个类路径上有两个实现(log4j-to-slf4j)。

我还尝试设置日志文件位置属性

-Dlog4j.configurationFile=./resources/log4j/log4j2.xml

我尝试了几种目录结构的排列,只是为了确定并且不起作用。还尝试了以下方法。

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE

只是为了获得更多调试输出,但还没有发挥作用。还有其他我可以尝试的事情吗?

我的具体最终目标是

  • 通过 log4j2.xml 配置日志记录
  • 在控制台中将日志记录最终显示为 java.util.logging

最佳答案

不幸的是,我相信如果您使用 log4j-to-slf4j 适配器,log4j2.xml 配置将被忽略。必须在服务器端的 server.xml 中更改任何日志记录配置。如果根据日志级别过滤日志,您可以使用 consoleLogLevel 属性。 在 bootstrap.properties 文件中:

com.ibm.ws.logging.console.log.level=<log level>

或者在您的 server.xml 文件中:

<logging consoleLogLevel="<log level>" />

或者在您的服务器环境中:

WLP_LOGGING_CONSOLE_LOGLEVEL=<log level>

日志级别的有效选项包括 AUDIT、ERROR、INFO、OFF、WARNING。 请引用https://openliberty.io/docs/20.0.0.11/reference/config/logging.html有关如何在 Open Liberty 中配置日志记录的更多信息。 或者,您可以使用博客中所述的其他选项将日志发送到 OCP。

编辑: 您可以做的另一个选择是使用控制台附加程序。您可以将应用程序日志直接以非 json 格式发送到控制台。如果您希望以 JSON 格式保留 Liberty 日志记录并将 log4j 2 应用程序日志以 JSON 格式保存,您还可以使用 appsWriteJson 日志记录属性将 JSON 应用程序日志直接发送到 System.out/err。

bootstrap.properties:

com.ibm.ws.logging.apps.write.json=true

服务器.xml

<logging appsWriteJson="true"/>

服务器环境:

WLP_LOGGING_APPS_WRITE_JSON=true

控制台附加程序:https://logging.apache.org/log4j/2.x/manual/configuration.html#Appenders 有关 appsWriteJson 的更多信息: https://openliberty.io/blog/2020/07/30/json-logging-open-liberty-20008.html

关于java - log4j-to-slf4j 未获取 log4j2.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64664702/

相关文章:

node.js - Openshift CORS ERROR 'Access-Control-Allow-Origin' header 包含多个值

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

java - 为什么只有根记录器在具有 JSON 配置的 Log4j 2 中工作?

java - 在 log4j2 中,我可以拥有多个同名的记录器吗?

java - 为什么我的代码有这个错误

java - 这些 'Java Version'有什么区别

node.js - 包括存储库中不存在的文件

kubernetes - 在OpenShift上预填充持久卷

java - 我需要学习如何在情况 6 中返回主菜单,它确认退出,但我不确定它如何循环回菜单

java - 桌面应用程序中的领域驱动设计