使用這個 Python 工具分析你的 Web 伺服器日誌文件
是否想知道有多少訪問者訪問過你的網站?或哪個頁面、文章或下載最受歡迎?如果你是自託管的博客或網站,那麼無論你使用的是 Apache、Nginx 還是 Microsoft IIS(是的,沒錯),lars都可以為你提供幫助。
Lars 是 Python 寫的 Web 伺服器日誌工具包。這意味著你可以使用 Python 通過簡單的代碼來回溯(或實時)解析日誌,並對數據做任何你想做的事:將它存儲在資料庫中、另存為 CSV 文件,或者立即使用 Python 進行更多分析。
Lars 是 Dave Jones 寫的另一個隱藏的寶石。我最初是在本地 Python 用戶組中看到 Dave 演示 lars。幾年後,我們開始在 piwheels 項目中使用它來讀取 Apache 日誌並將行插入到我們的 Postgres 資料庫中。當樹莓派用戶從 piwheels.org下載 Python 包時,我們會記錄文件名、時間戳、系統架構(Arm 版本)、發行版名稱/版本,Python 版本等。由於它是一個關係資料庫,因此我們可以將這些結果加入其他表中以獲得有關文件的更多上下文信息。
你可以使用以下方法安裝lars:
$ pip install lars
在某些系統上,正確的方式是 sudo
pip3 install lars
。
首先,找到一個 Web 訪問日誌並製作一個副本。你需要將日誌文件下載到計算機上進行操作。我在示例中使用的是 Apache 日誌,但是經過一些小(且直觀)的更改,你可以使用 Nginx 或 IIS。在典型的 Web 伺服器上,你會在 /var/log/apache2/
中找到 Apache 日誌,通常是 access.log
、ssl_access.log
(對於 HTTPS)或 gzip 壓縮後的輪轉日誌文件,如 access-20200101.gz
或者 ssl_access-20200101.gz
。
首先,日誌是什麼樣的?
81.174.152.222 - - [30/Jun/2020:23:38:03 +0000] "GET / HTTP/1.1" 200 6763 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0"
這是一個顯示了請求源 IP 地址、時間戳、請求文件路徑(在本例中是主頁 /
)、HTTP 狀態代碼,用戶代理(Ubuntu 上的 Firefox)等的請求。
你的日誌文件將充滿這樣的條目,不僅是每個打開的頁面,還包括返回的每個文件和資源:每個 CSS 樣式表、JavaScript 文件和圖像,每個 404 請求、每個重定向、每個爬蟲。要從日誌中獲取有意義的數據,你需要對條目進行解析、過濾和排序。這就是 Lars 的用處。本示例將打開一個日誌文件並列印每一行的內容:
with open('ssl_access.log') as f:
with ApacheSource(f) as source:
for row in source:
print(row)
它會為每條日誌顯示如下結果:
Row(remote_host=IPv4Address('81.174.152.222'), ident=None, remote_user=None, time=DateTime(2020, 6, 30, 23, 38, 3), request=Request(method='GET', url=Url(scheme='', netloc='', path_str='/', params='', query_str='', fragment=''), protocol='HTTP/1.1'), status=200, size=6763)
它解析了日誌條目,並將數據放入結構化格式中。該條目已成為具有與條目數據相關屬性的 命名元組 ,因此,例如,你可以使用 row.status
訪問狀態代碼,並使用 row.request.url.path_str
訪問路徑:
with open('ssl_access.log') as f:
with ApacheSource(f) as source:
for row in source:
print(f'hit {row.request.url.path_str} with status code {row.status}')
如果你只想顯示 404 請求,可以執行以下操作:
with open('ssl_access.log') as f:
with ApacheSource(f) as source:
for row in source:
if row.status == 404:
print(row.request.url.path_str)
你可能要對這些數據去重,並列印獨立的 404 頁面數量:
s = set()
with open('ssl_access.log') as f:
with ApacheSource(f) as source:
for row in source:
if row.status == 404:
s.add(row.request.url.path_str)
print(len(s))
我和 Dave 一直在努力擴展 piwheel 的日誌記錄器,使其包含網頁點擊量、軟體包搜索等內容,歸功於 lars,這些並不難。它不會告訴我們有關用戶的任何答案。我們仍然需要進行數據分析,但它去掉了複雜不便的文件格式,並以我們可以利用的方式將它放入我們的資料庫。
查閱 lars 的文檔,以了解如何讀取 Apache、Nginx 和 IIS 日誌,並了解你還可以使用它做什麼。再次感謝 Dave 提供的出色工具!
最初發布在 Ben Nuttall 的 Tooling Blog 中,並獲許重新發布。
via: https://opensource.com/article/20/7/python-lars
作者:Ben Nuttall 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive