log4j-to-slf4j无法获取log4j2.xml

问题描述

尝试将自由应用程序部署到OCP,并按照以下示例将自由日志记录与应用程序日志合并: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中的那个,也许是一个问题。我们也不能再使用Configurator,因为它是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。 有关如何在Open Liberty中配置日志记录的更多信息,请参考https://openliberty.io/docs/20.0.0.11/reference/config/logging.html。 另外,您可以使用博客中所述的其他选项将日志发送到OCP。

编辑: 您可以做的另一种选择是使用控制台附加程序。您可以将应用程序日志直接以非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

控制台Appender: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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...