无法使用$symbol读取Scala中的环境变量

无法使用$symbol读取Scala中的环境变量,scala,apache-spark,logging,log4j,cloudera,Scala,Apache Spark,Logging,Log4j,Cloudera,在Scala环境属性中添加属性 val sysProps = System.getProperties sysProps.setProperty("current.date.time", LocalDateTime.now().toString()) 我能拯救这片土地 我尝试在log4j.properties中访问此属性(current.date.time),如下所示 log4j.appender.file.File=C:/Users/vsami/Desktop/Demo_${current.

在Scala环境属性中添加属性

val sysProps = System.getProperties
sysProps.setProperty("current.date.time", LocalDateTime.now().toString())
我能拯救这片土地

我尝试在log4j.properties中访问此属性(
current.date.time
),如下所示

log4j.appender.file.File=C:/Users/vsami/Desktop/Demo_${current.date.time}.log
log4j.appender.file.File=C:/Users/vsami/Desktop/Demo_${env:current.date.time}.log
正在上述位置生成日志文件,如
Demo.Log
,预期为:-
Demo\u 2019/11/27T13:21:00.Log


上述实现无法帮助我从环境属性访问变量并生成具有预期命名约定的日志文件。

JVM具有可在VM启动时通过
-D
参数传递的属性<代码>-Dprop=value。 这些属性可以通过
System.getProperties
API调用读取。有关更多信息,请参阅

环境变量不是在JVM引导上指定的,而是由引导环境独立于VM进行管理(可以是shell、bash等)。您不能在已经运行的VM中更改环境变量。这些变量可以通过
System.getenv()读取

$
是中的查找运算符,可用于解析前缀为
env:
或前缀为
main:
的环境变量

您可以使用
main:current.date.time
并初始化您的值,如下所示

MainMapLookup.setMainArguments(Array("--current.date.time", LocalDateTime.now().toString()));

确保在初始化日志之前调用了
MainMapLookup

如果系统属性设置得太晚(在Log4J本身已经初始化之后),请分享您收到的错误。JVM系统属性与环境变量不同。我认为您不能在JVM中设置环境变量。正如@Thilo所指出的,即使您可以这样做,在您的代码设置环境变量之前,Log4J可能已经初始化了自己。@Thilo,是的,您是正确的-我在初始化Log4J之前尝试了设置系统属性,它起了作用,并且文件以预期的方式生成了-谢谢您的建议。@Thilo,在本地,我能够通过初始化log4j以预期的方式生成日志——当我在cloudera环境中尝试这样做时,我没有得到预期的结果——我是否遗漏了什么?