misterli's Blog.

阿里云ACK集群 Ingress-nginx配置日志输出request body和request headers信息

字数统计: 1.1k阅读时长: 5 min
2022/05/02

背景

我们使用的是阿里云ack pro 托管版集群,创建集群时默认开启采集ingress-nginx的日志,开发和产品那边提了一个需求,排查问题的时候需要查看请求的bodyrequest headers中的部分自定义字段用于排错, 查看了一下默认的nginx-ingress的日志输出格式,发现不包含这些信息,所以我们就要修改日志输出的内容,并且还要保证日志采集展示效果正常。

修改日志输出格式

Ingress Controller访问日志格式可以在ConfigMap中看到(默认ConfigMap为kube-system命名空间下的nginx-configuration)。

ACK Ingress Controller默认的日志格式为:

1
2
3
4
$remote_addr - [$remote_addr] - $remote_user [$time_local]
"$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length
$request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length
$upstream_response_time $upstream_status $req_id $host [$proxy_alternative_upstream_name]

注意:改动日志格式后,SLS的日志收集规则也需要做相应改动,否则无法在SLS日志控制台看到正确日志信息。

我们先看一下未修改前日志输出的内容:

1
106.15.137.195 - [106.15.137.195] - - [01/May/2022:22:35:13 +0800] "POST /xxl-job-admin/api/registry HTTP/1.1" 200 49 "-" "Java/1.8.0_191" 518 0.004 [harmay-digital-digital-xxl-job-8080] 192.168.94.49:8080 49 0.002 200 3ed90ece4e7fcfb4a555e386a513a143 dev-xxl-job.harmay.com [] 00-e4c221406c5b217f13ae117af5509a48-ecbeec29adbc21ab-01

此时我们采集的日志如下:

image-20220501224301958

这是我们的request headers内容如下,根据实际需求,这里只需要打印其中token字段即可

image-20220501223740672

参考官方文档https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/修改配置文件kubectl -n kube-system edit cm nginx-configuration,如下

1
2
3
4
5
log-format-upstream: $remote_addr - [$remote_addr] - $remote_user [$time_local]
"$request" "$request_body" $http_token $status $body_bytes_sent "$http_referer"
"$http_user_agent" $request_length $request_time [$proxy_upstream_name] $upstream_addr
$upstream_response_length $upstream_response_time $upstream_status $req_id $host

对于body信息,这里添加了"$request_bady"变量即可在日志中打印我们的请求体参数信息。

对于request headers中的自定义字段,我们需要使用http_字段名表示,如 token 字段,我们需要用 http_token 表示,并且如果字段名有大写字母要一律改为小写字母,自定义字段名中包含 - 需要改为 _ ,如sec-ch-ua,需要改写为http_sec_ch_ua

修改后我们查看此时打印的日志信息,此时已经正常打印body 和自定义的header 字段了

1
2
106.15.137.195 - [106.15.137.195] - - [01/May/2022:22:55:47 +0800] "POST /xxl-job-admin/api/registry HTTP/1.1" "{\x22registryG********://192.168.94.123:9999/\x22}" - 200 49 "-" "Java/1.8.0_312" 518 0.003 [harmay-digital-digital-xxl-job-8080] 192.168.94.49:8080 49 0.001 200 59e01367f555ad3fed47a7ac94be88a6 dev-xxxxx.com [] 00-f3d58953791db774c5b3a4fe7b343cfd-8ac886483abfb2af-01
117.143.52.131 - [117.143.52.131] - - [01/May/2022:22:57:09 +0800] "POST /login/user-info HTTP/1.1" "{}" ad**************95828 200 2780 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36" 791 0.013 [test-harmay-digital-digital-operation-8080] 192.168.94.188:8080 2780 0.010 200 a495705ac1564649bc8f13d35e15a565 test-oxxx.com [] 00-31326d829eecacda26b897f99d831266-e6f756f2c8c07418-01

这时查看我们的采集到的日志发现日志会无法正常解析,这是因为我们还没有修改sls日志采集的配置。

image-20220501225823660

日志采集是使用了AliyunLogConfig这个crd配置的 ,我们需要修改正则表达式,并添加对应的解析字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
kubectl -n kube-system  edit aliyunlogconfigs.log.alibabacloud.com k8s-nginx-ingress

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
# your config name, must be unique in you k8s cluster
name: k8s-nginx-ingress
spec:
# logstore name to upload log
logstore: nginx-ingress
# product code, only for k8s nginx ingress
productCode: k8s-nginx-ingress
# logtail config detail
logtailConfig:
inputType: plugin
# logtail config name, should be same with [metadata.name]
configName: k8s-nginx-ingress
inputDetail:
plugin:
inputs:
- type: service_docker_stdout
detail:
IncludeLabel:
io.kubernetes.container.name: nginx-ingress-controller
Stderr: false
Stdout: true
processors:
- type: processor_regex
detail:
KeepSource: false
Keys:
- client_ip
- x_forward_for
- remote_user
- time
- method
- url
- version
- request_body #添加
- header_token #添加
- status
- body_bytes_sent
- http_referer
- http_user_agent
- request_length
- request_time
- proxy_upstream_name
- upstream_addr
- upstream_response_length
- upstream_response_time
- upstream_status
- req_id
- host
- proxy_alternative_upstream_name
NoKeyError: true
NoMatchError: true
Regex: ^(\S+)\s-\s\[([^]]+)]\s-\s(\S+)\s\[(\S+)\s\S+\s"(\w+)\s(\S+)\s([^"]+)"\s("[^"]+")\s(-|\w+)\s(\d+)\s(\d+)\s"([^"]*)"\s"([^"]*)"\s(\S+)\s(\S+)+\s\[([^]]*)]\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s*(\S*).* #修改
SourceKey: content

修改后会自动热更新,我们此时需要去sls日志服务下,去更新索引,会自动根据我们上面配置的字段,生成索引

image-20220501230745144

image-20220501230812709

image-20220501230830722

应用之后,稍等一分钟我们可以看到,此时采集的日志已经可以按照定义的规则正常解析

image-20220501231115437

CATALOG
  1. 1. 背景
  2. 2. 修改日志输出格式