是否可以在 log4j.properties 中有条件。我有一种情况,我想在生产环境中将日志记录级别设置为信息,在本地设置为调试。是否可以读取 log4j.properties 中的环境变量。
7 回答
不,你必须有 2 个不同的 log4j.properties 文件
配置日志记录应该作为部署的一部分发生,而不是作为构建的一部分,即您不应该为不同的日志配置创建多个构建,在工件中引入其他差异的风险很大。
创建一个包含默认配置的构建,可能是您想要在生产中使用的那个。
实现一种在不更改工件的情况下查找和使用替代配置的方法。大多数情况下,这是通过在应用程序的类路径中添加一个附加目录并在其中存储 log4j 配置来实现的。您可以通过使用优先级高于工件中包含的配置格式的配置格式来使用 log4j的默认初始化。这还允许您在不进行新部署的情况下重新配置日志记录,这在故障排除时非常有用。
或者,您可以在启动时通过环境变量提供要使用的配置文件的位置:(-Dlog4j.configuration=log4j-prod.xml
借用 Keerthi Ramanathan 的回答)
您可以准备不同的构建并决定在构建时要包含哪些 log4j.propeties,例如使用 maven 参数、配置文件或任何其他方式。没有办法在 log4j.properties 中声明条件
正如评论中所说,我建议为每个环境提供一个单独版本的 log4j 属性文件,并遵循命名约定以便于维护。比如说,对于开发环境,它将是 log4j-dev.xml,而对于生产环境,则是 log4j-prod.xml。现在,您可以配置适当的文件以在运行时使用
-Dlog4j.configuration=log4j-prod.xml
在服务器启动期间。因此,log4j 将采用适当的配置文件。
您可以在使用 log4j 时使用编程配置,这使您可以更好地控制在什么环境中使用哪些选项。您可以拥有自己的配置文件并使用自己的逻辑将它们转换为 log4j 配置。缺点是您需要在应用程序的某个地方执行 init()。这个答案提供了很好的参考。
当我有类似的问题时,我使用了这种方法。如果没有明确指定,则默认日志级别,以及覆盖的选项。
所以,我log4j.properties
在应用程序资源中添加了一个文件。
log4j.rootLogger=ALL, stdout
...
log4j.appender.stdout.Threshold=INFO
...
然后添加了更多日志配置属性(log4j-
n.properties
,for n
in { d
, i
, w
, e
} )在调试、信息、警告和错误中定义日志级别。现在,在启动期间,如果我想覆盖默认值,我会明确提供配置文件。
java ... -Dlog4j.configuration=file:///<path>/log4j-n.properties ...
这将覆盖我在 default 中的任何配置log4j.properties
。
后来我采用了这种方法。我删除了所有额外的配置文件。在log4j.properties
资源文件中,我使用了 JVM arg 占位符:
log4j.appender.stdout.Threshold=${app.log.level}
并将其作为 JVM 参数提供。
java ... -Dapp.log.level=<LOG-LEVEL> ...
瞧!