記錄其他元資料

2021-10-06 23:26:17 字數 2422 閱讀 8490

2月,在鎖定之前,我在confoo上發表了我的fast log演講。 最後,我有乙個有趣的問題,由於時間緊迫,我不得不縮短。 這篇部落格文章旨在描述演講的相關要點,問題以及一些可能的答案。

在本演講中,我重點介紹了提高日誌速度的不同方法。 如今,大多數日誌都彙總到乙個地方,以備後用。 例如,一種廣泛的體系結構是基於彈性堆疊的:

儘管此設計有效,但它具有許多元件。 特別是,logstash在這裡可以解析json格式的原始日誌行,以便elasticsearch可以分別索引每個字段。

sample.log

2020-02-29 13:56:54.906  info 1 --- [  main] c.f.f.main : informative message

一種改進是使用一種模式配置日誌記錄框架,以便它直接寫入json格式的單行日誌。 下面顯示了如何使用logback做到這一點:

logback.xml

", "time": "%d", "thread": "%thread", "level": "%-5level", "classname": "%logger", "message": "%msg" }%n

現在的輸出如下:

/var/log/sample.log

這允許將日誌直接傳送到elasticsearch,從而通過完全刪除logstash來簡化架構:

現在,假設企業出於日誌目的還需要除日誌訊息之外的其他字段。 使用簡單的字串訊息,這就像獲取對值的引用並將其新增到字段中一樣容易:

ch.frankel.fastlogs.main

logger

.info

("client-id -> {} | informative message"

,client

.getid

());

在正確的日誌級別下執行時,將輸出所需的訊息:

sample.log

2020-02-29 13:56:54.906  info 1 --- [ main] ch.frankel.fastlogs.main : client-id -> xyz | informative message
使用logstash,可以改善groking模式,使其成功解析client-id值並將其作為專用字段傳送到elasticsearch。 不幸的是,上面顯示的json格式的日誌選項不允許這樣做:

sample.log

注意,client-id與分隔符一起是message一部分。 可以將其傳送到elasticsearch並使用自定義ingester解析訊息。 但是,這將對每個索引的訊息花費額外的處理時間。 回到第乙個方框和logstash嗎?

slf4j和類似的框架允許通過使用mdc新增其他元資料。 簡而言之,mdc是繫結到特定執行緒的雜湊對映上下文持有者

可以利用mdc解決此問題。 這是乙個示例**片段:

ch.frankel.fastlogs.main

mdc

.put

("client-id"

,client

.getid

());

logger

.info

("informative message"

);mdc

.remove

("client-id"

);

請注意,我們在日誌記錄語句之前明確設定了它,並在之後刪除了它。 根據上下文,使用servlet過濾器自動執行操作以避免錯誤是有益的。 例如,logback提供了現成的mdc篩選器來設定與請求相關的資料。

讓我們稍微更新一下模式以使用mdc:

logback.xml

", "time": "%d", "thread": "%thread", "level": "%-5level", "classname": "%logger", "message": "%msg", "client-id": "%x" }%n 

注意%x語法。 這樣,我們可以保持我們簡單的無logstash架構,並仍然獲得所需的json輸出:

通過消除對日誌的解析,可以使日誌變得更快。 為此,可以直接輸出單行json訊息。 當需要其他元資料時,只需使用mdc和適合日誌記錄實現的日誌記錄模式。

更進一步:

翻譯自:

其他題目記錄

當乙個數為2的n 次方時,整個二進位制數,只有本位是1 其他位為0,如果我們給這個數減一,那麼本位變為0 其他位全部變成1 我們可以通過 運算,如果為0即為2的n次方 def is2n self,n if n 0 return true res n n 1 return res 0或者直接通過 re...

mysql查詢其他表記錄插入資料

開發中,有時候會碰到這種需求 需要往乙個表中 table1 新增一條記錄,比如這個表 table1 有好多個字段,有一些欄位的值是從另乙個表 table2 中讀取的資料,有一些欄位的值是自己定義的值,這時候要求用一條sql完成,如下即可 group max id 100 group id 99 da...

LeetCode 其他題目記錄

104.maximum depth of binary tree 和111很像,只是遞迴的結構略有不同,可簡單畫圖分析,求最大深度可以直接返回1 max 左子樹深度,右子樹深度 但是求最小深度時不可以,需要分別考慮左右子樹為空的情況。可以舉個反例子,比如,單斜樹。1 class solution 7...