log4j配置根据日志级别记录记录日志,以及动态设置日志文件位置
?日志根据级别,分别建立各自级别的文件,低级日志文件包含高级别的日志信息。
设置日志文件位置为项目的/WEB-INF/logs目录下
把log4j.properties文件放到class目录下
内容如下
?log4j.rootLogger=debug, stdout, info,debug,warn,error log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p %F:%L - %m%nlog4j.appender.stdout.encoding=GBKlog4j.logger.info=infolog4j.appender.info=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.info.layout=org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}] [ Class = %C | Method = %M | Line = %L ] | %m |%nlog4j.appender.info.datePattern='.'yyyy-MM-ddlog4j.appender.info.Threshold=INFOlog4j.appender.info.append=truelog4j.appender.info.Encoding=UTF-8log4j.appender.info.File=info.loglog4j.logger.debug=debuglog4j.appender.debug=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.debug.layout=org.apache.log4j.PatternLayoutlog4j.appender.debug.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}] [ Class = %C | Method = %M | Line = %L ] | %m |%nlog4j.appender.debug.datePattern='.'yyyy-MM-ddlog4j.appender.debug.Threshold=DEBUGlog4j.appender.debug.append=truelog4j.appender.debug.Encoding=UTF-8log4j.appender.debug.File=debug.loglog4j.logger.warn=warnlog4j.appender.warn=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.warn.layout=org.apache.log4j.PatternLayoutlog4j.appender.warn.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}] [ Class = %C | Method = %M | Line = %L ] | %m |%nlog4j.appender.warn.datePattern='.'yyyy-MM-ddlog4j.appender.warn.Threshold=WARNlog4j.appender.warn.append=truelog4j.appender.warn.Encoding=UTF-8log4j.appender.warn.File=warn.loglog4j.logger.error=errorlog4j.appender.error=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.layout=org.apache.log4j.PatternLayoutlog4j.appender.error.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}] [ Class = %C | Method = %M | Line = %L ] | %m |%nlog4j.appender.error.datePattern='.'yyyy-MM-ddlog4j.appender.error.Threshold=ERRORlog4j.appender.error.append=truelog4j.appender.error.Encoding=UTF-8log4j.appender.error.File=error.log
?
建立一个filter来进行项目启动阶段对log4j进行初始化
内容如下
package com.web.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import com.database.JdbcTemplateUtil;import com.setting.WebSetting;import com.util.LogUtil;public class ServerInitFilter implements Filter {private String charset = WebSetting.CHARSET;private String defaulteLog4jPropertiesPath = "/WEB-INF/classes/log4j.properties";private String defaultLogFilePath = "/WEB-INF/logs";@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {/** * 根据请求头字段ContentType,自动调整编码 * 如果没有ContentType字段,或者字段不包含编码,则使用项目设定的编码 */String reqContentType = req.getContentType();if(reqContentType == null){req.setCharacterEncoding(charset);}else{String[] contentType = reqContentType.split(";");if(contentType.length != 2){req.setCharacterEncoding(charset);}else{String reqCharset = contentType[1].split("=")[1];if(reqCharset.toLowerCase().equals("gbk") //for fileupload|| reqCharset.toLowerCase().equals("gb2312")|| reqCharset.toLowerCase().equals("utf-8")|| reqCharset.toLowerCase().equals("utf8")|| reqCharset.toLowerCase().equals("gb18030")){req.setCharacterEncoding(reqCharset);}else{req.setCharacterEncoding(charset);}}}chain.doFilter(req, resp);}@Overridepublic void init(FilterConfig config) throws ServletException {//LogUtil.log4jInit(config.getServletContext().getRealPath("/WEB-INF/classes/log4j.properties"), config.getServletContext().getRealPath("/WEB-INF/logs"));initLog4j(config);setCharacterEncoding(config);LogUtil.info("系统配置加载完成!");}private void setCharacterEncoding(FilterConfig config){String initCharset = config.getInitParameter("charSet");if(initCharset == null || initCharset.trim().length() == 0)return;this.charset = initCharset;LogUtil.info("已设置字符集为:"+initCharset);}private void initLog4j(FilterConfig config){String log4jPropertiesPath = config.getInitParameter("log4jPropertiesPath");String logFilePath = config.getInitParameter("logFilePath");if(log4jPropertiesPath == null || log4jPropertiesPath.trim().length() == 0){log4jPropertiesPath = this.defaulteLog4jPropertiesPath;}if(logFilePath == null || logFilePath.trim().length() == 0){logFilePath = this.defaultLogFilePath;}LogUtil.log4jInit(config.getServletContext().getRealPath(log4jPropertiesPath), config.getServletContext().getRealPath(logFilePath));}}
?
?
其中LogUtil类的log4jInit方法内容如下
public static void log4jInit(String configPath, String logDirectory) {File file = new File(configPath);if (!file.exists())return;try {InputStream in = new FileInputStream(file);Properties p = new Properties();p.load(in);String basePath = logDirectory+File.separator;if(p.getProperty("log4j.appender.info.File") != null){p.setProperty("log4j.appender.info.File", basePath + p.getProperty("log4j.appender.info.File"));}if(p.getProperty("log4j.appender.debug.File") != null){p.setProperty("log4j.appender.debug.File", basePath + p.getProperty("log4j.appender.debug.File"));}if(p.getProperty("log4j.appender.warn.File") != null){p.setProperty("log4j.appender.warn.File", basePath + p.getProperty("log4j.appender.warn.File"));}if(p.getProperty("log4j.appender.error.File") != null){p.setProperty("log4j.appender.error.File", basePath + p.getProperty("log4j.appender.error.File"));}PropertyConfigurator.configure(p);in.close();LogUtil.info("日志文件位置为:"+basePath);} catch (Exception e) {System.out.println("加载log4j配置文件失败!");}}?
web.xml文件配置如下
<filter><filter-name>initFilter</filter-name><filter-class>com.igou.web.filter.ServerInitFilter</filter-class><init-param><param-name>charSet</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>log4jPropertiesPath</param-name><param-value>/WEB-INF/classes/log4j.properties</param-value></init-param><init-param><param-name>logFilePath</param-name><param-value>/WEB-INF/logs</param-value></init-param></filter><filter-mapping><filter-name>initFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
?
我的配置文件路径都是根据项目的相对路径来获取绝对路径,如果想直接设置绝对路径,则可以修改ServerInitFilter类中的处理文件路径的那部分代码。具体修改内容根据情况而定。
?
具体log4j的配置参数详解可以参考 http://eryk.iteye.com/blog/692181
?