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