【问题标题】:log4j template file for multiple environments用于多种环境的 log4j 模板文件
【发布时间】:2014-10-03 15:08:13
【问题描述】:

我希望有一个单一的 WAR 文件,它可以在不同的环境(如 dev、ci 和 prod)中工作,而 spring 环境在很大程度上迎合了我们的用例。每个环境的 log4j 是突出的项目之一。正如other answers 中所建议的那样,我们可以为每个环境配置一个 log4j - 但是每个环境的文件中都有很多重复,唯一不同的是诸如 SMTPAppender 的 toAddress 等次要属性。有没有一种简单的方法可以使用类似模板的 log4j 配置文件并在运行时替换每个环境的不同部分? Maven 在这里不起作用,因为它会导致编译时选择。

我能想到的一个解决方案是扩展 Log4jConfigurer 以读取一些环境变量,即。模板键值对的映射,并将模板文件中的模板变量替换为实际值,然后再将其传递给 DOMConfigurator。只是想检查是否有更简单的方法可以做到这一点,或者从最佳实践的角度来看我是否在找错树。

提前致谢!

【问题讨论】:

  • 一个非模板解决方案是使用stackoverflow.com/questions/6116156/… 中提到的实体引用,我认为这在减少重复方面做得不错。
  • 你能解释一下为什么编译时间在这里没有帮助吗?你的意思是你只想创建一次war并在所有具有-Denvironment=xxx属性的环境上运行它,而不是为每个环境构建不同的war文件?

标签: java spring log4j environment-variables spring-environment


【解决方案1】:

我不完全理解您的情况,但属性占位符应该会有所帮助: http://jvleminc.blogspot.ru/2008/05/avoid-absolute-path-in-log4j-properties.html

  1. 例如,当您指定附加文件时,请在属性文件中使用占位符

    log4j.appender.file.File=${log4j.logFile}
    
  2. 将此占位符值作为 VM 参数传递给(Web)应用程序。 log4j 引擎将尝试解析占位符并最终依赖系统参数,因此,在我们的示例中:

    -Dlog4j.logFile=C:/logs/MyApplication.log
    

顺便说一句,我认为通常人们将日志配置外部化,即他们使用外部 log4j.properties 文件。发布工程师根据环境管理这些配置。它还提供了更改文件和重新启动应用程序的能力,或者在某些情况下允许在不重新启动的情况下更改某些值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多