天天看點

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

linux 有一個顯著的特點,在正常情況下,你可以通過日志分析系統日志來了解你的系統中發生了什麼,或正在發生什麼。的确,系統日志是系統管理者在解決系統和應用問題時最需要的第一手資源。我們将在這篇文章中着重講解 apache http web server 生成的 apache access 日志。

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

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

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))。

asql 由 perl 編寫,而且需求以下兩個 perl 子產品:sqlite 的 dbi 驅動以及 gnu readline。

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

# aptitude install asql

# 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 轉換未結構化的明文 apache 日志為結構化的 sqlite 資料庫資訊。生成的 sqlite 資料庫可以接受正常的 sql 查詢語句。資料庫可以通過目前以及之前的日志檔案生成,其中也包括壓縮轉換過的日志檔案,類似 access.log.x.gz 或者 access_log.old。

首先,從指令行啟動 asql:

# asql

你會進入 asql 内置的 shell 互動界面。

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

輸入 help 清單可執行的指令:

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

首先在 asql 中加載所有的 access 日志:

asql &gt; load &lt;apache-access-logs 的路徑&gt;

比如在 debian 下:

asql &gt; load /var/log/apache2/access.*

在 centos/rhel 下:

asql &gt; load /var/log/httpd/access_log*

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

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

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

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

一個名為 .asql 的隐藏檔案,儲存于使用者的 home 目錄下,記錄使用者在 asql shell 中輸入的指令曆史。是以你可以使用方向鍵浏覽指令曆史,按下 enter 來重複執行之前的指令。

下面是幾個使用 asql 針對 apache 日志檔案運作 sql 查詢的示例:

example 1:列出在 2014 年 10 月中請求的來源 / 時間以及 http 狀态碼。

select source, date, status from logs where date &gt;= '2014-10-01t00:00:00' order by source;

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

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

select source, sum(size), as number from logs group by source order by number desc;

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

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

save [filename]

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

這樣做可以避免使用 load 指令對日志的文法分析所占用的處理時間。

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

restore [filename]

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

example 5:傳回 access 日志中記錄的 error 情況。在這個例子中,我們将顯示所有傳回 http 狀态碼為 403(access forbidden)的請求。

select source, date, status, request from logs where status='403' order by date

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

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

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

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

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

原文釋出時間:2014-12-09

本文來自雲栖合作夥伴“linux中國”