#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);
}
}
}
}