使用MySQL語(yǔ)句來(lái)查詢(xún)Apache服務(wù)器日志的方法
Linux 有一個(gè)顯著的特點(diǎn),在正常情況下,你可以通過(guò)日志分析系統(tǒng)日志來(lái)了解你的系統(tǒng)中發(fā)生了什么,或正在發(fā)生什么。的確,系統(tǒng)日志是系統(tǒng)管理員在解決系統(tǒng)和應(yīng)用問(wèn)題時(shí)最需要的第一手資源。我們將在這篇文章中著重講解 Apache HTTP web server 生成的 Apache access 日志。
這次,我們會(huì)通過(guò)另類(lèi)的途徑來(lái)分析 Apache access 日志,我們使用的工具是 asql。asql 是一個(gè)開(kāi)源的工具,它能夠允許使用者使用 SQL 語(yǔ)句來(lái)查詢(xún)?nèi)罩?,從而通過(guò)更加友好的格式展現(xiàn)相同的信息。
Apache 日志背景知識(shí)
Apache 有兩種日志:
- Access log:存放在路徑 /var/log/apache2/access.log (Debian) 或者 /var/log/httpd/access_log (Red Hat)。Access Log 記錄所有 Apache web server 執(zhí)行的請(qǐng)求。
- Error log:存放在路徑 /var/log/apache2/error.log (Debian) 或者 /var/log/httpd/error_log (Red Hat)。Error log 記錄所有 Apache web server 報(bào)告的錯(cuò)誤以及錯(cuò)誤的情況。Error 情況包括(不限于)403(Forbidden,通常在請(qǐng)求被拒絕訪(fǎng)問(wèn)時(shí)被報(bào)告),404(Not found,在請(qǐng)求資源不存在時(shí)被報(bào)告)。
雖然管理員可以通過(guò)配置 Apache 的配置文件來(lái)自定義 Apache access log 的詳細(xì)程度,不過(guò)在這篇文章中,我們會(huì)使用默認(rèn)的配置,如下:
因此一個(gè)典型的 Apache 日志條目就是下面這個(gè)樣子:
但是 Apache error log 又是怎么樣的呢?因?yàn)?error log 條目主要記錄 access log 中特殊的請(qǐng)求(你可以自定義),所以你可以通過(guò) access log 來(lái)獲得關(guān)于錯(cuò)誤情況的更多信息(example 5 有更多細(xì)節(jié))。
此外要提前說(shuō)明的, access log 是系統(tǒng)級(jí)別的日志文件。要分析虛擬主機(jī)的日志文件,你需要檢查它們相應(yīng)的配置文件(例如: 在 /etc/apache2/sites-available/[virtual host name] 里(Debian))。
在 Linux 上安裝 asql
asql 由 Perl 編寫(xiě),而且需求以下兩個(gè) Perl 模塊:SQLite 的 DBI 驅(qū)動(dòng)以及 GNU readline。
在 Debian, Ubuntu 以及其衍生發(fā)行版上安裝 asql
使用基于 Debian 發(fā)行版上的 aptitude,asql 以及其依賴(lài)會(huì)被自動(dòng)安裝。
# aptitude install asql
在 Fedora,CentOS,RHEL 上安裝 asql
在 CentOS 或 RHEL 上,你需要啟用 EPEL repository,然后運(yùn)行以下代碼。在 Fedora 中,直接運(yùn)行以下代碼:
# 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 是如何工作的?
從上面代碼中的依賴(lài)中你就可以看出來(lái),asql 轉(zhuǎn)換未結(jié)構(gòu)化的明文 Apache 日志為結(jié)構(gòu)化的 SQLite 數(shù)據(jù)庫(kù)信息。生成的 SQLite 數(shù)據(jù)庫(kù)可以接受正常的 SQL 查詢(xún)語(yǔ)句。數(shù)據(jù)庫(kù)可以通過(guò)當(dāng)前以及之前的日志文件生成,其中也包括壓縮轉(zhuǎn)換過(guò)的日志文件,類(lèi)似 access.log.X.gz 或者 access_log.old。
首先,從命令行啟動(dòng) asql:
# asql
你會(huì)進(jìn)入 asql 內(nèi)置的 shell 交互界面。
輸入 help 列表可執(zhí)行的命令:
首先在 asql 中加載所有的 access 日志:
比如在 Debian 下:
在 CentOS/RHEL 下:
當(dāng) asql 完成對(duì) access 日志的加載后,我們就可以開(kāi)始數(shù)據(jù)庫(kù)查詢(xún)了。注意一下,加載后生成的數(shù)據(jù)庫(kù)是 "temporary" (臨時(shí))的,意思就是數(shù)據(jù)庫(kù)會(huì)在你退出 asql 的時(shí)候被清除。如果你想要保留數(shù)據(jù)庫(kù),你必須先將其保存為一個(gè)文件。我們會(huì)在后面介紹如何這么做(參考 example 3 和 4)。
生成的數(shù)據(jù)庫(kù)有一個(gè)名為 logs 的表。輸入下面的命令列出 logs 表中提供的域:
一個(gè)名為 .asql 的隱藏文件,保存于用戶(hù)的 home 目錄下,記錄用戶(hù)在 asql shell 中輸入的命令歷史。因此你可以使用方向鍵瀏覽命令歷史,按下 ENTER 來(lái)重復(fù)執(zhí)行之前的命令。
asql 上的示例 SQL 查詢(xún)
下面是幾個(gè)使用 asql 針對(duì) Apache 日志文件運(yùn)行 SQL 查詢(xún)的示例:
Example 1:列出在 2014 年 10 月中請(qǐng)求的來(lái)源 / 時(shí)間以及 HTTP 狀態(tài)碼。
SELECT source, date, status FROM logs WHERE date >= '2014-10-01T00:00:00' ORDER BY source;
Example 2:從小到大顯示單個(gè)客戶(hù)端處理的請(qǐng)求大?。╞ytes)。
SELECT source, SUM(size), AS NUMBER FROM logs GROUP BY source ORDER BY Number DESC;
Example 3:在當(dāng)前目錄中保存數(shù)據(jù)庫(kù)為 [filename]。
這樣做可以避免使用 load 命令對(duì)日志的語(yǔ)法分析所占用的處理時(shí)間。
Example 4:在重新進(jìn)入 asql 后載入數(shù)據(jù)庫(kù)。
Example 5:返回 access 日志中記錄的 error 情況。在這個(gè)例子中,我們將顯示所有返回 HTTP 狀態(tài)碼為 403(access forbidden)的請(qǐng)求。
SELECT source, date, status, request FROM logs WHERE status='403' ORDER BY date
這個(gè)例子想要表現(xiàn)的是:雖然 asql 只分析 access 日志,我們還是可以通過(guò)使用請(qǐng)求的狀態(tài)域來(lái)顯示有 error 情況的請(qǐng)求。
小結(jié):
我們體驗(yàn)了 asql 如何幫助我們分析 Apache 日志文件,并將結(jié)果通過(guò)友好的格式輸出。雖然你也可以通過(guò)使用命令行的工具(例如 cat 與 grep,uniq,sort,wc 等等之間的管道)來(lái)實(shí)現(xiàn)類(lèi)似功能,與此比較起來(lái) asql 展示了它如同瑞士軍刀一般的強(qiáng)大功能,使我們?cè)谧约旱男枨笙履軌蛲ㄟ^(guò)標(biāo)準(zhǔn) SQL 查詢(xún)語(yǔ)句來(lái)過(guò)濾日志。
希望這篇教程能幫助到你們。
- Windows服務(wù)器MySQL中文亂碼的解決方法
- MySQL服務(wù)器連接過(guò)程淺析
- 防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案
- 在Ubuntu或Debian系統(tǒng)的服務(wù)器上卸載MySQL的方法
- 解決Mysql服務(wù)器啟動(dòng)時(shí)報(bào)錯(cuò)問(wèn)題的方法
- win2008 R2服務(wù)器下修改MySQL 5.5數(shù)據(jù)庫(kù)data目錄的方法
- MySQL數(shù)據(jù)庫(kù)InnoDB引擎下服務(wù)器斷電數(shù)據(jù)恢復(fù)方法
- 拋棄 PHP 代價(jià)太高
相關(guān)文章
Oracle中實(shí)現(xiàn)MySQL show index from table命令SQL腳本分享
這篇文章主要介紹了Oracle中實(shí)現(xiàn)MySQL show index from table命令SQL腳本分享,本文只是模擬了Mysql中的show index from table命令,需要的朋友可以參考下2014-10-10oracle 數(shù)據(jù)庫(kù)啟動(dòng)階段分析
這篇文章主要介紹了oracle 數(shù)據(jù)庫(kù)啟動(dòng)階段分析,包括三個(gè)階段的詳細(xì)介紹,需要的朋友可以了解下。2017-09-09oracle創(chuàng)建用戶(hù)過(guò)程詳解
這篇文章主要介紹了oracle創(chuàng)建用戶(hù)過(guò)程詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Oracle 使用TOAD實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel數(shù)據(jù)
本文主要介紹Oracle中使用TOAD工具實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的功能,希望能幫到大家。2016-05-05oracle中commit之后進(jìn)行數(shù)據(jù)回滾的方法
這篇文章主要介紹了oracle中commit之后如何進(jìn)行數(shù)據(jù)回滾,本文給大家分享兩種方法,每種方法都給大家介紹的比較詳細(xì),需要的朋友可以參考下2021-12-12Oracle數(shù)據(jù)庫(kù)表空間超詳細(xì)介紹
Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)存放在表空間中,表空間是一個(gè)邏輯的概念,它是由數(shù)據(jù)文件組成,表空間大小由數(shù)據(jù)文件的數(shù)量和大小決定,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)表空間的相關(guān)資料,需要的朋友可以參考下2023-05-05