背景 我们使用的是阿里云ack pro 托管版集群,创建集群时默认开启采集ingress-nginx的日志,开发和产品那边提了一个需求,排查问题的时候需要查看请求的body
和request 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 3 ed90ece4e7fcfb4a555e386a513a143 dev-xxl-job.harmay.com [] 00 -e4c221406c5b217f13ae117af5509a48-ecbeec29adbc21ab-01
此时我们采集的日志如下:
这是我们的request headers
内容如下,根据实际需求,这里只需要打印其中token字段即可
参考官方文档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 59e01367 f555ad3fed47a7ac94be88a6 dev-xxxxx.com [] 00 -f3d58953791db774c5b3a4fe7b343cfd-8 ac886483abfb2af-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 -31326 d829eecacda26b897f99d831266-e6f756f2c8c07418-01
这时查看我们的采集到的日志发现日志会无法正常解析,这是因为我们还没有修改sls日志采集的配置。
日志采集是使用了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: name: k8s-nginx-ingress spec: logstore: nginx-ingress productCode: k8s-nginx-ingress logtailConfig: inputType: plugin 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日志服务下,去更新索引,会自动根据我们上面配置的字段,生成索引
应用之后,稍等一分钟我们可以看到,此时采集的日志已经可以按照定义的规则正常解析