如何访问 log4j.properties 文件中的应用程序参数?

问题描述 投票:0回答:1

我正在开发一个旧项目,该项目使用 log4j.properties 文件进行日志记录配置。在属性文件中,我尝试通过以下方式访问系统变量(或应用程序参数)-

log4j.appender.consoleapp.layout.ConversionPattern=%d %d{Z} [%t] %-5p (%F:%L) - %m%n BUCKET_ID=${sys:BUCKET_ID:-default_id}

# logs are getting generated like-
# 2016-05-14 00:34:11,994 +0530 [main] WARN  (Log4jExample.java:20) - My Warn Log BUCKET_ID=

但我无法获取 BUCKET_ID 值,即使 BUCKET_ID 是我提供的应用程序参数。我也尝试将变量替换为 BUCKET_ID=${BUCKET_ID} 但徒劳。

更新:也许我应该早点提到这一点,但它是 Java 中的 Spark 应用程序。我知道spark只支持log4j。我通过 -Dlog4j.configuration=file:log4j.properties 添加属性文件,它被选中,但 BUCKET_ID 没有在日志中设置,即使我在驱动程序和执行器配置中将 BUCKET_ID 作为额外的java选项传递。

apache-spark logging log4j log4j2
1个回答
1
投票

系统属性查找是 Log4j 版本 2 的一项功能。

Spark 附带了 Log4j 1.x 桥接器,当找到像

log4j.properties
这样的旧配置文件时,该桥接器就会被激活。这意味着您无法使用
log4j.properties
内部的查找。

但即使在 Log4j 1.x 中,您也可以使用 JVM 系统属性,例如您使用

-Dprop=val
设置的所有内容。所以你可以将
log4j.properties
中的条目更改为

log4j.appender.consoleapp.layout.ConversionPattern= [...] BUCKET_ID=${BUCKET_ID}

然后您可以使用

-DBUCKET_ID=${BUCKET_ID}
或通过
extraJavaOptions
提供值,具体取决于您的设置。

© www.soinside.com 2019 - 2024. All rights reserved.