#spring #spring-boot #tomcat #logging #log4j2
#spring #spring-boot #tomcat #ведение журнала #log4j2
Вопрос:
У меня есть несколько приложений spring boot (X, Y, Z), упакованных в виде файлов war, развернутых на моем tomcat. Я хочу использовать log4j2 в качестве системы ведения журнала для своих приложений. Итак, чтобы изменить систему ведения журнала, скажем, X, в tomcat я устанавливаю значение logging.config для свойства загрузки Sping, указывающее на /tomcat/apps/X/WEB-INF/classes/log4j2-spring.properties. При этом ведение журнала отлично работает для X.
Воспоминание: Если мы указываем logging.config=classpath:log4j2.properties в application.properties, то ведение журнала работает, когда мы запускаемся как Java-приложение в Eclipse. Но ведение журнала не работает, когда мы развертываем его как файл WAR на tomcat. Чтобы это заработало, мне пришлось поместить logging.config= {Path-to-myapp}/log4j2.properties в tomcat / bin / setenv.bat.
Мой вопрос в том, что если у меня несколько приложений, то как мне установить logging.config для каждого приложения Spring Boot.
Поскольку ведение журнала инициализируется до создания ApplicationContext, невозможно управлять ведением журнала из @PropertySources в файлах Spring @Configuration. Единственный способ изменить систему ведения журнала или полностью отключить ее — через системные свойства.
Ответ №1:
Я думаю, что есть ошибка. Поведение log4j2.properties/log4j2-spring.properties и log4j2-spring.xml это не одно и то же. Если мы используем log4j2.properties, то следует указать logging.config=classpath:log4j2.properties. С другой стороны, если мы используем log4j2-spring.xml тогда нет необходимости указывать logging.config.
На мой взгляд, это важная ошибка, которую необходимо исправить, чтобы разрешить развертывание нескольких приложений Spring Boot на одном сервере.
Следует внести исправление для поддержки log4j2.properties в org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.getCurrentlySupportedConfigLocations()
Ответ №2:
Я переименовал application.properties и установил конфигурацию log4j, внеся следующие изменения:
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
new SpringApplicationBuilder(MyApplication.class)
.properties("spring.config.name:new-app-properties-name")
.build()
.run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyApplication.class).properties("spring.config.name: new-app-properties-name");
}
/**
* Set log4j2.xml location
*/
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("logging.config", "/my-app/config/log4j2.xml");
super.onStartup(servletContext);
}
}
Комментарии:
1. В моем случае OnStartup не вызывается
Ответ №3:
Вы можете определить пользовательский путь ведения журнала для каждого приложения, что-то вроде этого:
logging:
level:
root: INFO
org.apache.http: ERROR
file: ${catalina.base:.}/logs/app-${app-number}.log
pattern:
file: ${logPattern}
console: ${logPattern}
Ответ №4:
У меня была похожая проблема, в этом случае я внес следующие изменения:
- Извлеките файл log4j2.properties из приложений, как вы это делали, указав внешнее расположение файла в файле .env.(В вашем случае это в файле .bat tomcat). Каждая загрузка spring ссылается только на этот файл.
- В этом файле log4j2.properties мы создали отдельное приложение и регистратор для каждой службы и настроили их.
Это не точное решение, но до определенных точек оно работает.
Для каждой службы, если вы хотите это сделать, это означает, что вы должны создать каждый файл, местоположение и все остальное… и после определенного момента это не поддается управлению.
Как упоминалось в предыдущем комментарии, нужен какой-то механизм для обработки такого рода ситуаций организованным и структурным способом.