log4j配置根据日志级别记录记录日志,以及动态设置日志文件位置

 日志根据级别,分别建立各自级别的文件,低级日志文件包含高级别的日志信息。

设置日志文件位置为项目的/WEB-INF/logs目录下

把log4j.properties文件放到class目录下

内容如下

 
log4j.rootLogger=debug, stdout, info,debug,warn,error
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %F:%L - %m%n
log4j.appender.stdout.encoding=GBK

log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}]  [ Class = %C | Method = %M | Line = %L ] | %m |%n
log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold=INFO
log4j.appender.info.append=true
log4j.appender.info.Encoding=UTF-8
log4j.appender.info.File=info.log

log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}]  [ Class = %C | Method = %M | Line = %L ] | %m |%n
log4j.appender.debug.datePattern='.'yyyy-MM-dd
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.append=true
log4j.appender.debug.Encoding=UTF-8
log4j.appender.debug.File=debug.log

log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}]  [ Class = %C | Method = %M | Line = %L ] | %m |%n
log4j.appender.warn.datePattern='.'yyyy-MM-dd
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.append=true
log4j.appender.warn.Encoding=UTF-8
log4j.appender.warn.File=warn.log

log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}]  [ Class = %C | Method = %M | Line = %L ] | %m |%n
log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold=ERROR
log4j.appender.error.append=true
log4j.appender.error.Encoding=UTF-8
log4j.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";
	@Override
	public void destroy() {
	}

	@Override
	public 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);
	}

	@Override
	public 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值