1. 当监控摄像头罢工时
想象你正在运营一个大型电商平台,某天突然发现用户支付成功的记录全部消失。这就像商场里的监控摄像头集体罢工,既找不到交易凭证,也无法追溯问题根源。OpenResty作为Nginx的增强版本,其日志系统就是这样的"监控摄像头"。但当这个摄像头出现故障时,我们需要像侦探一样展开排查。
2. 基础排查三板斧
2.1 查看配置文件
# 典型错误示例:日志路径写错
http {
log_format main '$remote_addr - $request';
access_log /var/log/openresty/access.log main; # 正确写法
# access_log /non_exist_dir/access.log main; # 错误示例:目录不存在
server {
location /pay {
content_by_lua_block {
ngx.log(ngx.INFO, "Payment processed") # 日志级别正确
-- ngx.log("Payment processed") # 错误示例:缺少日志级别
}
}
}
}
验证步骤:
- 执行
openresty -t
检查配置语法 - 使用
ls -l /var/log/openresty
确认目录权限 - 运行
tail -f error.log
实时观察错误日志
2.2 日志等级捉迷藏
-- 正确的多级日志示例
local function process_order()
ngx.log(ngx.DEBUG, "Entering order processing")
-- 业务逻辑...
ngx.log(ngx.INFO, "Order total: ¥", amount)
end
-- 常见错误场景
if payment_failed then
ngx.log("Payment failed") -- 错误:缺少日志级别参数
end
日志级别对照表:
- ngx.STDERR (直接输出到stderr)
- ngx.EMERG (紧急)
- ngx.ALERT (警报)
- ngx.CRIT (严重)
- ngx.ERR (错误)
- ngx.WARN (警告)
- ngx.NOTICE (注意)
- ngx.INFO (信息)
- ngx.DEBUG (调试)
2.3 文件权限迷宫
# 典型权限问题排查流程
$ ps aux | grep nginx # 查看运行用户
www-data 1234 0.0 0.1 23456 6789 ? S 10:00 0:00 nginx: worker process
$ ls -ld /var/log/openresty # 检查目录权限
drwxr-x--- 2 root root 4096 Jun 15 10:00 /var/log/openresty
$ sudo chown www-data:www-data /var/log/openresty # 修正权限
$ sudo chmod 755 /var/log/openresty
3. 高级故障诊断
3.1 缓冲区引发的"血案"
http {
access_log /var/log/openresty/access.log main buffer=32k; # 推荐设置
# access_log /var/log/openresty/access.log main buffer=0; # 禁用缓冲(慎用)
lua_shared_dict log_buffer 10m; # 创建共享内存区
}
缓冲区参数解析:
- buffer=32k:设置32KB内存缓冲区
- flush=5s:最多5秒刷盘一次
- gzip=level:压缩级别(需安装zlib)
3.2 当Lua遇上Nginx日志
location /api {
log_by_lua_block {
local latency = tonumber(ngx.var.request_time) * 1000
if latency > 500 then
ngx.log(ngx.WARN, "Slow request: ", latency, "ms")
end
-- 记录自定义变量到日志
ngx.var.custom_log_field = "API_" .. ngx.var.request_method
}
}
log_format main '$remote_addr - $custom_log_field - $request_time';
4. 实战案例分析
4.1 日志文件黑洞事件
现象描述: 某金融系统在双十一期间突然出现日志断流,持续3小时后恢复。经排查发现日志文件达到2TB导致磁盘写满。
解决方案:
# 日志切割方案
#!/bin/bash
DATE=$(date +%Y%m%d)
mv /var/log/openresty/access.log /var/log/openresty/access_${DATE}.log
kill -USR1 $(cat /usr/local/openresty/nginx/logs/nginx.pid)
4.2 跨服务器日志同步难题
使用rsyslog实现集中管理:
# OpenResty配置
access_log syslog:server=10.0.0.1:514,facility=local7,tag=nginx_access main;
# rsyslog配置(10.0.0.1)
$ cat /etc/rsyslog.d/nginx.conf
local7.* /var/log/remote/nginx/access.log
5. 技术选型深度解析
5.1 日志方案对比表
方案 | 写入性能 | 查询便利性 | 资源消耗 | 适用场景 |
---|---|---|---|---|
文件日志 | ★★★★ | ★★ | 低 | 小型系统 |
Syslog | ★★★ | ★★★ | 中 | 集中式日志 |
ELK | ★★ | ★★★★★ | 高 | 大数据分析 |
云平台日志 | ★★ | ★★★★★ | 高 | 云端服务 |
5.2 OpenResty日志核心机制
内存日志缓冲区工作原理:
- 接收日志写入请求
- 暂存至内存缓冲区
- 满足以下任一条件即触发刷盘:
- 缓冲区达到设定容量
- 超过flush参数指定时间
- worker进程关闭
6. 避坑指南与最佳实践
6.1 必须遵守的军规
- 生产环境禁用debug日志级别
- 日志文件必须做滚动切割
- 敏感信息过滤(身份证、银行卡号等)
- 定期检查磁盘inode使用量
6.2 性能优化参数调优
# 高性能日志配置模板
http {
open_log_file_cache max=1000 inactive=60s;
access_log /var/log/openresty/access.log main buffer=64k flush=3s;
error_log /var/log/openresty/error.log warn;
lua_shared_dict log_cache 100m;
lua_socket_log_errors off;
}
7. 未来日志演进方向
随着业务规模扩大,建议逐步实施:
- 结构化日志改造(JSON格式)
- 实时日志分析管道建设
- 自适应日志级别控制系统
- 基于机器学习的异常检测