3

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

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

提前致谢!

4

1 回答 1

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 文件。发布工程师根据环境管理这些配置。它还提供了更改文件和重新启动应用程序的能力,或者在某些情况下即使不重新启动也允许更改某些值。

于 2015-01-08T16:56:38.150 回答