Linux 系統管理核心技能之一是日誌分析。Apache HTTP Server 產生的 access.log 記錄所有請求,傳統用 grep/awk/sort 處理雖強大但語法繁瑣。asql 將非結構化日誌轉為 SQLite 資料庫,讓你用熟悉的 SQL 語法靈活查詢分析。
| 日誌類型 | 預設路徑 (Debian/Ubuntu) | 預設路徑 (RHEL/CentOS) | 用途 |
|---|---|---|---|
| Access Log | /var/log/apache2/access.log | /var/log/httpd/access_log | 記錄所有 HTTP 請求 (IP、時間、方法、URL、狀態碼、User-Agent) |
| Error Log | /var/log/apache2/error.log | /var/log/httpd/error_log | 記錄伺服器錯誤 (403/404/500 等) |
預設 Access Log 格式 (Combined Log Format):
192.168.0.101 - - [22/Aug/2014:12:03:36 -0300] "GET /icons/unknown.gif HTTP/1.1" 200 519 "https://referer" "Mozilla/5.0 ..."
欄位對應:Remote IP - Request Time - Request Line - Status Code - Response Size - Referer - User-Agent
sudo aptitude update && sudo aptitude install asql
依賴 perl-DBD-SQLite、perl-Term-Readline-Gnu 會自動解決。
# 啟用 EPEL (CentOS/RHEL)
sudo yum install epel-release
# 安裝 Perl 依賴
sudo yum install perl-DBD-SQLite perl-Term-Readline-Gnu
# 下載編譯 asql (無現成 RPM)
wget https://www.steve.org.uk/Software/asql/asql-1.7.tar.gz
tar xzf asql-1.7.tar.gz
cd asql
sudo make install
access.log* 萬用字元、.gz 壓縮檔)。logs,欄位對應日誌結構。save 持久化。# 1. 啟動
asql
# 2. 載入日誌 (Debian 範例)
asql> load /var/log/apache2/access.*
# 3. 查看表結構
asql> schema logs
# 4. 執行 SQL 查詢
asql> SELECT source, date, status FROM logs WHERE date >= '2014-10-01' ORDER BY source;
# 5. 持久化資料庫 (避免下次重新解析)
asql> save apache_logs.db
# 6. 退出
asql> quit
# 7. 下次直接還原
asql> restore apache_logs.db
SELECT source, date, status
FROM logs
WHERE date >= '2014-10-01T00:00:00'
ORDER BY source;
SELECT source, SUM(size) AS total_bytes
FROM logs
GROUP BY source
ORDER BY total_bytes DESC;
asql> save my_apache_analysis.db
asql> restore my_apache_analysis.db
SELECT source, date, status, request
FROM logs
WHERE status = '403'
ORDER BY date;
關鍵洞察:雖然 asql 僅解析 Access Log,但狀態碼欄位已包含錯誤資訊,無需額外解析 Error Log 即可定位權限/不存在資源問題。
load /var/log/apache2/vhost_*.log。~/.asql 自動記錄,支援上下鍵瀏覽重跑。asql -c "QUERY" 產出每日/每小時統計報表。asql 以 SQL 統一介面 橋接系統管理與資料分析,將日誌分析門檻大幅降低。對比傳統管道指令,asql 優勢在於:
下次面對幾 GB 的 Access Log 需快速定位異常流量、Top URL、錯誤分布時,請嘗試 asql —— 你的瑞士軍刀。