ingress 日志,还能这么玩--结合阿里云日志服务统计系统访问日志

简介: 修改 nginx-ingress 日志,并结合阿里云日志服务制作系统访问日志统计图表。

前言

最近接到一个需求,需要展示 ingress 上面的访问日志,由于我们的业务系统都部署在 Kubernetes 上面,通过 ingress 进行访问,所以这里的访问日志,其实就是我们全部业务系统的访问日志。

日志采集方面,阿里云天生就提供了 nginx-ingress 日志和采集和展示,本身提供很多不错的基于 ingress 日志数据的图表与分析。如果你使用的是阿里云 ACK 容器服务,那么极端推荐使用,配置方法见官方文档:https://help.aliyun.com/document_detail/86532.html

image

让人头秃的是,我们这次不但要采集 ingress 日志上比较常规的 url client_ip method status 等字段,还要采集我们系统在 Request Headers 里面自定义的参数,这些参数是默认的 ingress 并不展示的,所以需要我们进行调整。

开始

首先明确需要调整的组件:

  • nginx-ingress 的 ConfigMap:用于打印自定义日志字段
  • AliyunLogConfig:这个是阿里云日志服务的 CRD 扩展,需要在这个里面加入新增的字段名和修改后的正则表达式
  • 在日志服务控制台,添加新增字段的指定字段查询
  • 新增展示仪表盘

调整 ingress 日志输出

我们 ingress 组件使用的是 nginx-ingress-container,这里要调整日志输出格式,老规矩,直接官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

从文档可见,只需要调整 ingress-nginx 的 ConfigMap nginx-configuration data 中的 log-format-upstream 字段即可。

官方文档里面给的说明不是很详细,没有提到 Request Headers 里自定义的字段应该怎么表示(也有可能是我眼瘸没看见),但经过我多次试验发现,Request Headers 里的字段在 log-format-upstream 中应该使用 $http_{your field} 表示,比如 $http_cookie;而带 - 的字段则需要将 - 改为 _,并且使用小写,比如 app-Id 就应使用 $http_app_id 表示。

修改 ConfigMap,ingress-controller 将进行热更新,看到如下日志,就证明配置已完成更新,接下来就可以看到你自定义字段的值已经打印出来了。

I0302 08:20:58.393365 9 controller.go:200] Backend successfully reloaded.

调整阿里云日志组件配置

执行下面的步骤请确保已经按照官方文档正确部署阿里云日志服务在您的 K8S 集群之后,并且已达到要求的版本。

日志已经成功打印了,接下来就是调整日志采集的字段了,这里只需要调整日志服务 CRD 的扩展配置即可。

$ kubectl edit AliyunLogConfig k8s-nginx-ingress

在修改配置之前,推荐先去 https://regex101.com/ 验证正则表达式是否正确,将调整过的正则表达式和 ingress-controller 打印的日志贴入下图指定位置,就可以看出正则表达式是否正确。

image

然后将添加的字段名称(这个名称将作为 key 在日志服务中展示,可以与 header 中的字段不同)和正则表达式贴入如下 CRD 中。

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
            - 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
            - #需要添加的字段名称
            - ...
            NoKeyError: true
            NoMatchError: true
            Regex: #修改后的正则表达式
            SourceKey: content

日志控制台新增字段

如果上面的操作无误的话,日志服务中就会展示您添加的字段了,如果配置有误,所有的自定义字段都会不显示,只会显示保留字段名称。

添加指定字段查询,就可以快速查看添加的字段了。

image

新增展示仪表盘

日志既然已经取到了,那么展示就很容易了,直接在查询栏中输入分析语句,日志服务支持 SQL 聚合日志,并直接生成统计图表,点击添加到仪表盘可以就可以添加到现有仪表盘或者新建一个仪表盘。

image

成果

之后进行一些微调,添加过滤栏,由于这里统计的是登录用户,你甚至都可以添加一个词云来看看哪些用于使用系统比较频繁。当然,想添加什么都看您的喜好,日志在你手里,想怎么分析都可以。

image

结语

本次实现的功能并不是什么高深的功能,只不过是一个简单的访问日志记录和展示,相信每个系统其实都有一套这种功能。但是这种实现方式在我看来优点更多:

  • 无代码:全程没有写一行代码,如果有的话,也就是业务需要统一 Request Headers 里面的字段。
  • 配置简单:只需要修改 nginx ConfigMap 中的一个字段,并在 CRD 中添加字段名称和正在表达式,唯一的难度可能就是正则表达式。
  • 配置快:整体的配置时间很短,加上查文档和调整图表也不过半天的时间,肯定比 提需求-评估-开发-测试-验收 全流程走一遍,前端后端撕一遍要快的多的多的多。
  • 高度定制:可以根据自己的喜好,随意定制图表。

最近发现阿里云日志服务是一个宝藏产品,从安全到 k8s 业务,从成本控制到疫情动态,日志服务真的就是把所有没有前端开发资源的服务都帮了一把。
--- 摘自本人朋友圈

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
6月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
191 2
|
11月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1055 54
|
11月前
|
自然语言处理 监控 安全
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
阿里云可观测官方发布了Observable MCP Server,提供了一系列访问阿里云可观测各产品的工具能力,包含阿里云日志服务SLS、阿里云应用实时监控服务ARMS等,支持用户通过自然语言形式查询
1535 0
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
579 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
1459 13
|
缓存 Java 编译器
|
域名解析 应用服务中间件 网络安全
阿里云个人博客外网访问中断应急指南:从安全组到日志的七步排查法
1. 检查安全组配置:确认阿里云安全组已开放HTTP/HTTPS端口,添加规则允许目标端口(如80/443),授权对象设为`0.0.0.0/0`。 2. 本地防火墙设置:确保服务器防火墙未阻止外部流量,Windows启用入站规则,Linux检查iptables或临时关闭防火墙测试。 3. 验证Web服务状态:检查Apache/Nginx/IIS是否运行并监听所有IP,使用命令行工具确认监听状态。 4. 测试网络连通性:使用外部工具和内网工具测试服务器端口是否开放,排除本地可访问但外网不可的问题。 5. 排查DNS解析:确认域名A记录指向正确公网IP,使用`ping/nslookup`验证解析正
498 2
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1599 0
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
网络安全视角:从地域到账号的阿里云日志审计实践
321 0