教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

如何管理日志文件?【Java面試】

更新時(shí)間:2020年10月20日16時(shí)05分 來源:傳智播客 瀏覽次數(shù):

(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注解

Java日志管理

(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)課程 

0 分享到:
和我們?cè)诰€交談!