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")        # 错误示例:缺少日志级别
            }
        }
    }
}

验证步骤:

  1. 执行 openresty -t 检查配置语法
  2. 使用 ls -l /var/log/openresty 确认目录权限
  3. 运行 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日志核心机制

内存日志缓冲区工作原理:

  1. 接收日志写入请求
  2. 暂存至内存缓冲区
  3. 满足以下任一条件即触发刷盘:
    • 缓冲区达到设定容量
    • 超过flush参数指定时间
    • worker进程关闭

6. 避坑指南与最佳实践

6.1 必须遵守的军规

  1. 生产环境禁用debug日志级别
  2. 日志文件必须做滚动切割
  3. 敏感信息过滤(身份证、银行卡号等)
  4. 定期检查磁盘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. 未来日志演进方向

随着业务规模扩大,建议逐步实施:

  1. 结构化日志改造(JSON格式)
  2. 实时日志分析管道建设
  3. 自适应日志级别控制系统
  4. 基于机器学习的异常检测