(1)問題分析:
考官主要是想對(duì)你是否有真實(shí)的工作經(jīng)驗(yàn)進(jìn)行考核,以及對(duì)aop的理解。
(2)核心答案講解:
場景:記錄每個(gè)人在項(xiàng)目中的動(dòng)作。
在Java開發(fā)中日志的管理有很多種。我一般會(huì)使用過濾器,或者是spring的攔截器進(jìn)行日志的處理。如果是用過濾器比較簡單,只要對(duì)所有的.do提交進(jìn)行攔截,然后獲取action的提交路徑就可以獲取對(duì)每個(gè)方法的調(diào)用。然后進(jìn)行日志記錄。使用過濾器的好處是可以自己選擇性的對(duì)某一些方法進(jìn)行過濾,記錄日志。但是實(shí)現(xiàn)起來有點(diǎn)麻煩。
另外一種就是使用Spring的AOP了。這種方式實(shí)現(xiàn)起來非常簡單,不用修改原來的代碼,只要配置一下配置文件就可以了??墒沁@種方式會(huì)攔截下所有的對(duì)action的每個(gè)操作。使得效率比較低。不過想做詳細(xì)日志這個(gè)方法還是非常好的。
比如在品優(yōu)購運(yùn)營商管理中添加AOP增強(qiáng)類,里面用來記錄日志
@Component
@Aspect
public class LogAdvice {
@Autowired
private HttpServletRequest request;
@Around("execution(* com.pyg.controller.*.*(..))")
public Object around(ProceedingJoinPoint pjp){
Object obj = null;
try {
//得到當(dāng)前訪問的處理器類的類型
Class clazz = pjp.getTarget().getClass();
//得到訪問時(shí)間
Date visitTime = new Date();
//得到方法的參數(shù)
Object[] args = pjp.getArgs();
//放行方法
obj = pjp.proceed(args);
if(!pjp.getSignature().getName().equals("binder")){
//創(chuàng)建日志對(duì)象
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());
//對(duì)象入庫
logService.save(log);
}
}catch (Throwable t){
t.printStackTrace();
}
return obj;
}
}
注意:在springmvc中開始AOP注解
(3)問題擴(kuò)展:
Log4J的使用:
1)日志的輸出級(jí)別
Loggers組件在此系統(tǒng)中被分為五個(gè)級(jí)別:DEBUG、INFO、WARN、ERROR和FATAL。這五個(gè)級(jí)別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL
2)配置文件說明
#設(shè)置日志的輸出級(jí)別、控制臺(tái)的數(shù)據(jù)、文件的輸出
#此處級(jí)別設(shè)置的是DEBUG,是最小級(jí)別
log4j.rootLogger=DEBUG, stdout, logfile, database
#控制臺(tái)的輸出控制
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
\#文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#設(shè)置文件的輸入路徑
log4j.appender.logfile.File=d:\\log\\myweb.log
#每個(gè)文件的大小 ,為了測試設(shè)置的值小
log4j.appender.logfile.MaxFileSize=1KB
#最多產(chǎn)生的文件的索引數(shù)
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
# 應(yīng)用于數(shù)據(jù)庫
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)結(jié)合項(xiàng)目中使用:
后臺(tái)管理中每次修改數(shù)據(jù)的動(dòng)作都有必要記錄,方便追蹤數(shù)據(jù)的變化。
猜你喜歡:
Java中如何解決多線程的同步問題?
單例中懶漢和惡漢模式的區(qū)別
Java JDK下載和安裝教程【超級(jí)詳細(xì)】
傳智播客Java高級(jí)軟件工程師課程
黑馬程序員Java培訓(xùn)課程