如何在 Linux 上用 SQL 語句來查詢 Apache 日誌

Gabriel Cánepa發表於2014-12-16

Linux 有一個顯著的特點,在正常情況下,你可以透過日誌分析系統日誌來了解你的系統中發生了什麼,或正在發生什麼。的確,系統日誌是系統管理員在解決系統和應用問題時最需要的第一手資源。我們將在這篇文章中著重講解 Apache HTTP web server 生成的 Apache access 日誌。

這次,我們會透過另類的途徑來分析 Apache access 日誌,我們使用的工具是 asql。asql 是一個開源的工具,它能夠允許使用者使用 SQL 語句來查詢日誌,從而透過更加友好的格式展現相同的資訊。

Apache 日誌背景知識

Apache 有兩種日誌:

  • Access log:存放在路徑 /var/log/apache2/access.log (Debian) 或者 /var/log/httpd/access_log (Red Hat)。Access Log 記錄所有 Apache web server 執行的請求。
  • Error log:存放在路徑 /var/log/apache2/error.log (Debian) 或者 /var/log/httpd/error_log (Red Hat)。Error log 記錄所有 Apache web server 報告的錯誤以及錯誤的情況。Error 情況包括(不限於)403(Forbidden,通常在請求被拒絕訪問時被報告),404(Not found,在請求資源不存在時被報告)。

雖然管理員可以透過配置 Apache 的配置檔案來自定義 Apache access log 的詳細程度,不過在這篇文章中,我們會使用預設的配置,如下:

遠端 IP - 請求時間 - 請求型別 - 響應程式碼 - 請求的 URL - 遠端的瀏覽器資訊 (也許包含作業系統資訊)

因此一個典型的 Apache 日誌條目就是下面這個樣子:

192.168.0.101 - - [22/Aug/2014:12:03:36 -0300] "GET /icons/unknown.gif HTTP/1.1" 200 519 "http://192.168.0.10/test/projects/read_json/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0"

但是 Apache error log 又是怎麼樣的呢?因為 error log 條目主要記錄 access log 中特殊的請求(你可以自定義),所以你可以透過 access log 來獲得關於錯誤情況的更多資訊(example 5 有更多細節)。

此外要提前說明的, access log 是系統級別的日誌檔案。要分析虛擬主機的日誌檔案,你需要檢查它們相應的配置檔案(例如: 在 /etc/apache2/sites-available/[virtual host name] 裡(Debian))。

在 Linux 上安裝 asql

asql 由 Perl 編寫,而且需求以下兩個 Perl 模組:SQLite 的 DBI 驅動以及 GNU readline。

在 Debian, Ubuntu 以及其衍生發行版上安裝 asql

使用基於 Debian 發行版上的 aptitude,asql 以及其依賴會被自動安裝。

# aptitude install asql

在 Fedora,CentOS,RHEL 上安裝 asql

在 CentOS 或 RHEL 上,你需要啟用 EPEL repository,然後執行以下程式碼。在 Fedora 中,直接執行以下程式碼:

# sudo yum install perl-DBD-SQLite perl-Term-Readline-Gnu
# wget http://www.steve.org.uk/Software/asql/asql-1.7.tar.gz
# tar xvfvz asql-1.7.tar.gz
# cd asql
# make install

asql 是如何工作的?

從上面程式碼中的依賴中你就可以看出來,asql 轉換未結構化的明文 Apache 日誌為結構化的 SQLite 資料庫資訊。生成的 SQLite 資料庫可以接受正常的 SQL 查詢語句。資料庫可以透過當前以及之前的日誌檔案生成,其中也包括壓縮轉換過的日誌檔案,類似 access.log.X.gz 或者 access_log.old。

首先,從命令列啟動 asql:

# asql

你會進入 asql 內建的 shell 互動介面。

輸入 help 列表可執行的命令:

首先在 asql 中載入所有的 access 日誌:

asql > load <apache-access-logs 的路徑>

比如在 Debian 下:

asql > load /var/log/apache2/access.*

在 CentOS/RHEL 下:

asql > load /var/log/httpd/access_log*

當 asql 完成對 access 日誌的載入後,我們就可以開始資料庫查詢了。注意一下,載入後生成的資料庫是 "temporary" (臨時)的,意思就是資料庫會在你退出 asql 的時候被清除。如果你想要保留資料庫,你必須先將其儲存為一個檔案。我們會在後面介紹如何這麼做(參考 example 3 和 4)。

生成的資料庫有一個名為 logs 的表。輸入下面的命令列出 logs 表中提供的域:

一個名為 .asql 的隱藏檔案,儲存於使用者的 home 目錄下,記錄使用者在 asql shell 中輸入的命令歷史。因此你可以使用方向鍵瀏覽命令歷史,按下 ENTER 來重複執行之前的命令。

asql 上的示例 SQL 查詢

下面是幾個使用 asql 針對 Apache 日誌檔案執行 SQL 查詢的示例:

Example 1:列出在 2014 年 10 月中請求的來源 / 時間以及 HTTP 狀態碼。

SELECT source, date, status FROM logs WHERE date >= '2014-10-01T00:00:00' ORDER BY source;

Example 2:從小到大顯示單個客戶端處理的請求大小(bytes)。

SELECT source, SUM(size), AS NUMBER FROM logs GROUP BY source ORDER BY Number DESC;

Example 3:在當前目錄中儲存資料庫為 [filename]。

save [filename]

這樣做可以避免使用 load 命令對日誌的語法分析所佔用的處理時間。

Example 4:在重新進入 asql 後載入資料庫。

restore [filename]

Example 5:返回 access 日誌中記錄的 error 情況。在這個例子中,我們將顯示所有返回 HTTP 狀態碼為 403(access forbidden)的請求。

SELECT source, date, status, request FROM logs WHERE status='403' ORDER BY date

這個例子想要表現的是:雖然 asql 只分析 access 日誌,我們還是可以透過使用請求的狀態域來顯示有 error 情況的請求。

小結:

我們體驗了 asql 如何幫助我們分析 Apache 日誌檔案,並將結果透過友好的格式輸出。雖然你也可以透過使用命令列的工具(例如 cat 與 grep,uniq,sort,wc 等等之間的管道)來實現類似功能,與此比較起來 asql 展示了它如同瑞士軍刀一般的強大功能,使我們在自己的需求下能夠透過標準 SQL 查詢語句來過濾日誌。

希望這篇教程能幫助到你們。

請不要拘束地將評論文章,分享文章,提出疑問。


via: http://xmodulo.com/sql-queries-apache-log-files-linux.html

作者:Gabriel Cánepa 譯者:ThomazL 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章