利用SpringMVC Log4j commons-logging 构建一个简单的日志记录、分析系统

本日志记录、分析系统或模块基于spring mvc,依赖Log4j和commons-logging,主要实现日志的分类记录,日志文件读取、分析,本文只介绍日志分类记录,主要包含3部分内容:

  • Log4j和commons-logging关系、log4j配置
  • spring mvc
  • spring aop、动态代理

1、Log4j和commons-logging关系、log4j配置

1)Log4j和commons-logging关系
commons-logging可以简单理解为通用的log封装,可以使用自己的简单实现SimpleLog,也可以使用Log4j或其他log组件实现,通常我们在项目中使用commons-logging进行日志记录,便于日志解耦。具体可参考:Spring log4j配置 不同package、日志级别生成不同日志文件

2)Log4j配置

log4j.rootLogger=info,stdout,infoLog,warnLog,errorLog
#
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%t \: %d %p [%c] - %m%n 
#
log4j.appender.infoLog=org.apache.log4j.DailyRollingFileAppender
#log4j.additivity.service=false
log4j.appender.infoLog.Threshold = info
log4j.appender.infoLog.File=${saas_admin.log_dir}/process_
log4j.appender.infoLog.DatePattern=yyyy-MM-dd'.log'
log4j.appender.infoLog.layout=org.apache.log4j.PatternLayout
log4j.appender.infoLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - %m%n
#
log4j.appender.warnLog=org.apache.log4j.DailyRollingFileAppender
#log4j.additivity.service=false
log4j.appender.warnLog.Threshold = warn
log4j.appender.warnLog.File=${saas_admin.log_dir}/warn_
log4j.appender.warnLog.DatePattern=yyyy-MM-dd'.log'
log4j.appender.warnLog.layout=org.apache.log4j.PatternLayout
log4j.appender.warnLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - %m%n

log4j.appender.errorLog=org.apache.log4j.DailyRollingFileAppender
#log4j.additivity.service=false
log4j.appender.errorLog.Threshold = error
log4j.appender.errorLog.File=${saas_admin.log_dir}/error_
log4j.appender.errorLog.DatePattern=yyyy-MM-dd'.log'
log4j.appender.errorLog.layout=org.apache.log4j.PatternLayout
log4j.appender.errorLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - %m%n
  • rootLogger=info,stdout,infoLog,warnLog,errorLog
    日志级别为info, debug等不会输出,info、warn、error等会输出;
    stdout控制台输出;
    infoLog info级别日志输出到infoLog文件;
    warnLog warn级别日志输出到warnLog文件;
    errorLog error级别日志输出到errorLog文件;
    infoLog、warnLog、errorLog的Threshold不能比rootLogger的level[info]低,否则不会输出日志

  • infoLog,用以记录action 方法开始执行、结束执行、执行耗时、执行参数;

  • warnLog,用以记录sql执行时间过长的sql、参数,service执行时间过长的service方法、参数;

  • errorLog,用以记录应用逻辑出错外的throwable、exception和error,比如运行时异常、网络异常、数据库异常等

2、spring mvc

具体不赘述,请大家google、baidu。本案例为典型的spring mvc结构,action调用service,service调用dao。

3、spring aop

1)action,产生infoLog,通过spring mvc自带的HandlerInterceptor来实现
public class LyActionInterceptor implements HandlerInterceptor {
     
	private static final Log LOG = LogFactory.getLog(LyActionInterceptor.class);
	
	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
     
		// TODO Auto-generated method stub
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
     
		LOG.info('xx call finished');
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
     
		LOG.info('xx call start, params: ....')
		return true;
	}
}
2)action 产生errorLog

系统级别异常:

  • 非程序业务逻辑验证异常,如:客户代码重复、客户地址不能为空等验证异常;
  • 主要指:程序不可预见异常、运行时异常、网络异常、操作系统异常等;

假设dao、service方法调用过程产生的异常都可以冒泡到action调用方法,则系统级别异常可以统一在action层面进行记录。

public class LyActionInterceptor implements HandlerInterceptor {
     
	private static final Log LOG = LogFactory.getLog(LyActionInterceptor.class);
	
	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
     
		// 判断 arg3 是否 null, 是否为系统级别异常,并记录日志
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
     
		// 如果在action方法做了try,catch异常处理,则异常不会冒泡到afterCompletion方法
		// 此时需要在try,catch里分析exception是否系统级别异常,并记录日志
	}
}
3)service和dao设置aop,产生warnLog

aop具体如何配置,通过xml声明还是其它途径,本文不赘述,基本原理如下:

  • 方法执行前,记录方法开始执行:calss+method,参数,执行时间戳;
  • 调用主方法
  • 方法执行后,记录方法执行结束,计算执行耗时,耗时过长则记录warnLog,参考如下:
    类似log.warn(‘xx方法, 执行开始时间,耗时:xx秒’)

你可能感兴趣的:(Java,spring,mvc,Log4j,commons-logging,日志记录,分析系统,aop,动态代理)