селектор logback JNDI не загружен при загрузке Spring

#spring #spring-boot #logback

#spring #spring-boot #обратный вход

Вопрос:

У меня проблема, которая заблокировала меня на несколько дней. Я объясняю: у меня есть 2 приложения, которые используют один сервер. Я называю их appA и AppB. Мы используем Spring Framework и используем logback для системы ведения журнала. Я настроил селектор контекста logback JNDI, как описано в документе:http://logback.qos.ch/manual/contextSelector.html . и я установил файл обратной регистрации как: logback-appB.xml и logback-appA.xml на сервере. Он работает хорошо..

Но теперь мы переносим appA на spring boot, а AppB остается в spring. Я не знаю, почему appA не может загрузить имя контекста JNDI, которое я настроил в web.xml:

 <env-entry>
    <env-entry-name>logback/context-name</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>appA</env-entry-value>
</env-entry>
  

затем я отладил строку 54 в классе ch.qos.logback.classic.selector.ContextJNDISelector: contextName = JNDIUtil.lookup(ctx, «java: comp/env/logback/context-name»); результат всегда равен нулю. Я не знаю, почему, заставляет ли Spring boot использовать их контекст?

Я думаю, может быть, я могу использовать logging.config, чтобы принудительно использовать конфигурационный файл logback с этими попытками
logging.config=Z:/DEV/…../logback-appA.xml , или logging.config=file:Z:/DEV/…../logback-appA.xml или logging.config=classepath:logback-appA.xml , ни один из них не может загрузить файл. отладка в строке 67 класса org.springframework.boot.ведение журнала.возврат в систему.LogbackLoggingSystem, строка configLocation всегда равна нулю.

даже я установил logging.config=Z:/DEV/…../logback-spring.xml , il не может быть загружен.

я думаю, что я не могу использовать spring Active profile, поскольку AppB не использует spring boot.

Версия spring boot — 2.1.7. Если кто-то может помочь, большое спасибо.

Комментарии:

1. добавление -Dlogging.config в JVM сработало, но я не хочу этого решения, потому что JVM влияет на второе приложение

Ответ №1:

У меня была такая же проблема, и после нескольких дней поиска эта ссылка оказалась наиболее полезной: http://rostislav-matl.blogspot.com/2013/03/renamed-logback-config-file-for-web.html

В вашем инициализаторе spring вы можете переопределить OnStartup, чтобы добавить пользовательский прослушиватель:

   @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    // Add the customer listener to configure logback
    servletContext.addListener(CustomServletContextListener.class);
    super.onStartup(servletContext);
  }
  

а затем внедрите пользовательский прослушиватель, который загружает конфигурацию обратного входа:

 public class CustomServletContextListener implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent contextEvent) {
    // Get the war/context name from this context event
    String contextName = contextEvent.getServletContext().getContextPath().substring(1);

    // Get the path of the logback configuration file
    URL configFileURL = Thread.currentThread().getContextClassLoader().getResource("logback-"   contextName   ".xml");

    // If the URL exists in the classpath
    if (configFileURL != null) {
      try {
        // Reset the existing logger context and set the name to match the current context
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        loggerContext.reset();
        loggerContext.setName(contextName);

        // Update the logger context and configure the logger based on the configuration file
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(loggerContext);
        configurator.doConfigure(configFileURL);
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
  }
}