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