log4j-to-slf4j 未获取 log4j2.xml

log4j-to-slf4j not picking up log4j2.xml

尝试将 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

只是为了获得更多的调试输出,但还没有让它工作。还有什么我可以尝试的吗?

我的具体最终目标是

不幸的是,我相信如果您使用 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。 有关如何在 Open Liberty 中配置日志记录的更多信息,请参阅 https://openliberty.io/docs/20.0.0.11/reference/config/logging.html。 或者,您可以使用博客中所述的其他选项将您的日志发送到 OCP。

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

bootstrap.properties:

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

server.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