Nginx 和 Nginx-Ingress-Controller 配置 JSON 日志格式

如果在 公众号 文章发现状态为 已更新, 建议点击 查看原文 查看最新内容。

状态: 未更新

原文链接: https://typonotes.com/posts/2023/05/08/nginx-log-format/

Nginx

注意: 列表中的字段仅仅是 Demo ,根据自己实际需求进行增删。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "time": "$time_iso8601",
  "remote_addr": "$remote_addr",
  "remote_user": "$remote_user",
  "request_method": "$request_method",
  "host": "$host",
  "request_uri": "$request_uri",
  "status": "$status",
  "request_time": "$request_time",
  "cost": "$request_time",
  "body_bytes_sent": "$body_bytes_sent",
  "http_referer": "$http_referer",
  "http_user_agent": "$http_user_agent",
  "request_length": "$request_length",
  "upstream_addr": "$upstream_addr",
  "upstream_response_length": "$upstream_response_length",
  "upstream_response_time": "$upstream_response_time",
  "upstream_status": "$upstream_status",
  "opentelemetry_context_traceparent":"$opentelemetry_context_traceparent",
  "trace_id": "$opentelemetry_trace_id",
  "span_id": "$opentelemetry_span_id"
}
  1. Nginx 提供了多种 时间格式 变量, 包括 time_iso8601, time_local 等其他字段
  2. request_method: 请求方法, GET, POST ...
  3. host: 访问域名, 例如 www.example.com
  4. request_uri: 资源地址。 例如 /abc/index.html。 与 host 组合在一起就是完整资源。
  5. request_time: 请求耗时(单位 毫秒)。 以 收到客户端发送 的第一个字符开始, 以 发送给客户端 最后一个字符结束。
    • cost 就是 request_time。 更具有字面意思。
  6. status: 响应状态。 例如 200, 404 ...

字段类型

注意: 类似 status, cost 这样 值类型 通常为 数值 的字段。

  1. 在日志中可以使用字符串类型, 即 {"status":"$status"}
  2. 在 logstash 或者 Aliyun SLS 服务中 解析日志, 在 创建字段索引 时可将其设置为 数值 类型, 通常为 long, double.

Nginx Ingress Controller

这里是 Aliyun Nginx Ingress Controller 配置规则, 其中部分参与可能在其他地方不可用, 需要自己测试。

展开之后结果如下, 其中 数字字段没有使用 双引号 括起来。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
    "remote_addr": "$remote_addr",
    "remote_user": "$remote_user",
    "time_local": "$time_local",
    "request_method": "$request_method",
    "request_uri": "$request_uri",
    "status": $status,
    "body_bytes_sent": $body_bytes_sent,
    "http_referer": "$http_referer",
    "http_user_agent": "$http_user_agent",
    "request_length": $request_length,
    "request_time": $request_time,
    "proxy_upstream_name": "$proxy_upstream_name",
    "upstream_addr": "$upstream_addr",
    "upstream_response_length": $upstream_response_length,
    "upstream_response_time": $upstream_response_time,
    "upstream_status": $upstream_status,
    "req_id": "$req_id",
    "host": "$host",
    "proxy_alternative_upstream_name": "$proxy_alternative_upstream_name"
}

注意: req_id: 唯一 请求 ID, 并不是标准 Nginx 的变量。

在使用的时候

  1. 可以通过将 换行符空格 去掉, 形成一个单行日志, 方便采集。
  2. 在 ConfigMap 使用 |- 使用多行配置模式, 避免 冒号引号 的转换问题, 减少配置麻烦。

在 ConfigMap 中的配置如下

1
2
3
4
apiVersion: v1
data:
  log-format-upstream: |- # 注意(1)
    {"remote_addr":"$remote_addr","remote_user":"$remote_user","time_local":"$time_local","request_method":"$request_method","request_uri":"$request_uri","status": $status,"body_bytes_sent": $body_bytes_sent,"http_referer":"$http_referer","http_user_agent":"$http_user_agent","request_length": $request_length,"request_time": $request_time,"proxy_upstream_name":"$proxy_upstream_name","upstream_addr":"$upstream_addr","upstream_response_length": $upstream_response_length,"upstream_response_time": $upstream_response_time,"upstream_status": $upstream_status,"req_id":"$req_id","host":"$host","proxy_alternative_upstream_name":"$proxy_alternative_upstream_name"}

注意(1): 使用 |- 设置换行。 在 YAML 中, 多行 文本配置语法。

  • |:文中自动换行, 且文末新增一空行
  • |+:文中自动换行, 且文末新增两空行
  • |-:文中自动换行, 且文末不新增行

参考文档

  1. Nginx 变量列表: https://nginx.org/en/docs/varindex.html
  2. Nginx Logging 配置: https://docs.nginx.com/nginx/admin-guide/monitoring/logging/
  3. Nginx Ingress Controller 配置日志: https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource#logging
  4. Nginx Ingress Controller 支持 Prometheus: https://docs.nginx.com/nginx-ingress-controller/logging-and-monitoring/prometheus/