我試了試用 SQL查 Linux日誌,好用到飛起
導讀 | 最近發現點好玩的工具,迫不及待的想跟大家分享一下。 |
大家平時都怎麼查
日誌呢?像我平時會用tail、head、cat、sed、more、less這些經典系統
,或者awk這類三方資料過濾工具,配合起來查詢效率很高。但在使用過程中有一點讓我比較頭疼,那就是
引數規則太多了,記的人腦殼疼。
那查日誌有沒有一種通用的方式,比如用SQL查詢,畢竟這是程式設計師都比較熟悉的表示式。
今天分享的工具q,就實現了以寫SQL的方式來查詢、統計文字內容,一起看看這貨到底有什麼神奇之處。
q是一個命令列工具,允許我們在任意檔案或者查詢結果,比如可以在ps -ef查詢程式命令的結果集上,直接執行SQL語句查詢。
宗旨就是文字即資料庫表,額~,當然這句話是我自己理解的,哈哈哈
它將普通檔案或者結果集當作資料庫表,幾乎支援所有的SQL結構,如WHERE、GROUP BY、JOINS等,支援自動列名和列型別檢測,支援跨檔案連線查詢,這兩個後邊詳細介紹,支援多種編碼。
安裝比較簡單,在Linux 環境,只要如下三步搞定,Windows環境更是隻需安裝個exe就可以用了。
wget 下載版本 sudo rpm -ivh q-text-as-data-1.7.1-1.noarch.rpm # 安裝
q --version #檢視安裝版本
“官方文件:
q支援所有SQLiteSQL語法,標準命令列格式q + 引數命令 + "SQL"
q <命令> ""
我要查詢myfile.log檔案的內容,直接q "SELECT * FROM myfile.log"。
q "SELECT * FROM myfile.log"
q不附加引數使用是完全沒有問題的,但利用引數會讓顯示結果更加美觀,所以這裡簡單瞭解一下,它的引數分為 2種。
input輸入命令:指的是對要查詢的檔案或結果集進行操作,比如:-H命令,表示輸入的資料包含標題行。
q -H "SELECT * FROM myfile.log"
在這種情況下,將自動檢測列名,並可在查詢語句中使用。如果未提供此選項,則列將自動命名為cX,以c1起始以此類推。
q "select c1,c2 from ..."
output輸出命令:作用在查詢輸出的結果集,比如:-O,讓查詢出來的結果顯示列名。
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H "select count(UID) from - where UID='root'" 104
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H -O "select count(UID) from - where UID='root'" count(UID) 104
還有很多引數就不一一列舉了,感興趣的同學在官網上看下,接下來我們重點演示一下使用SQL如何應對各種查詢日誌的場景。圖片
下邊我們們一起看幾個查詢日誌的經常場景中,這個SQL該如何寫。
關鍵字檢索,應該是日常開發使用最頻繁的操作,不過我個人認為這一點q並沒有什麼優勢,因為它查詢時必須指定某一列。
[root@iZ2zebfzaequ90bdlz820sZ software]# q "select * from douyin.log where c9 like '%待解析%'" 2021-06-11 14:46:49.323 INFO 22790 --- [nio-8888-exec-2] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9g9uJ6%2F 2021-06-11 14:57:31.938 INFO 22790 --- [nio-8888-exec-5] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9pdhGP%2F 2021-06-11 15:23:48.004 INFO 22790 --- [nio-8888-exec-2] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9pQjBR%2F 2021-06-11 2
而用grep命令則是全文檢索。
[root@iZ2zebfzaequ90bdlz820sZ software]# cat douyin.log | grep '待解析URL' 2021-06-11 14:46:49.323 INFO 22790 --- [nio-8888-exec-2] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9g9uJ6%2F 2021-06-11 14:57:31.938 INFO 22790 --- [nio-8888-exec-5] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9pdhGP%2F
like模糊搜尋,如果文字內容列有名字直接用列名檢索,沒有則直接根據列號c1、c2、cN。
[root@iZ2zebfzaequ90bdlz820sZ software]# cat test.log abc 2 3 4 5 23 24 25
[root@iZ2zebfzaequ90bdlz820sZ software]# q -H -t "select * from test.log where abc like '%2%'" Warning: column count is one - did you provide the correct delimiter? 2 23 24 25
支援UNION和UNION ALL運算子對多個檔案取交集或者並集。
如下建了test.log和test1.log兩個檔案,裡邊的內容有重疊,用union進行去重。
q -H -t "select * from test.log union select * from test1.log" [root@iZ2zebfzaequ90bdlz820sZ software]# cat test.log abc 2 3 4 5
[root@iZ2zebfzaequ90bdlz820sZ software]# cat test1.log abc 3 4 5 6
[root@iZ2zebfzaequ90bdlz820sZ software]# q -H -t "select * from test.log union select * from test1.log" Warning: column count is one - did you provide the correct delimiter? Warning: column count is one - did you provide the correct delimiter? 2 3 4 5 6
比如統計某個路徑下的./clicks.csv檔案中,uuid欄位去重後出現的總個數。
q -H -t "SELECT COUNT(DISTINCT(uuid)) FROM ./clicks.csv"
注意:q會理解每列是數字還是字串,判斷是根據實數值比較,還是字串比較進行過濾,這裡會用到-t命令。
q -H -t "SELECT request_id,score FROM ./clicks.csv WHERE score > 0.7 ORDER BY score DESC LIMIT 5"
讀取系統命令查詢結果,計算/tmp目錄中每個使用者和組的總值。可以對欄位進行運算處理。
sudo find /tmp -ls | q "SELECT c5,c6,sum(c7)/1024.0/1024 AS total FROM - GROUP BY c5,c6 ORDER BY total desc"
[root@iZ2zebfzaequ90bdlz820sZ software]# sudo find /tmp -ls | q "SELECT c5,c6,sum(c7)/1024.0/1024 AS total FROM - GROUP BY c5,c6 ORDER BY total desc" www www 8.86311340332 root root 0.207922935486 mysql mysql 4.76837158203e-06
統計系統擁有最多程式數的前 3個使用者ID,按降序排序,這就需要和系統命令配合使用了,先查詢所有程式再利用SQL篩選,這裡的q命令就相當grep命令。
ps -ef | q -H "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3"
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3" root 104 www 16 rabbitmq 4
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H -O "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3" UID cnt root 110 www 16 rabbitmq 4
我們看到加與不加-O命令的區別就是否顯示查詢結果的標題。
一般情況下,我們的日誌檔案會按天分割成很多個固定容量的子檔案,在沒有統一的日誌收集伺服器的情況下,如果不給個報錯時間區間去查一個關鍵詞,那麼無異於大海撈針。
圖片如果可以將所有檔案內容合併後在查就會省事很多,q支援將檔案像資料庫表那樣聯合查詢。
q -H "select * from douyin.log a join douyin-2021-06-18.0.log b on (a.c2=b.c3) where b.c1='root'"
看完可能會有人抬槓:q寫這麼多程式碼直接用awk不香嗎?額~ 介紹這個工具的初衷並不是說要替換現有哪種工具,而是多提供一種更為便捷的查日誌方法。
我也有在用awk確實很強大沒得說,但這裡邊涉及到一個學習成本的問題,琳琅滿目的命令、匹配規則想玩轉還是要下點功夫的。而對於新手程式設計師稍微有點資料庫經驗,寫SQL問題都不大,上手q則會容易的多。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2786071/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 說了你不信!用 SQL查 Linux日誌,真的好用到飛起SQLLinux
- RecyclerView 配合 DiffUtil,好用到飛起View
- 為了學好Java,我嘗試了這 6 個方法Java
- 如何在 Linux 上用 SQL 語句來查詢 Apache 日誌LinuxSQLApache
- 使用sql查alert日誌SQL
- ELK太重?試試KFC日誌採集
- 記錄 sql 查詢日誌SQL
- 對比測試工具平臺讓財務測試飛起來
- 物化試圖日誌過大
- 建立測試物理Standby日誌
- 起飛前檢查
- linux查詢日誌技巧Linux
- 在輕量應用伺服器上的學習日誌(嘗試失敗了)伺服器
- Windows終端好難用?試試gitbash吧!WindowsGit
- 學習日誌-----測試思維
- 離線日誌釋出測試
- 我最新的慢日誌去哪了?
- 『學了就忘』Linux日誌管理 — 92、日誌輪替Linux
- 真NBility啊,廣東航空愛好者自制直升飛機試飛成功!
- 分析mysql慢查詢日誌的好工具--mysqlslaMySql
- 重做日誌檔案損壞測試
- 客戶端釋出日誌測試客戶端
- 清理日誌檔案嘗試有效哦
- Cmocka 單元測試日誌記錄Mock
- 微軟上線了表情包黑科技,我給爾康少爺試了試微軟
- 好用到飛起的12個jupyter lab外掛
- Linux 查詢 日誌 相關命令Linux
- sql azure試用感受3SQL
- mysql 日誌之慢查詢日誌MySql
- 我們測試了上萬款應用程式,總結了APP測試流程和常見問題APP
- 在SQL Server上測試事務日誌的自動增長(三)QOSQLServer
- 在SQL Server上測試事務日誌的自動增長(二)TGSQLServer
- 在SQL Server上測試事務日誌的自動增長(一)JPSQLServer
- 資料庫日誌減肥。自己試過可以資料庫
- 自動化測試框架:日誌的分析框架
- Linux下mysql配置慢日誌查詢,把查詢慢的sql記錄下來LinuxMySql
- 『學了就忘』Linux日誌管理 — 93、日誌輪替補充Linux
- Ubuntu玩機記錄,讓我破電腦又飛起來了Ubuntu