contextlistener override
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
System.out.println("context has started");
super.contextInitialized(event);
System.out.println(context.class.getName());
// Logger logme=LogManager.getLogger();
// Logger logme1=LogManager.getLogger("context-fileappend");
// logme.info("This is context logger"+this.toString());
// logme1.info("This is fileappend"+this.toString());
// final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
// final Configuration config = ctx.getConfiguration();
// Appender x=
// config.
//dostuff();
Context initCtx;
try {
initCtx = new InitialContext();
Context springCtx = initCtx.createSubcontext("spring");
Object bean=WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()).getBean(createdatasrc.class);
System.out.println(event.getServletContext().getMajorVersion()+" "+event.getServletContext().getMinorVersion());
springCtx.bind("bean", bean);
//START LOG4J INITIALIZATION FROM HERE
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//BasicDataSource
}
WEB.XML
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/data.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<context-param>
<param-name>isLog4jAutoInitializationDisabled</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<listener>
<listener-class>log4j.sessionmgr</listener-class>
</listener>
<listener>
<listener-class>log4j.context</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>
DATA.XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<bean id="data" class="log4j.createdatasrc"></bean>
</beans>
CREATEDATASRC.JAVA
public class createdatasrc extends BasicDataSource {
public static int count=0;
public createdatasrc()
{
count++;
this.setMaxIdle(10);
this.setMaxTotal(-1);
this.setUrl("jdbc:sqlserver://DESKTOP-5N44AE\\SQLEXPRESS:1433;databaseName=woah");
this.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
this.setUsername("sa");
this.setPassword("pass");
System.out.println("datasource created");
}
}
ЧАСТЬ LOG4J.XML
<JDBC name="databaseAppender" tableName="logs">
<DataSource jndiName="spring/bean" />
<Column name="eventDate" isEventTimestamp="true" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
<Column name="exception" pattern="%ex{full}" />
</JDBC>
В приведенном выше log4j.xml приложению jdbc требуется имя jndi для источника данных, проблема заключается в том, что создание источника данных будет происходить динамически во время инициализации контекста приложения.как можно увидеть в файле web.xml, после чего я буду связывать имя jndi с объектом источника данных во время инициализации servletcontext.Таким образом, по существу, когда запускается log4j, имя jndi не ограничено, что приводит к ошибке, что имя jndi не найдено.Вопросы:
- Как отложить запуск log4j2 и запустить процесс инициализации из кода?
- Возможно ли весной инициализировать bean-компонент (createatasrc) до запуска log4j2?
- Попытка изменить слушателя для log4j2, но процесс его инициализации все еще начинается до инициализации контекста приложения. Почему порядок слушателей не соблюдается?
- jdbcappender createbuilder, возможно ли использовать конструктор jdbcappender и вручнуюдобавить в конфигурацию appender?
Есть ли более простой способ сделать это без изменения того факта, что источник данных будет динамически инициализироваться пружиной?
Если для параметра контекста для параметра isLog4jAutoInitializationDisabled задано значение true, а Log4jServletContextListener, представленный в файле web.xml, log4j2 все еще может начать использовать конфигурацию по умолчанию, как это выглядит в консоли tomcat, это определенное поведение?
у меня тоже триd Создание источника данных во время инициализации контекста приложения, но log4j2 запускается еще до этого, что приводит к сбою поиска jndi, поэтому где я ошибаюсь при использовании параметра isLog4jAutoInitializationDisabled и как вручную запустить процесс инициализации в коде?
- Env: - Использование Tomcat 9 с сервлетом версии 4.0 с maven webapp-archtype в Eclipse IDE.