是否可以在log4j.properties中包含条件。我有一种情况,我希望将日志记录级别设置为生产环境中的Info和本地DEBUG。是否可以在log4j.properties中读取环境变量。
答案 0 :(得分:3)
不,你必须拥有2个不同的log4j.properties文件
答案 1 :(得分:2)
配置日志记录应该作为部署的一部分发生,而不是作为构建的一部分,即您不应该为不同的日志配置创建多个构建,引入工件的其他差异的风险也很大。
创建包含默认配置的ONE版本,可能是您要在生产中使用的版本。
实现一种查找和使用备用配置的方法,而无需更改工件。大多数情况下,这是通过向应用程序的类路径添加其他目录并在其中存储log4j配置来实现的。您可以使用优先级高于工件中包含的配置格式的log4j default initialization。这也允许您在没有新部署的情况下重新配置日志记录,这在进行故障排除时非常有用。
或者,您可以在启动时通过环境变量提供配置文件的位置:-Dlog4j.configuration=log4j-prod.xml
(借用Keerthi Ramanathan的答案)
答案 2 :(得分:1)
您可以准备不同的构建版本并确定要在构建时包含哪些log4j.propeties,例如使用maven参数,配置文件或任何其他方式。 无法在log4j.properties
中声明条件答案 3 :(得分:1)
没有。 但只是概述一些其他选项
a)我建议您查看logback,它提供了一个简单的log4j外观,然后您可以在运行时更改您的配置。可以找到相关文档here。
b)如果你有一个构建过程(ant / maven),你可以在构建过程中进行替换。如果您使用maven,则可以设置profile to build 并在构建周期中应用filtering
c)从conf目录中为每个环境加载log4j文件。这样做的想法是,为环境设置的文件随着时间的推移会发生最小的变化。您可以在存储库中进行维护,也可以作为部署过程的一部分,确保添加/删除其他/已删除的文件/道具。
答案 4 :(得分:0)
我建议在评论中说,为每个环境都有一个单独的log4j属性文件版本,并遵循命名约定以便于维护。比方说,对于开发环境,它将是log4j-dev.xml,对于生产,它是log4j-prod.xml。现在,您可以使用
配置在运行时选择的相应文件-Dlog4j.configuration=log4j-prod.xml
在服务器启动期间。因此,log4j将采用适当的配置文件。
答案 5 :(得分:0)
使用log4j时可以使用编程配置,这使您可以更好地控制在什么环境中使用哪些选项。您可以拥有自己的配置文件,并使用自己的逻辑将它们转换为log4j配置。缺点是你需要在应用程序的某个地方执行init()。 This answer提供了很好的参考。
答案 6 :(得分:0)
当我有类似的问题时,我使用了这种方法。如果未明确指定,则为默认日志级别,并提供覆盖选项。
因此,我在应用程序资源中添加了log4j.properties
文件。
log4j.rootLogger=ALL, stdout
...
log4j.appender.stdout.Threshold=INFO
...
,然后为{log4j-
,.properties
中的n
添加更多日志配置属性(d
n i
, w
,e
})在调试,信息,警告和错误时定义日志级别。现在,在启动过程中,如果我想覆盖默认值,我将明确提供配置文件。
java ... -Dlog4j.configuration=file:///<path>/log4j-n.properties ...
这将覆盖我在默认log4j.properties
中拥有的所有配置。
后来我采用了这种方法。我删除了所有多余的配置文件。在资源中的log4j.properties
文件中,我使用了JVM arg占位符:
log4j.appender.stdout.Threshold=${app.log.level}
并将其作为JVM参数提供。
java ... -Dapp.log.level=<LOG-LEVEL> ...
Voila!