代码:
/**
* zoneland.net Inc.
* Copyright (c) 2002-2012 All Rights Reserved.
*/
package net.zoneland.uum.client.log;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import net.zoneland.uum.client.common.ConfigHelper;
import org.springframework.security.access.method.P;
/**
* @author gag
* @version $Id: AppConfigListener.java, v 0.1 2012-5-10 下午1:22:07 gag Exp $
*/
public class AppConfigListener implements ServletContextListener {
public static final String LOG_HOME_KEY = "log4j.home";
/**
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
String loghome = ConfigHelper.getInstance().getStringProperty(LOG_HOME_KEY);
//加载日志输出路径
System.setProperty(LOG_HOME_KEY, loghome);
}
/**
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
System.getProperties().remove(LOG_HOME_KEY);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="UUM_JSM_CLIENT" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>uum_oracle_client</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring*.xml</param-value>
</context-param>
<!-- 日志文件输出-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.xml</param-value>
</context-param>
<listener>
<listener-class>net.zoneland.uum.client.log.AppConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
</web-app>
配置文件读取工具:
package net.zoneland.uum.client.common;
import java.util.Properties;
import org.apache.commons.lang.math.NumberUtils;
import net.zoneland.uum.client.common.FileUtil;
public class ConfigHelper {
private static final ConfigHelper instance = new ConfigHelper();
private final Properties configProperties = FileUtil.loadPropFile("config.properties");
private ConfigHelper() {
}
public static ConfigHelper getInstance() {
return instance;
}
public Properties getConfigProerties(){
return configProperties;
}
public String getStringProperty(String key) {
String value = "";
if (configProperties.containsKey(key)) {
value = configProperties.getProperty(key);
}
return value;
}
public int getNumberProperty(String key) {
int value = 0;
String sValue = getStringProperty(key);
if (NumberUtils.isNumber(sValue)) {
value = Integer.parseInt(sValue);
}
return value;
}
}
配置文件:
内容
#log
#log4j.home=/home/zoneland/logs/osm_client
log4j.home=./logs/osm_client
日志设置:
log4j.xml
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="DEFAULT-APPENDER"
class="net.zoneland.uum.client.log.DailyRollingFileAppender">
<param name="file" value="${log4j.home}/common-default.log" />
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - %c %-5p - %m%n" />
</layout>
</appender>
<appender name="BIZ-APPENDER"
class="net.zoneland.uum.client.log.DailyRollingFileAppender">
<param name="file" value="${log4j.home}/common-biz.log" />
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - %c %-5p - %m%n" />
</layout>
</appender>
<appender name="ERROR-APPENDER"
class="net.zoneland.uum.client.log.DailyRollingFileAppender">
<param name="file" value="${log4j.home}/common-error.log" />
<param name="append" value="true" />
<param name="threshold" value="error" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - %c %-5p - %m%n"/>
</layout>
</appender>
<!-- Console Log Output-->
<appender name="STDOUT-APPENDER" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - %c %-5p - %m%n"/>
</layout>
</appender>
<appender name="STDERR-APPENDER" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.err" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d - %c %-5p - %m%n" />
</layout>
</appender>
<logger name="STDOUT" additivity="true">
<level value="info"/>
<appender-ref ref="STDOUT-APPENDER"/>
</logger>
<logger name="STDERR" additivity="false">
<level value="info"/>
<appender-ref ref="STDERR-APPENDER"/>
</logger>
<!-- Framework Log Output-->
<logger name="org.apache" additivity="false">
<level value="WARN"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
<logger name="org.hibernate" additivity="false">
<level value="WARN"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
<logger name="java.sql" additivity="false">
<level value="INFO"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
<logger name="org.springframework" additivity="false">
<level value="INFO"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
<!-- System Main service Log Output-->
<logger name="net.zoneland.uum.client" additivity="false">
<level value="INFO"/>
<appender-ref ref="BIZ-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
<root>
<level value="INFO"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</root>
</log4j:configuration>
问题:日志的路径没有生效,始终在根目录产生日志文件。
原因:
没有用tomcat容器的方式启动程序
学习要点:监听容器
在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。
如果你有多个ServletContextListener,其中一些是在部署描述符中声明的和其他带注释的人,然后在 web.xml 中定义的侦听器将获得优先权。
https://www.cnblogs.com/jmuccx/p/7690944.html
根据类名的排序来执行。