五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

自制單機(jī)日志解決方案 3. 日志查詢

2023-02-22 17:34 作者:木叉一人工作室  | 我要投稿

上一篇文章介紹了 Talog 的日志索引,本文來(lái)介紹一下日志查詢部分的邏輯。

太長(zhǎng)不看

  • 使用 Query 類構(gòu)建查詢表達(dá)式

  • 日志搜索器主要依賴字典樹進(jìn)行查詢,查詢結(jié)果實(shí)質(zhì)為 Bucket 列表,速度很快

  • 復(fù)合查詢實(shí)際上就是對(duì) Bucket 列表做交集、并集操作,速度很快

  • 使用 HeaderSearcher 來(lái)查詢多行日志

  • "合理"的日志標(biāo)簽才能發(fā)揮出 Talog 的性能,相反,"不合理"的日志標(biāo)簽會(huì)讓 Talog 表現(xiàn)得特別糟糕

日志查詢底層邏輯

首先,還是先從展示如何從 Talogger 創(chuàng)建日志搜索器入手:

日志查詢的主要代碼邏輯就如以上所展示的一樣簡(jiǎn)單,但是 query 查詢的構(gòu)建就會(huì)稍微復(fù)雜一點(diǎn)。

在 V.Talog.Core 核心包中,只能通過(guò) Query 對(duì)象來(lái)構(gòu)建查詢表達(dá)式,最基礎(chǔ)的查詢key=vlue?可以使用newQuery("key","value")?來(lái)構(gòu)建,這個(gè)初始化操作會(huì)將 Query.Tag 設(shè)置為{"key":"value"},并且將 Query.Type 設(shè)置為 0。僅當(dāng) Query 為基礎(chǔ)查詢時(shí),Tag 屬性才會(huì)有值,而 Query.Type 屬性支持 4 種枚舉值:

  • 0 eq 僅當(dāng) Query 為基礎(chǔ)查詢時(shí),才有肯能出現(xiàn)該枚舉值。表示需要查詢 Query.Tag.Label == Query.Tag.Value 的數(shù)據(jù)

  • 1 neq 僅當(dāng) Query 為基礎(chǔ)查詢時(shí),才有肯能出現(xiàn)該枚舉值。表示需要查詢 Query.Tag.Label != Query.Tag.Value 的數(shù)據(jù)

  • 2 and 僅當(dāng) Query 為復(fù)合查詢時(shí),才有肯能出現(xiàn)該枚舉值。表示需要查詢 Query.Left && Query.Right 的數(shù)據(jù)

  • 3 or 僅當(dāng) Query 為復(fù)合查詢時(shí),才有肯能出現(xiàn)該枚舉值。表示需要查詢 Query.Left || Query.Right 的數(shù)據(jù)

上面所提到的 Query.Left、Query.Right 主要用于構(gòu)建復(fù)合查詢,例如newQuery("key1","value1").And(newQuery("key2","value2"))?會(huì)生成一個(gè)新的 Query 對(duì)象(以上提及的三個(gè) Query 對(duì)象分別稱為 query1、query2、query3),其中 query3.Left 就是 query1,query3.Right 就是 query2,query3.Type 則等于 2。

之所以要花這么多篇幅介紹查詢表達(dá)式的構(gòu)建,主要是為了后續(xù)介紹日志查詢邏輯做鋪墊。Talog 設(shè)計(jì)的日志存儲(chǔ)方式是根據(jù)日志的標(biāo)簽來(lái)組織的,因此查詢時(shí)也主要是通過(guò)標(biāo)簽來(lái)進(jìn)行查詢,而日志查詢所用到的主要數(shù)據(jù)結(jié)構(gòu)就是日志索引時(shí)所構(gòu)建的字典樹,日志查詢器(后續(xù)簡(jiǎn)稱為 Searcher)使用用戶傳入的查詢表達(dá)式中的標(biāo)簽,在字典樹中查找對(duì)應(yīng)的節(jié)點(diǎn),這些節(jié)點(diǎn)上的 Bucket 列表即為搜索結(jié)果。沒(méi)錯(cuò),在 V.Talog.Core 核心包中,日志查詢本質(zhì)上就只是查詢到對(duì)應(yīng)的日志文件,不會(huì)再做進(jìn)一步的細(xì)致化處理。關(guān)于對(duì)日志文件中的所有日志做篩選,在后續(xù)的文章中會(huì)給大家介紹。在此,我們先來(lái)詳細(xì)分析一下 Searcher 根據(jù)查詢表達(dá)式查詢?nèi)罩镜倪^(guò)程。

當(dāng)用戶傳入的查詢表達(dá)式為基礎(chǔ)查詢時(shí),Searcher 會(huì)將 Query.Tag 傳遞給 Index,讓 Index 找出對(duì)應(yīng) Bucket 列表,此處出現(xiàn)的 Index 是在 Talogger 初始化 Searcher 的時(shí)候,由 Talogger 傳遞給 Searcher 的,這個(gè)邏輯與上一篇文章中的 Indexer 一致??催^(guò)日志索引邏輯的讀者應(yīng)該還記得,Index 中維護(hù)了很多標(biāo)簽的字典樹,當(dāng) Searcher 將 Tag 對(duì)象傳遞給 Index 后,Index 會(huì)根據(jù) Tag.Label 獲取到對(duì)應(yīng)的字典樹,然后找到字典樹中 Tag.Value 所對(duì)應(yīng)的節(jié)點(diǎn),并且把這個(gè)節(jié)點(diǎn)上的 Bucket 列表返回給 Searcher。以上邏輯就是 Searcher.Search 方法的邏輯,Search 方法只會(huì)返回 Bucket 列表,而如果想要獲取到日志數(shù)據(jù),則可以調(diào)用 SearchLogs,該方法只是在調(diào)用完 Search 方法之后,從 Bucket 讀取日志文本。這樣,一次基礎(chǔ)查詢的查詢過(guò)程就介紹完畢了。

當(dāng)用戶傳入的查詢表達(dá)式為復(fù)合查詢時(shí),Searcher 會(huì)遞歸調(diào)用 Search 方法,獲取到 Query.Left 以及 Query.Right 所對(duì)應(yīng)的 Bucket 列表(兩個(gè)列表分別稱為 buckets1、buckets2)。然后,當(dāng) Qeury.Type 等于 2 時(shí),則求得 buckets1、buckets2 的交集(在 .net 中直接使用 linq 的 Intersect 方法)即為結(jié)果;當(dāng) Qeury.Type 等于 3 時(shí),則求得 buckets1、buckets2 的并集(在 .net 中直接使用 linq 的 Union 方法)即為結(jié)果。

HeaderSearcher

HeaderSearcher 類是在 V.Talog.Extension 包中實(shí)現(xiàn),主要用于查詢多行日志,與 Searcher 類的唯一區(qū)別在于 HeaderSearcher 重寫了 SearchLogs 方法,因?yàn)?Searcher.SearchLogs 會(huì)將每一行識(shí)別為一條日志,而 HeaderSearcher 會(huì)逐行讀取日志,并在 [head] 標(biāo)識(shí)出現(xiàn)時(shí),才會(huì)認(rèn)為出現(xiàn)了新的一條日志數(shù)據(jù)。

JsonSearcher

JsonSearcher 在 Searcher 的基礎(chǔ)上添加了兩個(gè)接口,主要就是將日志反序列化成復(fù)雜對(duì)象。

查詢效果展示-極端情況

先展示一個(gè)比較極端的測(cè)試用例,沿用上一篇文章索引日志時(shí)的測(cè)試代碼,但是上一篇文章只使用了日期以及日志等級(jí)來(lái)作為標(biāo)簽,本次加上了 IP,因?yàn)槿罩緮?shù)據(jù)都是用?Bogus?隨機(jī)生成的,因此 IP 基本不存在重復(fù)的情況。我這次生成了 20W 條日志,也對(duì)應(yīng)生成了 20W 個(gè)日志文件,每個(gè)日志文件僅存放一條日志,此時(shí)的索引文件達(dá)到了 253M。

本次測(cè)試用到的查詢表達(dá)式較為簡(jiǎn)單,就是查詢?nèi)罩镜燃?jí)為 0 的所有日志,可以預(yù)見查出來(lái)的日志文件肯定很多,因此在此就不讀取日志文本內(nèi)容,而是只查詢對(duì)應(yīng)的 Bucket 列表展示查詢效果。

從上面的運(yùn)行日志來(lái)看,加載索引文件初始化 Searcher 就花費(fèi)了 2m 的時(shí)間,當(dāng)然這跟測(cè)試筆記本的環(huán)境有關(guān)(和之前一樣,也是在運(yùn)行其他程序...),這說(shuō)明了在 Talog 中,給日志打上"不合理"的標(biāo)簽,會(huì)帶來(lái)特別嚴(yán)重的效率問(wèn)題。而日志查詢只花費(fèi)了 6ms 的時(shí)間,就能查出 6W+ 條結(jié)果,這主要?dú)w功于字典樹這個(gè)數(shù)據(jù)結(jié)構(gòu)。

查詢效果展示-正常情況

本次測(cè)試不對(duì)日志打 IP 標(biāo)簽,隨機(jī)生成 20W 條日志,此次生成的日志文件變成 18 個(gè),索引文件大小為 15K。

日志查詢表達(dá)式同上,初始化 Searcher 的時(shí)間僅花費(fèi) 68ms,改為調(diào)用 SearchLogs 方法查詢?nèi)罩疚谋?,消?324ms。日志查詢的耗時(shí)主要在于日志文件的讀取與解析,后續(xù)可以對(duì)這方面進(jìn)行優(yōu)化,但是日志查詢的應(yīng)用場(chǎng)景一般都是問(wèn)題排查,日志查詢速度應(yīng)該可以不用特別快,只要能夠在 1~2s 內(nèi)返回即可,個(gè)人感覺(jué)。

最后

Talog 的日志查詢性能對(duì)于小微項(xiàng)目來(lái)說(shuō),絕對(duì)是夠用的,但是想要利用好 Talog 具有一定的門檻,那就是,需要考慮清楚如何"合理"地給日志打上標(biāo)簽。本文介紹的 Talog 查詢能力,只能提供一個(gè)比較基礎(chǔ)、粗略的效果,下一篇文章會(huì)介紹一下 V.Talog.Extension 擴(kuò)展包為 Talog 提供的日志查詢能力。


自制單機(jī)日志解決方案 3. 日志查詢的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
阳信县| 紫金县| 宁强县| 缙云县| 黄山市| 东乡县| 红原县| 航空| 上栗县| 宁安市| 阿尔山市| 陵川县| 科尔| 普安县| 安阳县| 无锡市| 成安县| 班戈县| 合川市| 当涂县| 武安市| 大新县| 庄河市| 大关县| 淳化县| 信阳市| 青龙| 定边县| 汉阴县| 揭西县| 龙口市| 玉龙| 噶尔县| 布尔津县| 霍州市| 洪洞县| 文昌市| 年辖:市辖区| 沈阳市| 广东省| 大姚县|