logback filters使用詳解 二

2021-09-02 18:33:13 字數 3793 閱讀 7932

turbofilters

turbofilter物件全部繼承於turbofilter抽象類。像正則過濾器一樣,它們都使用三進製邏輯返回對日誌事件的判斷。

它們的工作試類似於前面提到的過濾器。但,filter與turbofilter存在兩點不一樣。

更重要的,它們會在loggingevent物件建立前被呼叫。turbofilter物件過濾日誌請求,不需要乙個日誌事件的例項化。因此,turbofilters用於高效能地過濾日誌事件,即使在日誌事件物件建立前。

實現自定義trubofilter

只壓根繼承turbofilter抽象類就可以建立自定義turbofilter物件。像前面實現自定義過濾器一樣,實現自定義過濾器只要實現decide()方法。下面的例子中,我們建立了乙個稍微複雜的過濾器:

package chapters.filters;

import org.slf4j.marker;

import org.slf4j.marke***ctory;

import ch.qos.logback.classic.level;

import ch.qos.logback.classic.logger;

import ch.qos.logback.classic.turbo.turbofilter;

import ch.qos.logback.core.spi.filterreply;

public class sampleturbofilter extends turbofilter

if ((markertoaccept.equals(marker))) else

} public string getmarker()

public void setmarker(string markerstr)

@override

public void start()

}}

上面的turbofilter接收飲食特殊標識的事件。如果未找到指定標識,過濾器則將責任傳遞給連上下乙個過濾器。

為了增加靈活性,通過getter與setter,測試標識可能在配置檔案中指定。我們也通過實現start()方法去驗證在處理配置過程中選項是否已指定。

sample

logback提供了一些turbofilter類。mdcfilter用於驗證是否存在指定值;dynamicthresholdfilter基於mdc的key與level閥值過濾。另乙個方面,markerfilter用於驗證日誌請求中包含指定標識。

下面是應用mdcfilter與markerfilter的乙個例子:

username

sebastien

accept

billing

deny

duplicatemessagefilter

duplicatemessagefilter優點在與眾不同。這個過濾器會監測重複的訊息,超過一定數量後,會丟棄掉重複的訊息。

為了監控重複,過濾器在訊息中使用簡單的string相等性。它不會監測到只有一些字元差異的非常相近的訊息。例如:

logger.debug("hello "+name0);

logger.debug("hello "+name1);

假設name0與name1有不同的值,則認為這兩條"hello"訊息不相關。依賴於使用者的使用,以後的發布版本有可能新增驗證string相似性功能。

注意包含引數的日誌情況,只有考慮到原始訊息。例如:下面兩個請求,原始訊息為"hello {}"一樣,因此,它被視為重複。

重複的數量可能通過allowedrepetitions屬性配置。例如,如果屬性值為1,則第2條及以後的相同訊息會被丟棄。類似,如果屬性值為2,則第3條及以後的相同訊息會被丟棄。allowedrepetitions預設值為5。

為了監測重複性,這個過濾器需要在內部快取中保持舊訊息的引用。這個快取的大小取決於屬性cachesize。預設,屬性值為100。

因此,配置了上面過濾器的filterevents輸出為:

2008-12-19 15:04:26,156 [main] info chapters.filters.filterevents - logging statement 0

2008-12-19 15:04:26,156 [main] info chapters.filters.filterevents - logging statement 1

2008-12-19 15:04:26,156 [main] info chapters.filters.filterevents - logging statement 2

2008-12-19 15:04:26,156 [main] info chapters.filters.filterevents - logging statement 4

2008-12-19 15:04:26,156 [main] info chapters.filters.filterevents - logging statement 5

2008-12-19 15:04:26,171 [main] error chapters.filters.filterevents - billing statement 6

「logging statement 0」是第乙個"logging statement {}"的發生。"logging statement 1"是第1個重複,"logging statement 2"是第2個重複。有趣的是,雖然基本規則被丟棄了,debug級別的"logging statement 3"是第3個重複。通過這個可以看出turbofilter早於其它過濾器呼叫,包含基本規則。因此,duplicatemessagefilter認為"logging statement 3"為重複。由於它被後面的連上的規則丟棄造成它常常被忘記。"logging statement 4"是第4個重複,"logging statement 5"第5個。由於預設只允許5個重複,statements6以及之後的都將被丟棄。

logback-access

countingfilter

通過countingfilter,logback-access可以提供web-server的訪問統計資料。初始化時,countingfilter以mbean的形式將自己註冊到jmx伺服器。你可以通過訪問那個mbean獲取統計資料,如,每分鐘、小時、天、星期、月平均值。其它統計,如,上週、前天、上乙個小時、上個月的數量,以及獲得的總數量。

下面的lobback-access.xml宣告了乙個countingfilter:

countingfilter

你可以通過jconsole檢視jmx伺服器上的任何統計資料

判斷表示式用於處理當前訪問事件。logback-access自動將以event變數名,匯入accessevent例項。你可以讀取關於http請求與響應的各種資料。

下面配置檔案展示了過濾響應編碼為404的,每個請求為404的都會列印到console中。

deny

%h %l %u %t %r %s %b

下面乙個鴿子,我們過濾結果為404錯誤與請求css型別檔案:

&&

!(event.getrequesturi().contains(".css"))

deny

%h %l %u %t %r %s %b

參考文件: 

VMware License Server使用經驗

近期在測試vmware server,在使用vmware license server的時候碰到一些問題,經過兩天的實驗,問題得以解決,現記錄如下,以供朋友們參考。1 複製license檔案 在安裝vmware virtualcenter的時候,會一同安裝license server伺服器。如果你在...

Django Rest framework使用例項

一 修改配置檔案 setting.py django.contrib.admin django.contrib.auth django.contrib.contenttypes django.contrib.sessions django.contrib.messages django.contri...

Android AlarmManager 使用指南

intent intent new intent intent.setaction updatemgr.check update action 如果你的flag 是flag one shot,那麼你就只能受到一次廣播。如果使用setrepeat,你設定的intervalmills 少於60s,那麼就...