




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第5章 日志及異常處理我們學(xué)習(xí)過Java異常處理和JSP的相關(guān)課程。本章,我們將對Web應(yīng)用程序中得異常集中處理。對于情況嚴重的系統(tǒng)異常我們需要將其寫入日志文件,對于用于操作不規(guī)范的異常我們應(yīng)該給出客戶友好的提示信息。在本章中我們將講解如何使用lor4j框架來實現(xiàn)日志文件的記錄,以及如何設(shè)計web應(yīng)用程序的結(jié)構(gòu)來實現(xiàn)相應(yīng)異常的處理。5.1 日志概述5.1.1 日志簡介軟件的運行過程離不開日志。日志的主要作用是記錄一些重要的操作信息,比如應(yīng)用權(quán)限的修改、程序運行的系統(tǒng)異常、導(dǎo)致致命錯誤的異常,日志文件記錄的信息一般包括錯誤類型、時間、錯誤點。日志文件能夠幫助用戶提前發(fā)現(xiàn)和避免災(zāi)難,并且找到系統(tǒng)發(fā)
2、生的根本原因。位程序的升級、維護提供有力保障。比如當你開發(fā)完一個項目、并交互給客戶使用后發(fā)現(xiàn)在客戶的環(huán)境中不能運行。由于是以window服務(wù)的防是啟動的web服務(wù)器,所有不能使用控制臺的方式查看異常信息,這時將給維護人員或?qū)嵤┤藛T將無從下手。但如果將系統(tǒng)的異常信息記錄到日志文件中,維護人員或?qū)嵤┤藛T就可以根據(jù)日志文件中記錄的運行信息解決問題。也就是說在我們開發(fā)的系統(tǒng)中需要將運行的一些信息、狀態(tài)、過程使用文件流的方式將其寫在硬盤的某一個文件或多個文件中,這就是我們所說的日志記錄。5.1.2 log4j簡介log4j是Apache的一個開放源代碼項目,log4j框架是用Java語言編寫的標準日志記
3、錄框架。作為Jakarta項目的一部分,它在Apache軟件許可證(Apache Software License)下分發(fā),以速度和靈活性為中心概念:log4j環(huán)境是完全可配置的,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應(yīng)用的代碼。此外,通過Log4j其他語言接口,您可以在C、C+、.Net、PL/SQL程序
4、中使用Log4j,其語法和用法與在Java程序中一樣,使得多語言分布式系統(tǒng)得到一個統(tǒng)一一致的日志組件模塊。而且,通過使用各種第三方擴展,您可以很方便地將Log4j集成到J2EE、JINI甚至是SNMP應(yīng)用中。log4j的好處在于:l 通過修改配置文件,就可以決定log信息的目的地控制臺、文件、GUI組件、甚至是套接口服務(wù)器、NT的事件記錄器、UNIX Syslog守護進程等。l 通過修改配置文件,可以定義每一條日志信息的級別,從而控制是否輸出。在系統(tǒng)開發(fā)階段可以打印詳細的log信息以跟蹤系統(tǒng)運行情況,而在系統(tǒng)穩(wěn)定后可以關(guān)閉log輸出,從而在能跟蹤系統(tǒng)運行情況的同時,又減少了垃圾代碼(Syste
5、m.out.println(.)等)。l 使用log4j,需要整個系統(tǒng)有一個統(tǒng)一的log機制,有利于系統(tǒng)的規(guī)劃。5.2 log4j的使用log4j是apache提供的開源的第三方框剪,也就是在在j2ee開發(fā)包中并沒有對log4j的支持,當我們需要使用log4j時必須添加相應(yīng)的jar包。根據(jù)前面對于log4j的介紹我們知道它是通過配置文件來設(shè)置輸入的內(nèi)容、格式、目標,所以我們也必須掌握log4j配置文件的編寫。最后還需在代碼中添加log4j的調(diào)用。由此可知log4j日志系統(tǒng)的使用步驟有:添加log4j支持、配置log4j配置文件、在java代碼中調(diào)用log4j記錄日志。5.2.1 添加log4j
6、首先需要獲取log4j的jar包,可以在apache的官方網(wǎng)站中下載、其下載頁面路徑是/,該頁面中包含log4j的所有版本下載,如:1.2、1.3、2.0。下載后將其保存在指定目錄中。然后就可以將log4j的jar包添加到web應(yīng)用程序中。選擇web應(yīng)用程序項目點擊右鍵à【Properties】à【Java Build Path】出現(xiàn)如圖5-1所示的界面。圖5-1 添加jar包選擇【Libraries】à【Add External JARs】出現(xiàn)如圖5-2所示的文件選擇對話框。圖5-2 選擇log4j支持包選擇log
7、4j支持包完成添加。5.2.2 創(chuàng)建log4j配置文件log4j配置文件必須保存在源代碼跟目錄中、及src下,并且文件名是perties(也可以使用log4j.xml文件配置)。選擇src目錄點擊右鍵,選擇【New】à【File】選項,彈出“新建文件”對話框,輸入文件名“perties”,點擊“完成”按鈕,創(chuàng)建工作結(jié)束,如圖5-3所示。圖5-3 創(chuàng)建配置文件src中的perties配置文件是專門用來配置日志信息的輸出內(nèi)容、格式等。該配置文件的內(nèi)容如下:# 配置到控制臺的日志信息輸出源 #log4j.appender.stdout
8、= org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = %d %m %n# 配置到文件的日志信息輸出源 #log4j.appender.f = org.apache.log4j.FileAppenderlog4j.appender.f.File = i:/test.loglog4j.a
9、ppender.f.layout = org.apache.log4j.PatternLayoutlog4j.appender.f.layout.ConversionPattern = %dyyyy-MM-dd HH:mm:ss %l %m %n# 設(shè)置日志信息的輸出級別和啟動的輸出源 #log4j.rootLogger=warn,stdoutMyEclipse中屬性文件默認的編碼格式為ISO-8859-1,該編碼不支持中文。當屬性文件中包含中文內(nèi)容時將無法保存,此時可以修改文件的編碼格式,選擇菜單【W(wǎng)indow】à【Preferences】à【Genernal】à
10、;【Content Types】出現(xiàn)如圖5-4所示的文檔格式設(shè)置界面。圖5-4 修改編碼格式選擇圖5-4中的ContentTypes中的【Text】à【Java Properties File】,修改Default encoding的值為“UTF-8”,即將屬性文件的默認編碼格式修改為“UTF-8”字符集。如圖5-5所示。圖5-5 修改編碼格式點擊【Update】à【OK】完成編碼格式修改。在perties文件中所配置的內(nèi)容包含如下幾點:1、輸出源配置輸出源配置是指將日志信息以指定格式輸出到指定的目標,一般目標分為兩種、即控制臺和文件。如果輸出目標類是時控
11、制臺則使用org.apache.log4j.ConsoleAppder類實現(xiàn)輸出管理、目標屬性為System.out(系統(tǒng)標準輸出流);如果輸出目標是日志文件則使用org.apache. log4j.FileAppender類實現(xiàn)輸出管理、目標屬性File登錄日志文件路徑和文件名。當然日志文件輸出目標除了控制臺、文件外還有HTML頁面等形式。2、輸出源布局配置輸出源都需要使用org.apache.log4j.PatternLayout類實現(xiàn)輸出日志內(nèi)容格式和布局管理,在配置文件中通過log4j.appender.f.layout.ConversionPattern配置PatternLayout
12、類的日志信息格式。%d表示在日志信息中出當前系統(tǒng)時間、時間的格式通過后面的一個日期格式的字符串表達式控制(字符串表達式的格式和SimpleDateFormat)相同;%l表示在日志信息中輸出事件發(fā)生的文字,包括雷鳴、發(fā)生的線程、以及代碼中的行數(shù)。例如:輸出日志信息為:com.sanlian.javaWeb.ch5.Test.main(Test.java:16)說明日志事件發(fā)生在Test類中的main線程中,在代碼中的行數(shù)為第16行;%p表示輸出日志信息的級別;%m用來輸出調(diào)用log4j代碼中的指定信息;%n用于輸出一個回車換行符。3、優(yōu)先級配置在log4j中的日志信息是有優(yōu)先級別的,通過log
13、4j.rootLogger配置。在log4j中的優(yōu)先級有:off、fatal、error、warn、info、debug、all或者您定義的級別。log4j建議只使用四個級別,優(yōu)先級從高到低分別是error、warn、info、debug。通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。假如在一個級別為q的Logger中發(fā)生一個級別為p的日志請求,如果p>=q,那么請求將被啟用。比如在配置文件定義的輸出級別是info,則應(yīng)用程序中所有debug級別的日志信息將不被打印出來。因為debug的優(yōu)先級別小于info,所以不會輸出。4、啟動輸出源在配置文件中配置的輸出目標不
14、會都起作用,只是使用到的輸出源才會起效,這需要在配置優(yōu)先級的log4j.rootLogger后添加相應(yīng)的輸出源,如配置文件中的:log4j.rootLogger=warn,stdout表示在設(shè)置輸出級別為warn的同時啟動stdout輸出源,及日志信息將會輸出到控制臺,但是不會輸出到e盤的test.log文件中。當然在配置文件中也可以啟動多個輸出源,如:log4j.rootLogger=warn,stdout,f表示將日志信息同時輸出在控制臺和e:/test.log文件中。5、注釋在屬性文件中(即后綴名為.properties的文件)使用“#”編寫注釋。5.2.3 使用log4j輸出日志當完成
15、支持添加和配置文件添加之后就可以在程序中使用log4j了。在例5-1中我們通過測試類來實現(xiàn)不同級別的日志信息輸出。例5-1:記錄日志信息package com.sanlian.javaWebAd.ch5;import org.apache.log4j.Logger;public class Test public static void main(String args) /獲得日志記錄器,這個記錄器將負責控制日志信息Logger log = Logger.getLogger(Test.class);/調(diào)用log對象的相應(yīng)方法輸出不同級別的日志信息/輸出fatal級別的日志信息log.fata
16、l("-fatal-");/輸出error級別的日志信息log.error("-error-");/輸出warn級別的日志信息log.warn("-warn-");/輸出info級別的日志信息("-info-");/輸出debug級別的日志信息("-debug-");在上例中,我們使用日志記錄器的相應(yīng)方法輸出了每種級別的日志信息。其輸出內(nèi)容如圖5-6所示。圖5-6 log4j輸出結(jié)果因為在配置文件中設(shè)置了輸出級別為warn,所以比warn級別低的info、debu
17、g信息沒有被輸出。又因為沒有在配置文件中啟動文件輸出源,所示在i盤中不能找到test.log文件和日志信息。如果修改配置文件的級別和輸出源如下:log4j.rootLogger=debug,stdout,f運行時將看到空臺的內(nèi)容如圖5-7所示。圖5-7 輸出所有級別的日志信息在i盤中生成的test.log內(nèi)容如圖5-8所示。圖5-8 日志文件對比5-7和5-8我們可以看出在日志文件中記錄的每個日志信息所發(fā)生的位置,這是因為我們在文件輸出源的布局方式中使用%l的緣故。5.3 web應(yīng)用程序架構(gòu)設(shè)計在web應(yīng)用程序中有很多的異常,如果不進行相應(yīng)的處理在頁面將不能得到友好的提示信息,并且也不能為維護
18、人員提供技術(shù)保障。在web應(yīng)用程序中的異常通常分為兩種類型,即系統(tǒng)異常及業(yè)務(wù)異常。系統(tǒng)異常通常需要記錄到日志文件中,方便維護人員解決問題;業(yè)務(wù)異常需要返回給客戶端作出友好的提示。結(jié)合MVC設(shè)計模式和log4j日志系統(tǒng)可以對系統(tǒng)進行如圖5-9所示的架構(gòu),以便將系統(tǒng)異常記錄日志、將業(yè)務(wù)異常提示給客戶端。圖5-9 web應(yīng)用程序架構(gòu)圖圖5-9中的黑色實體線條表示請求走向和模塊調(diào)用走向。當請求進入web應(yīng)用程序是首先都必須經(jīng)過BaseServlet,然后才是執(zhí)行相應(yīng)的控制處理servlet,通過servlet調(diào)用業(yè)務(wù)方法,業(yè)務(wù)方法調(diào)用DAO訪問數(shù)據(jù)庫。圖5-9中的紅色虛線表示異常處理的流程。在程序中異
19、常可能會在每一個階段發(fā)生,但是所有的異常都向外拋出,一直拋到BaseServlet集中處理。為了能夠在BaseServlet中方便集中處理異常,我們在程序中創(chuàng)建兩個自定義異常類,分別是BizException、SysException。其實現(xiàn)代碼如下:BizSysException類package com.sanlian.javaWebAd.ch5.util;/* * 自定義業(yè)務(wù)異常 */public class BizException extends RuntimeException public BizException(String message)super(message);Sys
20、Exception類package com.sanlian.javaWebAd.ch5.util;/* * 自定義系統(tǒng)異常 */public class SysException extends RuntimeException public SysException(String message)super(message);BizException、SysException通過繼承RuntimeException可以降低代碼中異常手動拋出的痛苦,因為運行時異常不需要在方法中使用trycatch處理、也不需要在方法手使用throws顯示的聲明。在BaseServlet中通過判斷異常的類型來實
21、現(xiàn)不同的處理,其實現(xiàn)代碼如下:BaseServlet類package com.sanlian.javaWebAd.ch5.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;im
22、port com.sanlian.javaWebAd.ch5.util.BizException;public class BaseServlet extends HttpServlet Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException trysuper.service(request, response);catch(Exception e)/判斷異常的內(nèi)容if(e instanceof Bi
23、zException)/自定義異常,將異常信息保存到request中request.setAttribute("errorMessage", e.getMessage();elseString message = "系統(tǒng)正在升級維護,請于管理員聯(lián)系!"request.setAttribute("errorMessage",message);/記錄日志 log4jLogger log = Logger.getLogger(BaseServlet.class);log.warn(e.getMessage();/跳轉(zhuǎn)到錯誤頁面String
24、url = "/common/error.jsp"request.getRequestDispatcher(url).forward(request, response);在該BaseServlet中通過判斷異常類型進行操作。如果是業(yè)務(wù)類型則直接將業(yè)務(wù)信息保存在request中,并跳轉(zhuǎn)錯誤頁面顯示業(yè)務(wù)信息;如果是系統(tǒng)異常則將異常信息記錄到日志文件中,并保存一個友好的提示信息在request中,并跳轉(zhuǎn)到錯誤頁面提示。普通的控制Servlet通過繼承至BaseServlet來實現(xiàn)異常的總處理。錯誤頁面的實現(xiàn)代碼如下所示:error.jsp<% page language=
25、"java" pageEncoding="UTF-8"%><html><head> <title>錯誤信息</title></head> <body> $requestScope.errorMessage </body></html>如例5-2通過該架構(gòu)完成用戶登錄操作。例5-2:用戶登錄通過如上的系統(tǒng)架構(gòu)可知登錄功能的流程如圖5-10所示。圖5-10 登錄流程圖數(shù)據(jù)庫名為DB,其中有一表個內(nèi)容如下:create table user_info ( us
26、er_id int identity(1,1) primary key, user_no varchar(15) not null, user_account varchar(30) not null, user_pass varchar(30) not null, user_name varchar(20) not null, user_pid varchar(18) not null, user_sex bit default(1) not null, user_birthday datetime not null, user_address varchar(100) null, user
27、_email varchar(50) null)創(chuàng)建和表相對應(yīng)的實體類UserInfo。1、DataUtil類DataUtil用于創(chuàng)建數(shù)據(jù)庫連接對象和關(guān)閉數(shù)據(jù)庫連接對象,實現(xiàn)代碼如下:package com.sanlian.javaWebAd.ch5.pers;import java.sql.Statement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;/* * 數(shù)據(jù)功能類 * 得到數(shù)據(jù)庫連接、關(guān)閉數(shù)據(jù)庫連接 */
28、public class DataUtil /* * 得到數(shù)據(jù)庫連接對象 */public static Connection getConn() throws ExceptionConnection conn = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");String url = "jdbc:sqlserver:/localhost:1433;databaseName=DB"conn = DriverManager.getConnection(url,"
29、;sa","123456");return conn;/* * 關(guān)閉查詢 * param rs 結(jié)果集 * param st 上下文 * param conn 連接 */public static void closeConn(ResultSet rs,Statement st,Connection conn)try rs.close(); catch (Exception e) try st.close(); catch (Exception e) try conn.close(); catch (Exception e) /* * 關(guān)閉增、刪、該 * para
30、m st 上下文 * param conn 連接 */public static void closeConn(Statement st,Connection conn)try st.close(); catch (Exception e) try conn.close(); catch (Exception e) 2、UserDAO類該類稱為數(shù)據(jù)訪問類。在web應(yīng)用程序中將所有的數(shù)據(jù)訪問類統(tǒng)稱為數(shù)據(jù)訪問層,主要用于對數(shù)據(jù)的數(shù)據(jù)進行訪問,執(zhí)行增、刪、改、查sql語句。UserDAO類的實現(xiàn)代碼如下所示:package com.sanlian.javaWebAd.ch5.pers.dao;imp
31、ort java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import com.sanlian.javaWebAd.ch5.entity.UserInfo;import com.sanlian.javaWebAd.ch5.pers.DataUtil;import com.sanlian.javaWebAd.ch5.util.SysException;public class UserDAO public UserInfo queryByAccount(String account)Us
32、erInfo user = null;/定義數(shù)據(jù)庫訪問對象Connection conn = null;PreparedStatement q = null;ResultSet rs = null;try conn = DataUtil.getConn(); /得到連接/創(chuàng)建sql語句預(yù)編譯對象String sql = "select * from user_info where user_account=?"q = conn.prepareStatement(sql);/設(shè)置參數(shù)q.setString(1, account);/執(zhí)行rs = q.executeQuery(
33、);if (rs.next() user = new UserInfo();user.setUserAccount(rs.getString("user_account");user.setUserPass(rs.getString("user_pass");user.setUserName(rs.getString("user_name"); catch (Exception e) /將系統(tǒng)異常轉(zhuǎn)換為自定義系統(tǒng)異常throw new SysException(e.getMessage();finallyDataUtil.closeC
34、onn(rs, q, conn);return user;3、UserBiz類用戶信息業(yè)務(wù)類。在web應(yīng)用程序中所有的業(yè)務(wù)類組成了業(yè)務(wù)邏輯成,主要用于完成業(yè)務(wù)邏輯處理。比如登錄判斷,訂單處理等。UserBiz類的實現(xiàn)代碼如下:package com.sanlian.javaWebA;import com.sanlian.javaWebAd.ch5.entity.UserInfo;import com.sanlian.javaWebAd.ch5.pers.dao.UserDAO;import com.sanlian.javaWebAd.ch5.util.BizException
35、;public class UserBiz private UserDAO udao = new UserDAO();/* * 登錄業(yè)務(wù)方法 * param account 帳號 * param pwd 密碼 * return */public UserInfo login(String account,String pwd)UserInfo emp = null;UserInfo temp = this.udao.queryByAccount(account);if(temp != null)if(pwd!=null && pwd.equals(temp.getUserPas
36、s()/登錄成功emp = temp;elsethrow new BizException("密碼錯誤");elsethrow new BizException("賬號錯誤");return emp;在登錄的業(yè)務(wù)方法中,根據(jù)客戶端輸入的帳號、密碼進行驗證,并使用業(yè)務(wù)異常的方式將業(yè)務(wù)信息返回到上一層(即控制層、Servlet中)。4、LoginServletpackage com.sanlian.javaWebAd.ch5.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sanlian.javaWebA.UserBiz;import com.sanlian.javaWebAd.ch5.entity.UserInfo;public class LoginSer
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上半年安徽省蕪湖無為縣赫店鎮(zhèn)招考15人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省滁州市來安縣政府購買崗招聘15人易考易錯模擬試題(共500題)試卷后附參考答案
- 2024年血液透析器項目資金申請報告代可行性研究報告
- 2025年上半年安徽池州金橋投資集團限公司招聘25人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽宿州蕭縣交通投資限責任公司子公司招聘17人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波市人才服務(wù)中心招考易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年寧波衛(wèi)生職業(yè)技術(shù)學(xué)院招考高層次人才教師易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年Υ射線立體定向放射項目合作計劃書
- 2025年加厚漆膜改性聚酯漆包銅扁線項目可行性研究報告
- 2025年仿古藝術(shù)折疊門項目可行性研究報告
- GB/T 8897.1-2003原電池第1部分:總則
- 學(xué)雷鋒精神學(xué)習(xí)雷鋒日主題班會課件
- 劍橋少兒英語第一冊-Unit5-our-pets課件
- 《馬克思主義政治經(jīng)濟學(xué)概論》課程教學(xué)大綱
- 倉庫管理基礎(chǔ)知識培訓(xùn)模板課件
- 孤獨癥康復(fù)教育人員上崗培訓(xùn)練習(xí)題庫及答案
- 環(huán)境心理學(xué)課件
- 《質(zhì)量保證體系》情況說明
- 親人意外逝世的訃告微信群通知五篇-正式的去世訃告模板
- 中電朝陽250兆瓦智慧風(fēng)儲一體化風(fēng)電項目環(huán)評報告書
- 做一個幸福教師
評論
0/150
提交評論