java - 来自 Logback 的电子邮件,其中包含从 App.properties 文件读取的变量值

标签 java spring spring-boot logback cloud-foundry

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

在下面的代码中: 如果我将 spring.app.url 和 spring.app.name 保持不变(取消注释 application.properties 文件中的前 2 行并注释掉最后 2 行):我能够实现我的要求,但一旦我尝试获取此值来自环境变量:它不会在电子邮件中发送值(尽管它在我的类中正确打印它)

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>abc@xyz.com</from>
  <to>abc@xyz.com</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>

最佳答案

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

因此,您应该在 Spring 环境加载后在启动时通过代码重新配置 logback Appender,例如:

@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。

关于java - 来自 Logback 的电子邮件,其中包含从 App.properties 文件读取的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58673999/

相关文章:

java - 抽象类的意义何在?

java - Liquibase Groovy-DSL Spring

spring - BCryptPasswordEncoder - 编码密码看起来不像 BCrypt

java - spring bean 配置中的微流 EmbeddedStorageManager

java - 注入(inject)组件到已部署的 Tomcat 服务器 [Spring Boot] 失败

java - 类型安全 : Unchecked cast from Object to JAXBElement<User>

java - 在 Android 中播放音频时出现故障

java - 如何将 char[][] 扁平化为 char[]?

java - 从第三方框架中过滤掉 log4j 消息?

java.lang.IllegalArgumentException "Can not set DAO field"与 Spring 4 & Hibernate 4