Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于多个环境的log4j模板文件_Java_Spring_Log4j_Environment Variables_Spring Environment - Fatal编程技术网

Java 用于多个环境的log4j模板文件

Java 用于多个环境的log4j模板文件,java,spring,log4j,environment-variables,spring-environment,Java,Spring,Log4j,Environment Variables,Spring Environment,我希望有一个WAR文件可以在不同的环境(如dev、ci和prod)中工作,spring环境很大程度上满足我们的用例。每个环境的log4j是突出的项目之一。正如中所建议的,我们可以为每个环境配置一个log4j,但是每个环境的文件中都有很多重复,唯一不同的是一些次要属性,如SMTPAppender的toAddress等。。有没有一种简单的方法可以使用log4j配置文件这样的模板,并在运行时替换每个环境中不同的部分?Maven在这里不起作用,因为它会导致编译时选择 我能想到的一个解决方案是扩展log4

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

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


提前谢谢

我不完全理解您的情况,但属性占位符应该有帮助:

  • 例如,在指定appender文件时,请在属性文件中使用占位符

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

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

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

    一个非模板解决方案是使用实体引用,我认为这在减少重复方面做得很好。您能解释一下为什么编译时在这里帮不上忙吗?您的意思是只想创建一次war,并在所有具有-Denvironment=xxx属性的环境中运行它,而不是为每个环境构建不同的war文件?