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"
}
|
- Nginx 提供了多种 时间格式 变量, 包括
time_iso8601
, time_local
等其他字段 request_method
: 请求方法, GET, POST ...
host
: 访问域名, 例如 www.example.com
request_uri
: 资源地址。 例如 /abc/index.html
。 与 host
组合在一起就是完整资源。request_time
: 请求耗时(单位 毫秒)。 以 收到客户端发送 的第一个字符开始, 以 发送给客户端 最后一个字符结束。cost
就是 request_time
。 更具有字面意思。
status
: 响应状态。 例如 200, 404 ...
字段类型
注意: 类似 status, cost
这样 值类型 通常为 数值 的字段。
- 在日志中可以使用字符串类型, 即
{"status":"$status"}
- 在 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 的变量。
在使用的时候
- 可以通过将 换行符 和 空格 去掉, 形成一个单行日志, 方便采集。
- 在 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 中, 多行 文本配置语法。
|
:文中自动换行, 且文末新增一空行|+
:文中自动换行, 且文末新增两空行|-
:文中自动换行, 且文末不新增行
参考文档
- Nginx 变量列表:
https://nginx.org/en/docs/varindex.html
- Nginx Logging 配置:
https://docs.nginx.com/nginx/admin-guide/monitoring/logging/
- Nginx Ingress Controller 配置日志:
https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource#logging
- Nginx Ingress Controller 支持 Prometheus:
https://docs.nginx.com/nginx-ingress-controller/logging-and-monitoring/prometheus/