Электронная почта из Logback со значением переменной, считанным из файла App.propeties - PullRequest
0 голосов
/ 02 ноября 2019

Мое требование - отправить сообщение EMails из файла Logback.xml, если в моем приложении и в теме EMail возникает какая-либо ошибка: мне нужно отправить значение из файла Application.properties, который снова заполняется внешним источником.

в приведенном ниже коде: если я сохраню аргументы spring.app.url и spring.app.name как постоянные (не комментируя первые 2 строки в файле application.properties и комментируя последние 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>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>

1 Ответ

0 голосов
/ 03 ноября 2019

Средство распознавания свойств logback отличается от распознавателя пружин. В последнем разрешается также ссылка на переменную в части значения, а преобразователь logback - нет.

Таким образом, вам следует переконфигурировать приложение 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);
    }
}

EventListener, имеющий формальный параметр ContextRefreshedEvent, вызывается после инициализации spring.

...