Debian LAMP(Linux、Apache、MySQL、PHP)環境中的日志管理是系統維護的關鍵環節,涵蓋日志定位、查看、輪轉、分析及優化等步驟,以下是具體方法:
LAMP組件的日志文件主要存儲在/var/log
目錄下,常見文件及作用如下:
/var/log/syslog
(系統通用日志)、/var/log/auth.log
(認證日志,如登錄嘗試)、/var/log/kern.log
(內核日志);/var/log/apache2/access.log
(訪問日志,記錄客戶端請求)、/var/log/apache2/error.log
(錯誤日志,記錄服務器錯誤);/var/log/mysql/error.log
(錯誤日志,記錄數據庫啟動及運行錯誤)、/var/log/mysql/general.log
(查詢日志,記錄所有SQL語句)、/var/log/mysql/slow.log
(慢查詢日志,記錄執行時間超過閾值的SQL);/var/log/php-fpm.log
(PHP-FPM錯誤日志,記錄PHP進程運行錯誤)、/var/log/php_errors.log
(PHP腳本錯誤日志,記錄腳本級別的錯誤)。tail
:實時查看日志末尾內容,如tail -f /var/log/apache2/access.log
(實時監控Apache訪問日志);grep
:過濾關鍵詞,如grep "ERROR" /var/log/mysql/error.log
(查找MySQL錯誤日志中的“ERROR”條目);less
:分頁查看日志,如less /var/log/syslog
(逐頁瀏覽系統日志);journalctl
:查看systemd服務的日志,如journalctl -u apache2
(查看Apache服務日志)、journalctl --since "2025-01-01" --until "2025-01-31"
(查看指定時間范圍的日志)。gnomesystemlog
(GNOME桌面):打開“應用程序→系統工具→系統日志”,選擇日志類型(如系統日志、認證日志),可通過搜索框過濾內容;ksystemlog
(KDE桌面):打開“應用程序→系統→系統日志”,功能類似gnomesystemlog
。使用logrotate
工具自動輪轉日志,避免日志文件過大占用磁盤空間。常見配置如下:
編輯/etc/logrotate.d/apache2
(若不存在則創建),添加以下內容:
/var/log/apache2/*.log {
weekly # 每周輪轉一次
rotate 52 # 保留52個歷史日志(約一年)
compress # 壓縮舊日志(如access.log.1.gz)
delaycompress # 延遲壓縮(當前輪轉的日志不壓縮,下次輪轉時再壓縮)
missingok # 若日志文件缺失,不報錯
notifempty # 若日志為空,不輪轉
create 640 root adm # 輪轉后創建新日志,權限640,屬主root,屬組adm
sharedscripts # 所有日志輪轉完成后執行postrotate腳本
postrotate
if invoke-rc.d apache2 status > /dev/null; then
invoke-rc.d apache2 reload > /dev/null;
fi
endscript
}
測試配置是否正確:sudo logrotate -d /etc/logrotate.d/apache2
(模擬運行,不實際執行);手動觸發輪轉:sudo logrotate -f /etc/logrotate.d/apache2
。
編輯/etc/logrotate.d/mysql
,配置如下:
/var/log/mysql/*.log {
daily # 每天輪轉一次
rotate 7 # 保留7個歷史日志
compress # 壓縮舊日志
missingok # 日志缺失不報錯
notifempty # 日志為空不輪轉
postrotate
/etc/init.d/mysql reload > /dev/null
endscript
}
編輯/etc/logrotate.d/php-fpm
(針對PHP-FPM日志),配置示例:
/var/log/php-fpm.log {
copytruncate # 復制日志文件后清空原文件(避免重啟PHP-FPM)
daily # 每天輪轉
rotate 7 # 保留7天
compress # 壓縮
missingok # 日志缺失不報錯
notifempty # 日志為空不輪轉
create 640 root adm # 新日志權限及屬主
}
grep "ERROR" /var/log/mysql/error.log | wc -l
(統計MySQL錯誤日志中的錯誤條目數);awk '{print $1}' /var/log/apache2/access.log
(提取訪問日志中的客戶端IP);grep -oP '(?<=HTTP/1\.[01]" )\d{3}' /var/log/apache2/access.log | sort | uniq -c
(統計不同HTTP狀態碼的出現次數)。sudo apt install goaccess
;使用:goaccess /var/log/apache2/access.log -o /var/www/html/report.html --log-format=COMBINED
(生成HTML報告);/etc/apache2/apache2.conf
,修改LogLevel
指令(如LogLevel warn
,僅記錄警告及以上級別的日志,減少日志量);/etc/mysql/my.cnf
,調整log_error_verbosity
(如log_error_verbosity=2
,僅記錄錯誤和警告)。rotatelogs
工具限制單個日志文件大小,如ErrorLog "|/usr/bin/rotatelogs /var/log/apache2/error-%Y-%m-%d.log 86400"
(每天生成一個新日志文件,大小約86400字節);max_binlog_size
(如max_binlog_size=100M
,限制二進制日志文件大小為100MB)。使用find
命令刪除過期日志,如find /var/log/apache2 -type f -mtime +30 -name "*.log" -delete
(刪除30天前的Apache日志文件);或通過cron
定時任務自動執行(如每天凌晨2點清理)。