過濾 Apache 靜態檔案 Log

這些 log 確實佔據了不少空間,而且對於分析真正的網站流量(例如誰來看過哪篇文章)幫助較小。這主要是因為現代網頁載入時會同時請求數十個靜態檔案,導致 log 檔案迅速膨脹。

使用 SetEnvIf 過濾特定副檔名

你可以透過 Apache 的 SetEnvIf 指令,根據檔案請求的副檔名來標記不需要紀錄的請求。只要在 Apache 的設定檔(通常是網站的 VirtualHost 設定區塊)加入以下設定即可:

Apache

# 標記不需要紀錄的副檔名
SetEnvIf Request_URI "\.(?:gif|jpe?g|png|ico|css|js|swf|woff2?|svg)$" dontlog

# 在 CustomLog 指令最後加上 env=!dontlog
CustomLog ${APACHE_LOG_DIR}/other_vhosts_access.log combined env=!dontlog

這段設定的作用是:如果請求的網址結尾是 css 或 js 等檔案,系統會賦予它一個名為 dontlog 的環境變數。而在輸出 log 時,後方的 env=!dontlog 則告訴 Apache,只有在沒有這個標記的情況下才寫入檔案。


過濾 Log 的優缺點

減少紀錄靜態檔案可以讓 log 變得易讀,也能稍微減輕磁碟寫入的負擔。不過,如果你未來需要排查網頁樣式載入失敗(例如 404 錯誤)或某些資安攻擊,少了這些 log 就會比較難追蹤。

如果你希望在保留 log 的同時又不影響閱讀主流程,也可以考慮將靜態檔案的 log 導向另一個獨立的檔案:

Apache

CustomLog ${APACHE_LOG_DIR}/static_assets.log combined env=dontlog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!dontlog

這樣你就能在 access.log 中看到乾淨的頁面存取紀錄,而把瑣碎的靜態資源存取留在另一個檔案備查。


要修改 Apache 設定,請找到負責該網站的設定檔(通常位在 /etc/apache2/sites-enabled/ 目錄下),並依照下列步驟調整。

修改步驟

請在 VirtualHost 區塊內加入過濾邏輯。如果你的 log 格式包含虛擬主機名稱(如你提供的範例),通常對應的是 vhost_combined 格式:

Apache

<VirtualHost *:443>
    ServerName stackoverflow.max-everyday.com

    # 1. 定義哪些副檔名不要記錄
    SetEnvIf Request_URI "\.(?:css|js|png|jpg|jpeg|gif|ico|woff|woff2?|svg)$" dontlog

    # 2. 修改 CustomLog,在最後加上 env=!dontlog
    # 請根據你原本的 log 路徑與格式名稱修改
    CustomLog ${APACHE_LOG_DIR}/other_vhosts_access.log vhost_combined env=!dontlog

    # 其他設定...
</VirtualHost>

注意事項

修改完成後,必須重新載入 Apache 設定才會生效:

  1. 先檢查語法是否正確:使用指令
    sudo apache2ctl configtest
  2. 重新載入設定:使用指令
    sudo systemctl reload apache2

這樣一來,未來所有對 .js 或 .css 的正常存取就不會出現在這個 log 檔案中,讓你能專注於分析網頁的存取行為。

需要我解釋如何針對特定的 IP 地址(例如你自己的機器)也排除在 log 之外嗎?

About the author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *