Как динамически связать имя jndi с источником данных, инициализированным Spring для использования в log4j2 jdbcappender? - PullRequest
0 голосов
/ 12 октября 2018

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...