#眉標=Maven2、GWT、Log #大標=從架構師的觀點學開發(3) #副標=日誌非萬能,但沒有日誌的開發萬萬不能! #作者=文/圖 盧建州 ============= 設定1:pom.xml ...以上省略... 2.5.3 1.2.14 com.google.code.gwt-log gwt-log ${gwt.log.version} log4j log4j ${log4j.version} ...以下省略... ================ ============= 設定2:DemoApp.gwt.xml ...以上省略... ...以下省略... ================ ============= 設定3:web.xml gwt-log-remote-logger-servlet com.allen_sauer.gwt.log.server .RemoteLoggerServiceImpl gwt-log-remote-logger-servlet /demo.gwt.DemoApp/gwt-log ================ ============= 設定4:log4j.properties log4j.rootCategory=ERROR, stdout, fileout # Stdout Logger log4j.appender.stdout= org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout= org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %d{ISO8601} [%-5p][%c{1}] %m%n # Fileout Logger log4j.appender.fileout= org.apache.log4j.DailyRollingFileAppender log4j.appender.fileout.layout= org.apache.log4j.PatternLayout log4j.appender.fileout.layout.ConversionPattern= %d{ISO8601} [%-5p][%c{1}] %m%n log4j.appender.fileout.DatePattern= .yyyy-MM-dd log4j.appender.fileout.File= trace.log ================ ============= 程式1:Debug與Info應用時機 01 public class LoginManager { 02 public User login(String name, String pwd) 03 throws ManagerException{ 04 ...中間省略... 05 try{ 06 //取得使用者 07 user = dao.retrieveUser(name); 08 Log.debug("Retrieve User:"+user); 09 //驗證密碼 10 if(!user.getPassword().equals(pwd)) 11 throw new ManagerException( 12 "User Password incorrect!!!"); 13 Log.info( 14 "User["+ 15 user.getName()+ 16 "] Login Success~~"); 17 }catch(DaoException e){ 18 Log.info( 19 "Retrieve User Error:"+ 20 e.getMessage()); 21 throw new ManagerException(e); 22 } 23 return user; 24 } 25 } ================ ============= 程式2:Warn與Fatal應用時機 01 public class UserDao { 02 ...中間省略... 03 public User retrieveUser(String name) 04 throws DaoException{ 05 ...中間省略... 06 try{ 07 //...處理某些資料作業... 08 if(!connectStatus) 09 throw new DaoException( 10 "DataSource Connect Failure"); 11 }catch(Exception e){ 12 Log.warn(e.getMessage()); 13 try{ 14 dataSourceReConnect(); 15 Log.info( 16 "DataSource ReConnect Success!!"); 17 retrieveUser(name); 18 }catch(RuntimeException re){ 19 Log.fatal( 20 "System Fatal:"+e.getMessage()); 21 throw re; 22 } 23 } 24 ...中間省略... 25 } 26 27 private void dataSourceReConnect(){ 28 //模擬丟出RuntimeException 29 if(demoFatalFlag) 30 throw 31 new DataSourceFailureException( 32 "DataBase Server Failure~~"); 33 else 34 connectStatus = true; 25 } 36 } ================ ============= 程式3:Error應用時機 01 public class UserDao { 02 ...中間省略... 03 public User retrieveUser(String name) 04 throws DaoException{ 05 ...中間省略... 06 try{ 07 int[] datas = {0,1,2}; 08 int data; 09 if(demoErrorFlag) 10 data = datas[3]; //錯誤索引值 11 }catch(RuntimeException re){ 12 Log.error( 13 "get datas["+ 14 re.getMessage()+ 15 "] fail!!"); 16 throw new DaoException(re); 17 } 18 ...中間省略... 19 } 20 ...中間省略... 21 } ================ ===<反灰>============= ----Log1:testHappyPath---- [DEBUG] --Operate:Login Button clicked-- [DEBUG] --Method Execute:service.isValidLogin-- [DEBUG] --Method Execute:manager.login-- [DEBUG] --Method Execute:dao.retrieveUser-- [DEBUG] Retrieve User:demo.gwt.client.model.User [INFO] User[Name] Login Success~~ ----Log2:testPasswordIncorrect---- ...中間省略... [INFO] login fail:User Password incorrect!!! ----Log3:testDataNotFound---- ...中間省略... [INFO] Retrieve User Error: UserName= data not found!! [INFO] login fail: DaoException: UserName= data not found!! ----Log4:testThrowWarn---- ...中間省略... [WARN] DataSource Connect Failure [DEBUG] --Method Execute:dataSourceReConnect-- [INFO] DataSource ReConnect Success!! [DEBUG] --Method Execute:userDao.retrieveUser-- ...中間省略... ----Log5:testThrowError---- [ERROR] get datas[3] fail!! [INFO] Retrieve User Error: java.lang.ArrayIndexOutOfBoundsException: 3 ...中間省略... ----Log6:testThrowFatal---- [WARN] DataSource Connect Failure [DEBUG] --Method Execute:dataSourceReConnect-- [FATAL] System Fatal:DataSource Connect Failure ================