(1)问题分析:
考官主要是想对你是否有真实的工作经验进行考核,以及对aop的理解。
(2)核心答案讲解:
场景:记录每个人在项目中的动作。
在Java开发中日志的管理有很多种。我一般会使用过滤器,或者是spring的拦截器进行日志的处理。如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用。然后进行日志记录。使用过滤器的好处是可以自己选择性的对某一些方法进行过滤,记录日志。但是实现起来有点麻烦。
另外一种就是使用Spring的AOP了。这种方式实现起来非常简单,不用修改原来的代码,只要配置一下配置文件就可以了。可是这种方式会拦截下所有的对action的每个操作。使得效率比较低。不过想做详细日志这个方法还是非常好的。
比如在品优购运营商管理中添加AOP增强类,里面用来记录日志
@Component
@Aspect
public class LogAdvice {
@Autowired
private HttpServletRequest request;
@Around("execution(* com.pyg.controller.*.*(..))")
public Object around(ProceedingJoinPoint pjp){
Object obj = null;
try {
//得到当前访问的处理器类的类型
Class clazz = pjp.getTarget().getClass();
//得到访问时间
Date visitTime = new Date();
//得到方法的参数
Object[] args = pjp.getArgs();
//放行方法
obj = pjp.proceed(args);
if(!pjp.getSignature().getName().equals("binder")){
//创建日志对象
SysLog log = new SysLog();
log.setVisitTime(visitTime);
log.setUsername(request.getRemoteUser());
log.setUrl(request.getRequestURI());;
log.setIp(request.getRemoteAddr());
log.setExecutionTime(new Date().getTime()-visitTime.getTime());;
log.setMethod("类名为:"+clazz.getName()+",方法名为:"+pjp.getSignature().getName());
//对象入库
logService.save(log);
}
}catch (Throwable t){
t.printStackTrace();
}
return obj;
}
}
注意:在springmvc中开始AOP注解
(3)问题扩展:
Log4J的使用:
1)日志的输出级别
Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL
2)配置文件说明
#设置日志的输出级别、控制台的数据、文件的输出
#此处级别设置的是DEBUG,是最小级别
log4j.rootLogger=DEBUG, stdout, logfile, database
#控制台的输出控制
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#每行日志的格式
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
\#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#设置文件的输入路径
log4j.appender.logfile.File=d:\\log\\myweb.log
#每个文件的大小 ,为了测试设置的值小
log4j.appender.logfile.MaxFileSize=1KB
#最多产生的文件的索引数
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
# 应用于数据库
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=root
log4j.appender.database.sql=INSERT INTO TABLE_LOG (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
(4)结合项目中使用:
后台管理中每次修改数据的动作都有必要记录,方便追踪数据的变化。
猜你喜欢:
Java中如何解决多线程的同步问题?