首頁 > 軟體

如何分析 Linux 紀錄檔

2020-06-16 17:56:21

紀錄檔中有大量的資訊需要你處理,儘管有時候想要提取並非想象中的容易。在這篇文章中我們會介紹一些你現在就能做的基本紀錄檔分析例子(只需要搜尋即可)。我們還將涉及一些更高階的分析,但這些需要你前期努力做出適當的設定,後期就能節省很多時間。對資料進行高階分析的例子包括生成匯總計數、對有效值進行過濾,等等。

我們首先會向你展示如何在命令列中使用多個不同的工具,然後展示了一個紀錄檔管理工具如何能自動完成大部分繁重工作從而使得紀錄檔分析變得簡單。

用 Grep 搜尋

搜尋文字是查詢資訊最基本的方式。搜尋文字最常用的工具是 grep。這個命令列工具在大部分 Linux 發行版中都有,它允許你用正規表示式搜尋紀錄檔。正規表示式是一種用特殊的語言寫的、能識別匹配文字的模式。最簡單的模式就是用引號把你想要查詢的字串括起來。

grep使用簡明及正規表示式  http://www.linuxidc.com/Linux/2013-08/88534.htm

Linux下Shell程式設計——grep命令的基本運用 http://www.linuxidc.com/Linux/2013-06/85525.htm

grep 命令詳解及相關事例 http://www.linuxidc.com/Linux/2014-07/104041.htm

Linux基礎命令之grep詳解 http://www.linuxidc.com/Linux/2013-07/87919.htm

設定grep高亮顯示匹配項 http://www.linuxidc.com/Linux/2014-09/106871.htm

Linux grep命令學習與總結 http://www.linuxidc.com/Linux/2014-10/108112.htm

14 個 grep 命令的例子 http://www.linuxidc.com/Linux/2015-05/117626.htm

正規表示式

這是一個在 Ubuntu 系統的認證紀錄檔中查詢 “user hoover” 的例子:

  1. $ grep "user hoover"/var/log/auth.log
  2. Accepted password for hoover from10.0.2.2 port 4792 ssh2
  3. pam_unix(sshd:session): session opened for user hoover by(uid=0)
  4. pam_unix(sshd:session): session closed for user hoover

構建精確的正規表示式可能很難。例如,如果我們想要搜尋一個類似埠 “4792” 的數位,它可能也會匹配時間戳、URL 以及其它不需要的資料。Ubuntu 中下面的例子,它匹配了一個我們不想要的 Apache 紀錄檔。

  1. $ grep "4792"/var/log/auth.log
  2. Accepted password for hoover from10.0.2.2 port 4792 ssh2
  3. 74.91.21.46--[31/Mar/2015:19:44:32+0000]"GET /scripts/samples/search?q=4972 HTTP/1.0"404545"-""-”

環繞搜尋

另一個有用的小技巧是你可以用 grep 做環繞搜尋。這會向你展示一個匹配前面或後面幾行是什麼。它能幫助你偵錯導致錯誤或問題的東西。B 選項展示前面幾行,A 選項展示後面幾行。舉個例子,我們知道當一個人以管理員員身份登入失敗時,同時他們的 IP 也沒有反向解析,也就意味著他們可能沒有有效的域名。這非常可疑!

  1. $ grep -B 3-A 2'Invalid user'/var/log/auth.log
  2. Apr2817:06:20 ip-172-31-11-241 sshd[12545]: reverse mapping checking getaddrinfo for216-19-2-8.commspeed.net [216.19.2.8] failed - POSSIBLE BREAK-IN ATTEMPT!
  3. Apr2817:06:20 ip-172-31-11-241 sshd[12545]:Received disconnect from216.19.2.8:11:ByeBye[preauth]
  4. Apr2817:06:20 ip-172-31-11-241 sshd[12547]:Invalid user admin from216.19.2.8
  5. Apr2817:06:20 ip-172-31-11-241 sshd[12547]: input_userauth_request: invalid user admin [preauth]
  6. Apr2817:06:20 ip-172-31-11-241 sshd[12547]:Received disconnect from216.19.2.8:11:ByeBye[preauth]

Tail

你也可以把 grep 和 tail 結合使用來獲取一個檔案的最後幾行,或者跟蹤紀錄檔並實時列印。這在你做互動式更改的時候非常有用,例如啟動伺服器或者測試程式碼更改??

  1. $ tail -f /var/log/auth.log | grep 'Invalid user'
  2. Apr3019:49:48 ip-172-31-11-241 sshd[6512]:Invalid user ubnt from219.140.64.136
  3. Apr3019:49:49 ip-172-31-11-241 sshd[6514]:Invalid user admin from219.140.64.136

關於 grep 和正規表示式的詳細介紹並不在本指南的範圍,但 Ryan’s Tutorials 有更深入的介紹。

紀錄檔管理系統有更高的效能和更強大的搜尋能力。它們通常會索引資料並進行併行查詢,因此你可以很快的在幾秒內就能搜尋 GB 或 TB 的紀錄檔。相比之下,grep 就需要幾分鐘,在極端情況下可能甚至幾小時。紀錄檔管理系統也使用類似 Lucene 的查詢語言,它提供更簡單的語法來檢索數位、域以及其它。

用 Cut、 AWK、 和 Grok 解析

命令列工具

Linux 提供了多個命令列工具用於文字解析和分析。當你想要快速解析少量資料時非常有用,但處理大量資料時可能需要很長時間。

Cut

cut 命令允許你從有分隔符的紀錄檔解析欄位。分隔符是指能分開欄位或鍵值對的等號或逗號等。

假設我們想從下面的紀錄檔中解析出使用者:

  1. pam_unix(su:auth): authentication failure; logname=hoover uid=1000 euid=0 tty=/dev/pts/0 ruser=hoover rhost= user=root

我們可以像下面這樣用 cut 命令獲取用等號分割後的第八個欄位的文字。這是一個 Ubuntu 系統上的例子:

  1. $ grep "authentication failure"/var/log/auth.log | cut -d '='-f 8
  2. root
  3. hoover
  4. root
  5. nagios
  6. nagios

AWK

另外,你也可以使用 awk,它能提供更強大的解析欄位功能。它提供了一個指令碼語言,你可以過濾出幾乎任何不相干的東西。

例如,假設在 Ubuntu 系統中我們有下面的一行紀錄檔,我們想要提取登入失敗的使用者名稱稱:

  1. Mar2408:28:18 ip-172-31-11-241 sshd[32701]: input_userauth_request: invalid user guest [preauth]

你可以像下面這樣使用 awk 命令。首先,用一個正規表示式 /sshd.*invalid user/ 來匹配 sshd invalid user 行。然後用 { print $9 } 根據預設的分隔符空格列印第九個欄位。這樣就輸出了使用者名稱。

  1. $ awk '/sshd.*invalid user/ { print $9 }'/var/log/auth.log
  2. guest
  3. admin
  4. info
  5. test
  6. ubnt

你可以在 Awk 使用者指南 中閱讀更多關於如何使用正規表示式和輸出欄位的資訊。

AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm

AWK 簡介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm

Shell指令碼之AWK文字編輯器語法 http://www.linuxidc.com/Linux/2013-11/92787.htm

正規表示式中AWK的學習和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm

文字資料處理之AWK 圖解 http://www.linuxidc.com/Linux/2013-09/89589.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文字分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

紀錄檔管理系統

紀錄檔管理系統使得解析變得更加簡單,使使用者能快速的分析很多的紀錄檔檔案。他們能自動解析標準的紀錄檔格式,比如常見的 Linux 紀錄檔和 Web 伺服器紀錄檔。這能節省很多時間,因為當處理系統問題的時候你不需要考慮自己寫解析邏輯。

下面是一個 sshd 紀錄檔訊息的例子,解析出了每個 remoteHost 和 user。這是 Loggly 中的一張截圖,它是一個基於雲的紀錄檔管理服務。

你也可以對非標準格式自定義解析。一個常用的工具是 Grok,它用一個常見正規表示式庫,可以解析原始文字為結構化 JSON。下面是一個 Grok 在 Logstash 中解析核心紀錄檔檔案的事例設定:

  1. filter{
  2. grok {
  3. match =>{"message"=>"%{CISCOTIMESTAMP:timestamp} %{HOST:host} %{WORD:program}%{NOTSPACE} %{NOTSPACE}%{NUMBER:duration}%{NOTSPACE} %{GREEDYDATA:kernel_logs}"
  4. }
  5. }

下圖是 Grok 解析後輸出的結果:

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2015-08/121015p2.htm


IT145.com E-mail:sddin#qq.com