如何通过 spring 引导使用外部 log4j.xml 配置文件?

How do I use an external log4j.xml configuration file using spring boot?

我创建了一个 spring 引导项目,并希望在我的 jar 中使用外部 log4j.xml 配置文件。我使用的命令行是这样的:

java -Dlog4j.debug -Dlog4j.configuration=file:/tmp/log4j.xml -jar /tmp/project.jar

从调试来看,它似乎确实正确地加载了 log4j.xml,但在加载 log4j.xml 后不久,它又在 [= 中加载了 log4j.properties 24=]-boot jar 文件,它覆盖了我的 log4j.xml。有没有办法从 spring-boot jar 文件中忽略 log4j.properties?

log4j: Using URL [file:/tmp/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator
log4j: System property is :null
log4j: Standard DocumentBuilderFactory search succeded.
log4j: DocumentBuilderFactory is: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
log4j: debug attribute= "null".
log4j: Ignoring debug attribute.
log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [com.test] additivity to [true].
log4j: Level value for com.test is  [trace].
log4j: com.test level set to TRACE
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework.core] additivity to [true].
log4j: Level value for org.springframework.core is  [info].
log4j: org.springframework.core level set to INFO
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework.beans] additivity to [true].
log4j: Level value for org.springframework.beans is  [info].
log4j: org.springframework.beans level set to INFO
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework.context] additivity to [true].
log4j: Level value for org.springframework.context is  [info].
log4j: org.springframework.context level set to INFO
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework.web] additivity to [true].
log4j: Level value for org.springframework.web is  [info].
log4j: org.springframework.web level set to INFO
log4j: Level value for root is  [warn].
log4j: root level set to WARN
log4j: Class name: [org.apache.log4j.RollingFileAppender]
log4j: Setting property [file] to [/var/log/app/app.log].
log4j: Setting property [maxFileSize] to [5000KB].
log4j: Setting property [maxBackupIndex] to [5].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZZZ} %-5.5p [%-15.15t][%30.30c{2}#%17.17M]: %m%n].
log4j: setFile called: /var/log/app/app.log, true
log4j: setFile ended
log4j: Adding appender named [R] to category [root].
log4j: Reading configuration from URL jar:file:/tmp/project.jar!/lib/spring-boot-1.2.2.RELEASE.jar!/org/springframework/boot/logging/log4j/log4j.properties
log4j: Parsing for [root] with value=[INFO, CONSOLE].
log4j: Level token is [INFO].
log4j: Category root set to INFO
log4j: Parsing appender named "CONSOLE".
log4j: Parsing layout options for "CONSOLE".                                                                                                                                                                                                                                 

我知道已经有一段时间了,但我刚遇到同样的问题,也许我可以提供帮助。

首先,确保外部文件的名称与内部文件log4j.xml的名称不同。作为示例,我们将其命名为 log4j-tmp.xml。 现在,除了 log4j.configuration 之外,您只需在命令行中定义 logging.config

java -Dlog4j.debug -Dlogging.config=file:/tmp/log4j-tmp.xml -Dlog4j.configuration=file:/tmp/log4j-tmp.xml -jar /tmp/project.jar

你也可以将你的 application.properties 复制到你的 jar 之外(Spring Boot 将搜索外部配置文件并使用它们而不是 jar 的)并在其中定义 logging.config=path/to/log4j-tmp.xml,但是当你可以通过命令行添加它时,只为一个 属性 复制整个配置文件是没有意义的。

在 SpringBootServletInitializer 中你可以有

@PropertySource(值="file:${YOUR JVM ARGS OF PROP DIR}application.properties")

以上会将应用程序属性加载到环境中。

在application.properties

中定义一个属性

logging.config.file={您的 XML 配置路径}/MyLog4jCnfg.xml

您可以使用@Value 来获取相应的属性。
请注意,您无法在 configure() 方法中访问这些属性。

您需要使用 @PostConstruct initAfterStartup() 来访问您的

@Value(logging.config.file)

其实瓦伦有答案:

而不是:

-Dlog4j.configuration=file:/tmp/log4j.xml

你应该使用:

-Dlogging.config=/tmp/log4j.xml

所以命令是:

java -Dlog4j.debug -Dlogging.config=file:/tmp/log4j.xml -jar /tmp/project.jar

对于Spring启动你可以放

logging.config=${user.home}/projectName/log4j.xml

到项目中的 src/main/resources/application.properties 文件。

其中 ${user.home} 是通配符。在 Linux 中它指向 /home/user/,在 windows 环境中指向 C:\Users\user 目录。此 conf 参数也适用于 Spring 引导默认记录器 Logback。