因為最近需要縮減寫到 Splunk 的 log 量,因此需要先找出從哪裡寫的 log 量最大。要想找到哪邊是寫最多 log 的地方,初步的想法,就是先以 package/class 為單位,看看哪個 package/class 的 log 最多,就會有標的可以知道我們要從哪邊下手會最有效率。
要寫 Splunk query 時,先考慮一下 log 的格式。我們的 log 是單純地用 logback 輸出成 JSON 格式,然後就讓 docker log driver 送去 Splunk,所以 log 的 JSON 內容會放在 line 欄位裡面。因此在 Splunk query 中,package/class 會被放在 line.logger 中。另外如果數字很多的時候,要看出比例的差距也不是很容易,因此可以利用 eventstats 來幫忙計算整體的占比。
index="prod" source="mylog" | eval length = len(_raw)/1048576 | stats sum(length) as package_size by line.logger | eventstats sum(package_size) AS total | eval percent = round(package_size/total*100, 2)."%" | table line.logger, package_size, percent | sort - package_size
結果如下:
line.logger | package_size | percent |
com.a.a.a | 37152.74659347534 | 46.89% |
org.zalando.logbook.Logbook | 28326.010219573975 | 35.75% |
com.b.b.b | 13741.930490493774 | 17.34% |
com.c.c.c | 8.518047332763672 | 0.01% |
com.d.d.d | 6.767726898193359 | 0.01% |
內容稍微打個碼 XD。不過這樣結果就很清楚了,整體來說都是最上面那三個 class 在寫 log,而且其中第一名佔據了將近一半的資料量….。
不過需要注意的是,這個數字並不一定完全能夠代表這些 log 在 Splunk 裡佔據的空間量,因為 len() 指令是在計算字元數(character)的,當使用不同 encoding 時,一個字元換算成 byte 的大小會不一樣。