Ⅰ 很多java程序中都會專門寫一個日誌工廠是為什麼 另外定義的這類日誌介面是為了什麼
方便維護寫日誌的級別,以及文件備份……等等一系列有段日誌的操作
Ⅱ java日誌的filter
Filter可以視作是servlet的加強版,主要用作對用戶的請求進行預處理,或者對返回給客戶端的結果進行再次加工,是一個典型的鏈式處理模式。本篇簡單介紹filter的基本使用方法,主要涉及以下內容:
Filter的背景知識
使用Filter的流程
Filter的生命周期
一個完整的實例
一、Filter的簡單介紹
Filter在英文中是過濾器的意思,當然在此處的使用也是完美的切合了它的意思,我們使用filter的主要目的就是完成一個過濾的作用。可以在一個請求到達servlet之前,將其截取進行邏輯判斷,然後決定是否放行到請求的servlet。也可以在一個response到達客戶端之前,截取結果進行邏輯判斷,然後決定是否允許返回給客戶端。所以filter有如下幾個種類:
用戶授權的filter:filter負責判斷用戶是否有許可權請求該頁面,給予過濾判斷
日誌filter:截取某個用戶在本網站上的所有請求,記錄軌跡
負責解碼的filter:規定處理本次請求的解碼方式
最後需要注意的是,一個filter過濾器可以加在多個servlet控制器上,當然多個filter過濾器也是可以加在一個servlet控制器上的。由此也是可以看出來,我們使用filter往往是對一些公共的操作進行處理,例如:判斷用戶許可權,解碼本次請求等,還比如,我們的web應用中某些頁面是需要用戶登錄後才能訪問的,以往我們都是在每個servlet頁面加上判斷控制,導致代碼冗餘,有了filter,我們可以定義一個實現了filter的過濾器,讓需要判斷是否登錄的頁面都加上這么一個過濾器,可以大大降低代碼的冗餘程度。
二、Filter的使用流程
在Java中如果想要自定義一個filter過濾器的話,需要繼承Javax.servlet.Filter介面,這個介面中只有三個方法:
其中init和destroy方法是有默認實現的,也就是我們不是必須重寫這兩個方法,但是doFilter 這個方法是一個核心的方法,是我們必須要實現的。首先我們看init方法的作用,這個方法是用來初始化filter實例的,也就是當用戶請求了某個攔截器而此攔截器又匹配了某個過濾器,此時web容器就會定位到該過濾器然後創建該filter類的實例對象並調用此實例的init方法,完成初始化工作。對於destroy方法毋庸置疑就是在過濾器執行結束的時候調用,主要完成對一些資源的釋放。下面主要看dofilter這個方法。
doFilter方法是filter介面中的核心方法,一旦創建完該過濾器的實例之後,會執行dofilter方法,所有的過濾邏輯都是在此方法中進行的。主要有三個參數,第一個參數是一個ServletRequest對象,HttpServletRequest繼承於此介面,當用戶請求某個攔截器的時候,檢測到此請求存在過濾器,於是會封裝好本次請求的相關數據,傳遞給dofilter的ServletRequest參數,ServletResponse參數的來源和ServletRequest是一樣的,都是由客戶端封裝過來的。至於第三個參數,這是一個FilterChain處理鏈,詳細的介紹等說明了web.xml中配置filter之後。
第一步如上,創建一個繼承自filter介面的類,並實現其中的三個方法。第二步是在web.xml中配置該類用於過濾哪些攔截器。web.xml代碼如下:
如上述的代碼,我們需要兩個操作,首先是定義一個filter,指定了該filter的name和相對應的過濾器類。然後我們可以通過filter-mapping映射過濾器和URL,此處使用了兩個映射,對該過濾器指定了對路徑名為/a和/b的請求進行攔截。當然這個url-pattern元素的值可以有以下三種形式,完全匹配(/a/b等),目錄匹配(/* 、 /abc/等),擴展名(.a,*.b等)。
了解了配置filter的主要操作之後,我們回去看過濾器類,我們說init方法是在首次創建filter實例的時候,用於執行初始化操作的,其中有個參數FilterConfig ,這是當前filter的配置信息,其中方法如下:
其實在創建filter實例的時候,web容器會將此實例對應在web.xml中的配置信息讀取並封裝成一個FilterConfig 對象傳遞給init方法,getFilterName方法就是我們在web.xml中配置的filter-name,getServletContext會獲取當前servlet的上下文,當我們在定義filter的時候使用<init-param>來定義一些初始化參數的時候,就可以使用此方法來獲取這些初始化參數。getInitParameterNames方法用於獲取所有初始化參數的枚舉集合。這樣我們在init方法中就可以獲取這些配置參數,初始化filter實例。
上面我們只定義了一個filter,如果我們對於一次請求需要執行多個filter,進行過濾操作的話,web容器會在你請求某個URL的時候,在web.xml中找到所有匹配的filter,按照注冊的順序以FilterChain 鏈的形式傳遞到方法doFilter的第三個參數中,而這個filterChain中只有一個方法:
如果我們在 void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 方法中調用var3.doFilter(var1,var2),就代表此filter實例結束,則web伺服器會檢查FilterChain對象中是否還有filter對象(因為這是一個鏈,filter的數量是大於等於一的),如果沒有就會放行,直接調用目標地址,如果還有filter對象,就會轉而執行下一個filter。正是由於這樣的機制,我們才可以對於一個URL請求添加多個filter過濾器。
三、一個簡單的實例
下面通過一個簡單的實例直觀的感受下filter過濾器的作用:
我們首先訪問set.jsp頁面設置本次會話的session值,然後修改瀏覽器地址欄訪問index.jsp頁面
上述的demo只是為了簡單的演示,其實使用filter可以完成大大的降低我們的代碼的冗餘程度。這個例子是為了演示,所以很簡單。
四、Filter 的生命周期
當用戶請求某個頁面時候,會到web.xml中匹配是否存在能夠匹配上此次請求的filter,如果有封裝它的配置信息,FilterChain鏈。然後調用init方法,完成初始化,接著調用dofilter方法,處理核心邏輯,當此實例被銷毀的時候,會調用destroy方法。
Ⅲ java中log4j和slf4j什麼關系我要列印日誌用哪個好呢
slf4j是日誌的介面(只定義了一些方法而沒有去實現),和commons-logging一樣。而log4j是具體的實現(即怎麼來列印日誌等),和logback是一樣的。
Ⅳ java日誌介面怎麼寫
Log4J?
配置log4j.properties文件
代碼內使用Logger就可以
~~~~~~~~~~~~
Ⅳ 請教一個簡單的java日誌怎樣寫
關於復java日誌,下面以Log4j為例子制說明(供參考)。
1、導包(Log4j所依賴的jar包)
2、配置屬性文件。如下:
Ⅵ 在java中如何使用記錄日誌API
import java.util.logging.*; Ⅶ java列印日誌的幾種方式 在Java 中實現記錄日誌的方式有很多種, 下面給你簡單介紹四種: 最簡單的方式,就是system.println.out(error) ,這樣直接在控制台列印消息了。 Java.util.logging ; 在JDK 1.4 版本之後,提供了日誌的API ,可以往文件中寫日誌了。 log4j , 最強大的記錄日誌的方式。 可以通過配置 .properties 或是 .xml 的文件, 配置日誌的目的地,格式等等。 commons-logging, 最綜合和常見的日誌記錄方式, 經常是和log4j 結合起來使用。 Ⅷ java 日誌介面怎麼寫 可以考慮用jms把日誌單獨發送到一個消息系統,消息系統採用apache activeMQ來實現,web系統只管往外發送日誌的jms,消息系統負責日誌的寫,每次從日誌隊列中獲取日誌批量保存到資料庫,日誌表可以每天一張表,免得數據量過大影響插入速度。 Ⅸ 用JAVA定義一個介面用於查詢日誌文件 日誌文件有ID標識,用戶名,日誌內容等屬性; 怎麼去實現
首先定義javabean,包括屬性ID標識,用戶名,日誌內容等屬性。如果使用hibernate就更簡單了。用方法this.getTemplateHibernate.find("from Log");就行了,你也可以用jdbc來獲取。將結果集的信息取出來即可
//刪除數據
@RequestMapping("/delete.do")
publicStringdelete(Studentsstudents){
try{
stuService.delete(students);
}catch(Exceptione){
//直接使用
LoggerUtil.logger.error(e.getMessage());
}
return"redirect:selectAll.do";
}
public class BasicLoggingExample {
public static void main(String args[])
{
Logger logger = Logger.getLogger("BasicLoggingExample");
logger.log(Level.INFO, "Test of logging system");
}
}
getLogger
public static Logger getLogger(String name)為指定子系統查找或創建一個 logger。如果已經創建了具有給定名稱的 logger,則返回該 logger。否則創建一個新的 logger。
如果創建了新的 logger,則根據 LogManager 的配置來其配置日誌級別,並將日誌輸出發送到其父處理程序。日誌配置注冊在 LogManager 全局命名空間內。
參數:
name - logger 的名稱。這應該是一個圓點分隔的名稱,並且通常應該基於子系統的包名或類名(如 java.net 或 javax.swing)。
log
public void log(Level level,String msg)記錄一條不帶參數的消息。
如果當前對於給定的消息級別而言 logger 是啟用的,那麼將給定的消息轉發到所有已注冊的輸出 Handler 對象。
參數:
level - 某個消息級別標識符,例如 SEVERE。
msg - 字元串消息(或消息類別中的鍵)。