来自Logback的电子邮件,具有从App.propeties文件中读取的可变值

问题描述 投票:0回答:1

我的要求是,如果我的应用程序和电子邮件主题中发生任何错误,都将从Logback.xml文件发送电子邮件:我需要发送来自Application.properties文件的值,该值再次由外部源填充。

在下面的代码中:如果我将spring.app.url和spring.app.name保持不变(取消注释application.properties文件中的前2行并注释掉后2行):我能够满足我的要求,但是只要我尝试获得此值从env变量:它不会通过电子邮件发送值(尽管它在我的类中正确打印了它)

LoggingTest类文件:

@RestController
public class LoggingTest {
Log logger = LogFactory.getLog(LoggingTest.class);


  @Value("${spring.app.url}")
  String environmentUrl;

  @Value("${spring.app.name}")
  String appName;

@RequestMapping("/")
public String Home() {
    System.out.println("Test environmentUrl : " + environmentUrl);
    System.out.println("Test appName : " + appName);
    logger.error("Error Occured : Send EMail");

    return "Hello";
}}

Application.properties文件:

#spring.app.url="Dummy Application URL"
#spring.app.name="Dummy Application Name"
spring.app.url=${vcap.services.<ServiceName>.credentials.url}
spring.app.name=${vcap.application.name}

Logback.xml文件:

<configuration>
<property resource="application.properties" />
<appender name="errMailer" class="ch.qos.logback.classic.net.SMTPAppender">
  <smtpHost>host values</smtpHost>
  <smtpPort>port number</smtpPort>
  <from>[email protected]</from>
  <to>[email protected]</to>
  <subject>App-Name : ${spring.app.name}</subject>
  <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>ERROR</level>
  </filter>
</appender>
<root level="ERROR">
    <appender-ref ref="errMailer" />
</root>
</configuration>
java spring spring-boot logback pivotal-cloud-foundry
1个回答
0
投票

logback的属性解析器与springs解析器不同。后一种方式还会解析值部分中的变量引用,而后备解析器则不会。

因此,在加载spring环境后,应在启动时通过代码重新配置logback附加程序,例如:

@Component
public class MyBean 
{
    @Autowired
    private Configuration myEnv;

    @EventListener
    public void onAppStart(ContextRefreshedEvent event) 
    {
        // re-configure here your logback appender
        String value = myEnv.get("spring.app.name");
        appender.setSubject(value);
    }
}

初始化spring之后,将调用具有形式参数ContextRefreshedEvent的EventListener。

© www.soinside.com 2019 - 2024. All rights reserved.