10 дек. 2008 г.

Tomcat: Log4J logging

Возникла проблема - сервлет из-под apache tomcat ни в какую не хочет писать лог log4j в файл.

Web-приложение простое - без spring'а, библиотеки commons-logging-1.0.4.jar и log4j-1.2.14.jar лежат в WEB-INF/lib

Пока гуглил нашёл подсказку:
Problem with Commons Logging / Log4j setup in spring webapp with tomcat 6 ,
где предлагают использовать listener'а сервелет контекса spring'овый org.springframework.web.util.Log4jConfigListener.

Тащить ради конфигурирования log4j ещё и spring - это overhead, на мой взгляд - поэтому пишем свой.
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.log4j.LogManager;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jInit implements ServletContextListener {

public void contextInitialized(final ServletContextEvent event) {
final ServletContext servletContext = event.getServletContext();
final String log4jConfigLocation = servletContext.getInitParameter("log4jConfigLocation");
final String log4jFilename = servletContext.getRealPath(log4jConfigLocation);
final DOMConfigurator configurator = new DOMConfigurator();
configurator.doConfigure(log4jFilename, LogManager.getLoggerRepository());
}

public void contextDestroyed(final ServletContextEvent event) {
// nothing
}

}

Замечание: Мне больше симпатизирует настойка log4j через xml - поэтому используем org.apache.log4j.xml.DOMConfigurator - для настройки log4j.properties потребуется org.apache.log4j.PropertyConfigurator

В web.xml прописываем нахождение log4j.xml и добавляем listener:
 <context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>

<listener>
<listener-class>Log4jInit</listener-class>
</listener>

2 комментария:

Анонимный комментирует...

Спасибо, помогло. Пол часа голову ломал - что за хрень творится :)

Владимир Долженко комментирует...

you are welcome