天天看點

如何分析 Linux 日志

如何分析 Linux 日志

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

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

<a target="_blank"></a>

這是一個在 ubuntu 系統的認證日志中查找 “user hoover” 的例子:

<code>$ grep "user hoover" /var/log/auth.log</code>

<code>accepted password for hoover from 10.0.2.2 port 4792 ssh2</code>

<code>pam_unix(sshd:session): session opened for user hoover by (uid=0)</code>

<code>pam_unix(sshd:session): session closed for user hoover</code>

建構精确的正規表達式可能很難。例如,如果我們想要搜尋一個類似端口 “4792” 的數字,它可能也會比對時間戳、url 以及其它不需要的資料。ubuntu 中下面的例子,它比對了一個我們不想要的 apache 日志。

<code>$ grep "4792" /var/log/auth.log</code>

<code>74.91.21.46 - - [31/mar/2015:19:44:32 +0000] "get /scripts/samples/search?q=4972 http/1.0" 404 545 "-" "-”</code>

另一個有用的小技巧是你可以用 grep 做環繞搜尋。這會向你展示一個比對前面或後面幾行是什麼。它能幫助你調試導緻錯誤或問題的東西。<code>b</code> 選項展示前面幾行,<code>a</code> 選項展示後面幾行。舉個例子,我們知道當一個人以管理者員身份登入失敗時,同時他們的 ip 也沒有反向解析,也就意味着他們可能沒有有效的域名。這非常可疑!

<code>$ grep -b 3 -a 2 'invalid user' /var/log/auth.log</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12545]: reverse mapping checking getaddrinfo for 216-19-2-8.commspeed.net [216.19.2.8] failed - possible break-in attempt!</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12545]: received disconnect from 216.19.2.8: 11: bye bye [preauth]</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12547]: invalid user admin from 216.19.2.8</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12547]: input_userauth_request: invalid user admin [preauth]</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12547]: received disconnect from 216.19.2.8: 11: bye bye [preauth]</code>

<code>$ tail -f /var/log/auth.log | grep 'invalid user'</code>

<code>apr 30 19:49:48 ip-172-31-11-241 sshd[6512]: invalid user ubnt from 219.140.64.136</code>

<code>apr 30 19:49:49 ip-172-31-11-241 sshd[6514]: invalid user admin from 219.140.64.136</code>

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

假設我們想從下面的日志中解析出使用者:

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

我們可以像下面這樣用 cut 指令擷取用等号分割後的第八個字段的文本。這是一個 ubuntu 系統上的例子:

<code>$ grep "authentication failure" /var/log/auth.log | cut -d '=' -f 8</code>

<code>root</code>

<code>hoover</code>

<code>nagios</code>

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

<code>mar 24 08:28:18 ip-172-31-11-241 sshd[32701]: input_userauth_request: invalid user guest [preauth]</code>

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

<code>$ awk '/sshd.*invalid user/ { print $9 }' /var/log/auth.log</code>

<code>guest</code>

<code>admin</code>

<code>info</code>

<code>test</code>

<code>ubnt</code>

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

下面是一個 sshd 日志消息的例子,解析出了每個 remotehost 和 user。這是 loggly 中的一張截圖,它是一個基于雲的日志管理服務。

如何分析 Linux 日志

<code>filter{</code>

<code>grok {</code>

<code>match =&gt; {"message" =&gt; "%{ciscotimestamp:timestamp} %{host:host} %{word:program}%{notspace} %{notspace}%{number:duration}%{notspace} %{greedydata:kernel_logs}"</code>

<code>}</code>

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

如何分析 Linux 日志

過濾使得你能檢索一個特定的字段值而不是進行全文檢索。這使你的日志分析更加準确,因為它會忽略來自其它部分日志資訊不需要的比對。為了對一個字段值進行搜尋,你首先需要解析日志或者至少有對事件結構進行檢索的方式。

通常,你可能隻想看一個應用的日志。如果你的應用把記錄都儲存到一個檔案中就會很容易。如果你需要在一個聚集或集中式日志中過濾一個應用就會比較複雜。下面有幾種方法來實作:

用 rsyslog 守護程序解析和過濾日志。下面的例子将 sshd 應用的日志寫入一個名為 sshd-message 的檔案,然後丢棄事件以便它不會在其它地方重複出現。你可以将它添加到你的 rsyslog.conf 檔案中測試這個例子。

<code>:programname, isequal, “sshd” /var/log/sshd-messages</code>

<code>&amp;~</code>

用類似 awk 的指令行工具提取特定字段的值,例如 sshd 使用者名。下面是 ubuntu 系統中的一個例子。

用日志管理系統自動解析日志,然後在需要的應用名稱上點選過濾。下面是在 loggly 日志管理服務中提取 syslog 域的截圖。我們對應用名稱 “sshd” 進行過濾,如維恩圖圖示所示。

如何分析 Linux 日志

一個人最希望看到日志中的錯誤。不幸的是,預設的 syslog 配置不直接輸出錯誤的嚴重性,也就使得難以過濾它們。

<code>"&lt;%pri-text%&gt; : %timegenerated%,%hostname%,%syslogtag%,%msg%n"</code>

這個例子會按照下面的格式輸出。你可以看到該資訊中訓示錯誤的 err。

<code>&lt;authpriv.err&gt; : mar 11 18:18:00,hoover-virtualbox,su[5026]:, pam_authenticate: authentication failure</code>

你可以用 awk 或者 grep 檢索錯誤資訊。在 ubuntu 中,對這個例子,我們可以用一些文法特征,例如 . 和 &gt;,它們隻會比對這個域。

<code>$ grep '.err&gt;' /var/log/auth.log</code>

你的第二個選擇是使用日志管理系統。好的日志管理系統能自動解析 syslog 消息并抽取錯誤域。它們也允許你用簡單的點選過濾日志消息中的特定錯誤。

下面是 loggly 中一個截圖,顯示了高亮錯誤嚴重性的 syslog 域,表示我們正在過濾錯誤:

如何分析 Linux 日志

<b>原文釋出時間為:2015-08-03</b>

<b></b>

<b>本文來自雲栖社群合作夥伴“linux中國</b>

繼續閱讀