我的要求是,如果我的应用程序和电子邮件主题中发生任何错误,则从 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/