Apache 和 Nginx 日志是排查 Web 问题、识别攻击、分析用户行为的核心依据,关键在于理解日志结构、掌握高效筛选逻辑并快速定位异常;需关注 remote_addr、time_local、request、status 等字段含义,结合 awk/grep 快速分析 5xx 错误、慢请求、TOP IP、扫描行为等,并落实日志轮转与脱敏策略。

Apache 和 Nginx 日志是排查 Web 服务问题、识别攻击行为、分析用户访问模式的核心依据。关键不在于堆砌工具,而在于理解日志结构、掌握高效筛选逻辑、快速定位异常线索。
看懂日志格式:从字段含义开始
Apache 默认使用 combined 格式,Nginx 默认是 log_format combined,两者字段高度一致:
- remote_addr:客户端真实 IP(注意:若前端有代理,这里可能是代理 IP,需检查 X-Forwarded-For)
- time_local:请求到达服务器的本地时间(非响应时间)
-
request:HTTP 方法 + URI + 协议,如
"GET /api/v1/users HTTP/1.1" - status:HTTP 状态码(404、502、499 等需重点关注)
- body_bytes_sent:响应体字节数(不含响应头),为 0 可能表示空响应或重定向
- http_referer:来源页面(空字符串或 "-" 表示直接访问)
- http_user_agent:客户端标识(含爬虫、浏览器、移动端特征)
高频排查场景与对应命令
不用打开完整日志文件,用管道组合基础命令就能解决 80% 的日常问题:
- 查最近 100 条 5xx 错误:
tail -100 access.log | awk '$9 ~ /^5/ {print}' - 找耗时长的请求(假设第 10 字段是 $request_time,在 Nginx 中启用后):
awk '$10 > 2.0 {print $1, $7, $9, $10}' access.log | sort -k4nr | head -20 - 统计 TOP 10 访问 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10 - 识别疑似扫描行为(高频 404 + 非常规路径):
awk '$9 == 404 && $7 ~ /phpmyadmin|wp-admin|\.git|\.env/ {print $1, $7}' access.log | head -15
进阶技巧:用 awk/grep 做轻量聚合
避免导入数据库也能做有效分析:
- 按小时统计请求数:
awk '{print substr($4,2,13)}' access.log | sort | uniq -c(提取 "[10/Jan/2024:14" 这类前13字符) - 分离静态资源请求(提升缓存判断效率):
awk '$7 ~ /\.(js|css|png|jpg|gif|woff2?)$/ {print $7, $9, $10}' access.log - 标记疑似恶意 UA:
grep -E 'sqlmap|nikto|dirbuster|wget.*-r' access.log | awk '{print $1, $12}'
日志轮转与保留策略建议
日志不是存得越久越好,关键是可查、可控、可清理:
- Nginx:在
nginx.conf中配置logrotate或用rotate指令配合脚本,建议单文件不超过 100MB - Apache:通过
rotatelogs或系统级 logrotate 管理,禁用CustomLog "|..."类实时管道写入(易阻塞) - 保留周期参考:业务日志 7 天,安全审计类(含错误/访问异常)30 天,核心接口调用日志可压缩归档 90 天
- 敏感字段脱敏:若日志含手机号、token 参数,应在写入前用 Lua(Nginx)或 RewriteRule(Apache)过滤或掩码
不复杂但容易忽略。日志的价值不在量,而在你能多快从中拎出那条关键线索。










