導航:首頁 > 凈水問答 > log4jfilter過濾器

log4jfilter過濾器

發布時間:2021-12-22 22:52:01

Ⅰ Struts2框架中web.xml中<filter-class>應該引用哪個類

說反了吧?帶ng的是被淘汰的,最新struts2.5.13包里只有不帶ng的核心類

最新的核心類增加了log4j的依賴,優化和增加了一些

packageorg.apache.struts2.dispatcher.filter;

importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
importorg.apache.struts2.RequestUtils;
importorg.apache.struts2.StrutsStatics;
importorg.apache.struts2.dispatcher.Dispatcher;
importorg.apache.struts2.dispatcher.mapper.ActionMapping;
importorg.apache.struts2.dispatcher.ExecuteOperations;
importorg.apache.struts2.dispatcher.InitOperations;
importorg.apache.struts2.dispatcher.PrepareOperations;

importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
importjava.util.List;
importjava.util.regex.Pattern;

/**
*ss.Thisfilterisbettertouse
*whenyoudon',suchasSitemesh.
*/
,Filter{

privatestaticfinalLoggerLOG=LogManager.getLogger(StrutsPrepareAndExecuteFilter.class);

Ⅱ mvc的filter有幾類,分別是什麼

(1) 直接實現Filter,這一類過濾器只有CompositeFilter;
(2) 繼承抽象類GenericFilterBean,該類實現了javax.servlet.Filter,這一類的過濾器只有一個,即DelegatingFilterProxy;
(3) 繼承抽象類OncePerRequestFilter,該類為GenericFilterBean的直接子類,這一類過濾器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 繼承抽象類AbstractRequestLoggingFilter,該類為OncePerRequestFilter的直接子類,這一類過濾器包括CommonsRequestLoggingFilter、和。

Ⅲ 有過濾器的springmvc代碼怎麼用

不過實現的方式有以下幾類:
(1) 直接實現Filter,這一類過濾器只有CompositeFilter;
(2) 繼承抽象類GenericFilterBean,該類實現了javax.servlet.Filter,這一類的過濾器只有一個,即DelegatingFilterProxy;
(3) 繼承抽象類OncePerRequestFilter,該類為GenericFilterBean的直接子類,這一類過濾器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 繼承抽象類AbstractRequestLoggingFilter,該類為OncePerRequestFilter的直接子類,這一類過濾器包括CommonsRequestLoggingFilter、和。
過濾器放在容器結構的什麼位置?
過濾器放在web資源之前,可以在請求抵達它所應用的web資源(可以是一個Servlet、一個Jsp頁面,甚至是一個HTML頁面)之前截獲進入的請求,並且在它返回到客戶之前截獲輸出請求。Filter:用來攔截請求,處於客戶端與被請求資源之間,目的是重用代碼。Filter鏈,在web.xml中哪個先配置,哪個就先調用。在filter中也可以配置一些初始化參數。
Java中的Filter 並不是一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。 主要用於對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行後處理,是個典型的處理鏈。
Filter 有如下幾個種類:
l 用戶授權的Filter: Filter 負責檢查用戶請求,根據請求過濾用戶非法請求。
l 日誌Filter: 詳細記錄某些特殊的用戶請求。
l 負責解碼的Filter: 包括對非標准編碼的請求解碼。
l 能改變XML 內容的XSLTFilter 等。
Filter 有如下幾個用處 :
l 在HttpServletRequest 到達Servlet 之前,攔截客戶的HttpServletRequest 。
l 根據需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數據。
l 在HttpServletResponse 到達客戶端之前,攔截HttpServletResponse 。
l 根據需要檢查HttpServletResponse ,可以修改HttpServletResponse 頭和數據。
創建一個 Filter 只需兩個步驟

Ⅳ log4j和common-log的區別

Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸出地;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細致地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。那麼是不是這樣,我們就可以完全使用log4j,而不需要擴展定製了呢?

1、基本介紹Log4j

Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸出地;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細致地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。

log4j的好處在於:

1) 通過修改配置文件,就可以決定log信息的目的地——控制台、文件、GUI組件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護進程等

2) 通過修改配置文件,可以定義每一條日誌信息的級別,從而控制是否輸出。在系統開發階段可以列印詳細的log信息以跟蹤系統運行情況,而在系統穩定後可以關閉log輸出,從而在能跟蹤系統運行情況的同時,又減少了垃圾代碼(System.out.println(......)等)。

3) 使用log4j,需要整個系統有一個統一的log機制,有利於系統的規劃。

那麼是不是這樣,我們就可以完全使用log4j,而不需要擴展定製了呢?當然不是這樣,因為每個項目的需求不一樣,而且log4j本身也提供了靈活的擴展機制。下面我們說說log4j常用的擴展方式。

2、擴展點Log4j

2.1 自己的日誌系統

每一個項目都想有自己的一套日誌系統,而不受其他項目、jar包的影響。所以日誌系統需要獨立存在,且有相應的自己單獨的配置文件而不受影響。我們先來看看common-logging和log4j的默認工作流程:

common-logging

當我們用Log log = LogFactory.getLog(「loggerName」);取得log時,讓我們看看他是如何工作的?
1)、首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實現類
2)、如果找不到commons-logging.properties文件,則在查找是否已定義系統環境變數org.apache.commons.logging.Log,找到則使用其定義的Log實現類
3)、查看classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日誌實現類
4)、使用JDK自身的日誌實現類(JDK1.4以後才有日誌實現類)
5)、使用commons-logging自己提供的一個簡單的日誌實現類SimpleLog

commons-logging總是能找到一個日誌實現類,並且盡可能找到一個"最合適"的日誌實現類.
.可以不需要配置文件
.自動判斷有沒有Log4j包,有則自動使用之
.最悲觀的情況下也總能保證提供一個日誌實現(SimpleLog)

log4j

當我們用Logger.getLogger(loggerName);取得log時,讓我們看看他是如何工作的?
1)、查找是否已定義系統環境變數log4j.configuration,找到則使用其定義的Log配置文件;否則搜索log4j.xml,如果存在,則執行4)
2)、如果不存在,搜索log4j.properties
3)、如果不存在,則使用程序默認的日誌倉庫
4)、如果存在,注冊配置日誌倉庫
5)、去日誌倉庫中查詢,如果不存在,則new一個

從上面我們可以看到無論是common-logging還是log4j,以及其他的日誌開源系統都會提供一套默認的遍歷規則,去搜索他的log記錄實例。一般情況下,我們都會使用它的默認規則,但是這樣的話,我們就會受制於它,比如如果有人在默認規則中改變了某一個條件。
如果我們不想使用它的默認規則,該怎麼辦?很簡單,在log4j中是通過日誌倉庫來維護一套獨立日誌系統,只要我們直接使用它的日誌倉庫,寫一個我們自己的日誌工廠就可以了。具體如下:

Public final class CustomLogFactory {
//日誌倉庫實例
Static LoggerRepository h = new Hierarchy(new RootLogger(Level.DEBUG));

Static {
//配置文件定製日誌倉庫屬性,這裡面你可以做更多的文章
//來定義自己的配置文件位置等等
new PropertyConfigurator().configure(h, urlConfigFile);
}

public static Logger getLogger(String loggerName) {
return h.getLogger(loggerName);
}
}
這樣你的日誌系統完全獨立了。是不是很容易?

2.2 自己的日誌記錄器

Log4j的logger本身提供八種級別的日誌記錄,如果你想讓你的logger沒有級別概念,或者讓日誌信息支持國際化,那該怎麼辦?

Log4j用於第三方擴展的記錄日誌方法API

public boolean isEnabledFor(Priority level);
public void log(String callerFQCN, Priority level, Object message, Throwable t);擴展示例

1)、沒有級別概念

Public final class CustomLogger {
//log4j日誌記錄器
Logger log4j;

//自己的FQCN
Private static final String FQCN = CustomLogger.class.getName();

//構造方法
Private CustomLogger(String loggerName) {
log4j = CustomLogFactory.getLogger(loggerName);
}

//工廠方法
Public static CustomLogger getLogger(String loggerName) {
Return new CustomLogger(loggerName);
}

Public Boolean isEntryEnabled() {
Return log4j. isEnabledFor(Level.INFO);
}

//程序入口日誌
//你完全可以在message上做些手腳,加上一些自己的特殊的日誌信息
//當然你也可以後面介紹的Appender的時候加
Public void entry(String message, Throwable t) {
Log4j.log(FQCN , Level.INFO, message, t);
}

Public Boolean isExitEnabled() {
Return log4j. isEnabledFor(Level.INFO);
}

//程序結束日誌
Public void exit(String message, Throwable t) {
Log4j.log(FQCN , Level.INFO, message, t);
}
}
2)、支持國際化

主要是在message取得上做點事情。就像上面那個Public void entry(String message, Throwable t);如果你把API改為Public void entry(String messageID, Throwable t);實現改為:

Public void entry(String messageID, Throwable t) {
Log4j.log(FQCN , Level.INFO, getMessage(messageID), t);
}

//取得相應的國際化信息
Private String getMessage(String messageID) {
Return InternalResource.getLogMessage(messageID, Locale.getDefault());
}
2.3 自己的日誌輸出地

Log4j本身提供了大量的默認Appender實現,已經能很好的解決大部分應用,但是有時候我們還是有一些自己的需要,比如只有在輸出到控制台Appender時加一個運行時才能確定的固定前綴。我們可以這么寫:

public final class CustomConsoleAppender extends org.apache.log4j.ConsoleAppender {

@Override
protected void subAppend(LoggingEvent event) {
StringBuffer msgBuf = new StringBuffer();

//固定前綴
msgBuf.append('[');
msgBuf.append(Manager.current ().getName());
msgBuf.append(']');

//根據配置文件中的格式化信息格式化event
msgBuf.append(this.layout.format(event));
this.qw.write(msgBuf.toString());
……
}
} 也就是我們想定製某一種日誌輸出地,直接繼承相應的log4j中的類似的Appender,然後復寫相應的方法即可。最後在配置文件中使用自己定義的Appender類就行了。

2.4 自己的日誌過濾器

Log4j的日誌輸出控制級別比較中有一個缺陷就是只能大於某個級別時才能輸出,沒有小於某個級別時才輸出的控制,當然一般不會用到,如果有類似這樣的需求是不是就做不到了呢?不是的,這時候你可以使用日誌過濾器來實現。比如有這樣一個需求,輸出到控制台的日誌信息,當級別小於WARN時,用 System.out;當大於等於WARN時,用System.err。

過濾器定義如下:

public final class CustomWarnLevelFilter extends org.apache.log4j.spi.Filter {
@Override
public int decide(LoggingEvent event) {
//大於等於WARN的日誌不允許輸出
if(event.getLevel().toInt() >= Level. WARN.toInt()) {
return DENY;
} else {
return ACCEPT;
}
}
}

配置文件中可以這樣配置:

<appender class="com.primeton.ext.common.log.EOSConsoleAppender" name="CONSOLE_OUT">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%p][%C][Line:%L] %m%n"/>
</layout>
<filter class=" CustomWarnLevelFilter "/>
</appender>

<appender class="com.primeton.ext.common.log.EOSConsoleAppender" name="CONSOLE_ERR">
<param name="Target" value="System.err"/>
<param name="Threshold" value="WARN"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%p][%C][Line:%L] %m%n"/>
</layout>
</appender>

<root>
<level value="DEBUG"/>
<appender-ref ref="CONSOLE_OUT"/>
<appender-ref ref="CONSOLE_ERR"/>
</root> 因為log4j設計的靈活性,所以當然也有其他的方式來達到這個目的。

上面簡單介紹了對log4j常用的擴展方式,你還可以擴展像layout、errorhandler等等,這里不再贅述。

3、性能影響因素Log4j

Log4j一直被人所詬病的也就是它的性能問題了,所以在這里簡要的說明一下使用log4j的注意事項:
1)、如果你的日誌實例的名稱不是經常變化,請將它定義為static變數。
2)、如果你的message構造很復雜,那麼在構造之前,請先使用isXXXEnabled()判斷。
3)、配置文件中格式控制如果不需要,盡量不要輸出類名和行號。
4)、根據log4j的級別判斷控制流程,在配置文件中盡可能配置的比較細致。
Logger.info(message)的比較流程:
a. 比較日誌倉庫的threashold
b. 與自身的有效Level(沒有則是父親的)比較
c. 與Appender的threashold比較
d. 詢問Appender的filter
e. Layout格式化
f. 記錄日誌
5)、如果Appender是文件類型,請不要把文件大小設的太小。至少設為10MB(<param name="MaxFileSize" value="10MB"/>)。
6)、如果不是即時調試程序,把你的級別設定為高級別,最好是threshold=INFO之上。
7)、如果不是想即時看到日誌信息,你也可以把Appender的ImmediateFlush 設為false(<param name="ImmediateFlush" value="false"/>)。

Ⅳ 如何配置log4j讓他只顯示我log.debug的內容

有log4j的配置文件嗎?
如果是properties的,不要在聲明rootlogger的時候,指定debug。像這樣:log4j.rootLogger=info,stdout,error

如果是xml配置的話,在聲明控制台輸出的appender裡面指定日誌級別,這邊我舉例:
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss}][%l]:%m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="ERROR"/>
</filter>
</appender>
LOG4J的配置問題,你自己去研究下,這是學東西的機會,建議XML,可擴展性非常好

Ⅵ spring中怎麼實現過濾器和監聽器

1、延遲載入過濾器

Hibernate 允許對關聯對象、屬性進行延遲載入,但是必須保證延遲載入的操作限於同一個 Hibernate Session 范圍之內進行。如果 Service 層返回一個啟用了延遲載入功能的領域對象給 Web 層,當 Web 層訪問到那些需要延遲載入的數據時,由於載入領域對象的 Hibernate Session 已經關閉,這些導致延遲載入數據的訪問異常。

Spring 為此專門提供了一個 OpenSessionInViewFilter 過濾器,它的主要功能是使每個請求過程綁定一個 Hibernate Session,即使最初的事務已經完成了,也可以在 Web 層進行延遲載入的操作。

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>

2、亂碼過濾器

對post亂碼的處理,如下

<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter①Spring編輯過濾器
</filter-class>
<init-param>②編碼方式
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>③強制進行編碼轉換
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>②過濾器的匹配URL
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>

3、請求跟蹤日誌過濾器

程度調試者可以詳細地查看到有哪些請求被調用,請求的參數是什麼,請求是否正確返回等信息,需要將log4j設為debug

org.springframework.web.filter.: 該過濾器將請求的 URI 記錄到 Common 日誌中


4、WebAppRootListener

可以將 Web 應用根目錄添加到系統參數中,對應的屬性名可以通過名為「webAppRootKey」的 Servlet 上下文參數指定,默認為「webapp.root」,配置如下

<context-param>
<param-name>webAppRootKey</param-name>
<param-value>baobaotao.root</param-value>①Web應用根目錄以該屬性名添加到系統參數中
</context-param>

②負責將Web應用根目錄以webAppRootKey上下文參數指定的屬性名添加到系統參數中
<listener>
<listener-class>
org.springframework.web.util.WebAppRootListener
</listener-class>
</listener>

5、Log4jConfigListener監聽器

包括了 WebAppRootListener 的功能,也就是說,Log4jConfigListener 會自動完成將 Web 應用根目錄以 webAppRootKey 上下文參數指定的屬性名添加到系統參數中,在log4j.xml可以直接使用


6、Introspector 緩存清除監聽器

負責處理由 JavaBean Introspector 功能而引起的緩存泄露。IntrospectorCleanupListener 監聽器在 Web 應用關閉的時會負責清除 JavaBean Introspector 的緩存,在 web.xml 中注冊這個監聽器可以保證在 Web 應用關閉的時候釋放與其相關的 ClassLoader 的緩存和類引用。

Ⅶ logback裡面可以寫log4j的配置嗎

Logback和log4j是非常相似的,如果你對log4j很熟悉,那對logback很快就會得心應手。下面列了logback相對於log4j的一些優點:

更快的實現
Logback的內核重寫了,在一些關鍵執行路徑上性能提升10倍以上。而且logback不僅性能提升了,初始化內存載入也更小了。

非常充分的測試
Logback經過了幾年,數不清小時的測試。Logback的測試完全不同級別的。在作者的觀點,這是簡單重要的原因選擇logback而不是log4j。

Logback-classic非常自然實現了SLF4j
Logback-classic實現了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。而且因為logback-classic非常自然地實現了SLF4J,所以切換到log4j或者其他,非常容易,只需要提供成另一個jar包就OK,根本不需要去動那些通過SLF4JAPI實現的代碼。

非常充分的文檔
官方網站有兩百多頁的文檔。

自動重新載入配置文件
當配置文件修改了,Logback-classic能自動重新載入配置文件。掃描過程快且安全,它並不需要另外創建一個掃描線程。這個技術充分保證了應用程序能跑得很歡在JEE環境裡面。

Lilith
Lilith是log事件的觀察者,和log4j的chainsaw類似。而lilith還能處理大數量的log數據

謹慎的模式和非常友好的恢復
在謹慎模式下,多個FileAppender實例跑在多個JVM下,能夠安全地寫道同一個日誌文件。RollingFileAppender會有些限制。Logback的FileAppender和它的子類包括RollingFileAppender能夠非常友好地從I/O異常中恢復。

配置文件可以處理不同的情況
開發人員經常需要判斷不同的Logback配置文件在不同的環境下(開發,測試,生產)。而這些配置文件僅僅只有一些很小的不同,可以通過,和來實現,這樣一個配置文件就可以適應多個環境。

Filters(過濾器)
有些時候,需要診斷一個問題,需要打出日誌。在log4j,只有降低日誌級別,不過這樣會打出大量的日誌,會影響應用性能。在Logback,你可以繼續保持那個日誌級別而除掉某種特殊情況,如alice這個用戶登錄,她的日誌將打在DEBUG級別而其他用戶可以繼續打在WARN級別。要實現這個功能只需加4行XML配置。可以參考MDCFIlter

SiftingAppender(一個非常多功能的Appender)
它可以用來分割日誌文件根據任何一個給定的運行參數。如,SiftingAppender能夠區別日誌事件跟進用戶的Session,然後每個用戶會有一個日誌文件。

自動壓縮已經打出來的log
RollingFileAppender在產生新文件的時候,會自動壓縮已經打出來的日誌文件。壓縮是個非同步過程,所以甚至對於大的日誌文件,在壓縮過程中應用不會受任何影響。

堆棧樹帶有包版本
Logback在打出堆棧樹日誌時,會帶上包的數據。

自動去除舊的日誌文件
通過設置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你可以控制已經產生日誌文件的最大數量。如果設置maxHistory為12,那那些log文件超過12個月的都會被自動移除。

總之,logback比log4j太優秀了,讓我們的應用全部建立logback上吧

Ⅷ druid的slf4jlogfilter與log4jfilter有什麼區別

slf4j是hibernate的日誌介面,通常我們用log4j.jar來實現hibernate的記錄日誌功能,slf4j-log4j.jar可以看成是用來把slf4j的介面轉換成適合log4j的介面的一個適配器。

Ⅸ 在log4j中,怎樣將一個filter設置進appender中去

一:使用log4j.xml
1.log4j.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<! log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j= akarta.ap ache.or g/log4j/'>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="/n[%r][%p][%t] %d{HH:mm:ss,SSS} method:%l/n%m%n"/>
</layout>
</appender>

<appender name="DEBUG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="./logs/app-debug.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG"/>
<param name="LevelMax" value="DEBUG"/>
</filter>
</appender>

閱讀全文

與log4jfilter過濾器相關的資料

熱點內容
污水提升器配蹲便怎麼安裝 瀏覽:287
苯銨廢水處理 瀏覽:115
樹膠樹脂有什麼 瀏覽:760
大金有冷凝水提升泵嗎 瀏覽:775
doit過濾 瀏覽:17
潤滑油濾芯生意怎麼樣 瀏覽:894
家用反滲透純水機怎麼接管子 瀏覽:602
天龍國產14檔變速箱濾芯怎麼換 瀏覽:955
edi膜塊回收 瀏覽:591
廢水治理的前景概括 瀏覽:972
昌吉反滲透水處理 瀏覽:913
公司的污水處理費怎麼做賬 瀏覽:467
2018年內蒙古反滲透膜招標信息 瀏覽:288
山崎蒸餾所標 瀏覽:237
化工水處理葯水 瀏覽:451
ro反滲透膜75加侖 瀏覽:277
如何打掃房間的污水 瀏覽:338
桑塔納3000空調濾芯在什麼位置 瀏覽:1
美國人怎麼處理養殖污水 瀏覽:591
霍尼韋爾濾芯怎麼換 瀏覽:116