日志服务 - 数据加工- Nginx日志解析实践

本文涉及的产品
对象存储 OSS,OSS 加速器 50 GB 1个月
简介: 以nginx日志为例,简单介绍日志服务的数据加工功能

数据加工服务简介

数据加工服务是阿里云日志服务推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。

数据加工服务集成在日志服务里。
数据加工支持的常见场景:

p1

数据分发场景

  1. 数据规整(一对一)
    p2
  2. 数据分派(一对多)
    p3

接下来,我们以nginx日志解析为例,抛砖引玉,帮助大家快速入门阿里云日志服务的数据加工。

用于解析的Nginx日志

假设我们通过极简模式采集了Nginx默认日志。默认的nginx 日志format如下

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

机器上看到日志是这样的

p4

使用阿里云日志服务采集极简日志如下
p5

控制台启用数据加工

p6

控制台打开“数据加工”按钮,然后在输入框里输入DSL语句,点击预览数据即可看到数据加工的效果。

字段正则抽取

通过正则,抽取nginx日志里的字段,这里可以用到正则的捕获组名称设置变量名称

e_regex("源字段名", "正则或有命名捕获正则", "目标字段名或数组(可选)", mode="fill-auto")

推荐一个正则编写辅助工具: https://regex101.com/

实际使用DSL语句

e_regex("content",'(?<remote_addr>[0-9:\.]*) - (?<remote_user>[a-zA-Z0-9\-_]*) \[(?<local_time>[a-zA-Z0-9\/ :\-]*)\] "(?<request>[^"]*)" (?<status>[0-9]*) (?<body_bytes_sent>[0-9\-]*) "(?<refer>[^"]*)" "(?<http_user_agent>[^"]*)"')

p7

时间字段处理

默认格式的localtime不易读,我们把它解析成易读的格式
p8

用到的dsl语句,通过dsl

e_set("字段名", "固定值或表达式函数", ..., mode="overwrite")

dt_strftime(日期时间表达式, "格式化字符串")

dt_strptime('值如v("字段名")', "格式化字符串")

实际使用的dsl语句

e_set("local_time", dt_strftime(dt_strptime(v("local_time"),"%d/%b/%Y:%H:%M:%S %z"),"%Y-%m-%d %H:%M:%S"))

p9

Request URI解析

接下来,我们希望对 requst字段进行抽取,我们看到request 字段是由 HTTP_METHOD URI HTTP版本组成的。
我们可以用以下函数来做实现

e_regex("源字段名", "正则或有命名捕获正则", "目标字段名或数组(可选)", mode="fill-auto")

# 进行urldecode
url_decoding('值如v("字段名")’)

# 设置字段值
e_set("字段名", "固定值或表达式函数", ..., mode="overwrite")

e_kv 将request url中的key value键值对进行抽取 

实现语句

e_regex("request", "(?<request_method>[^\s]*) (?<request_uri>[^\s]*) (?<http_version>[^\s]*)")
e_set("request_uri", url_decoding(v("request_uri")))
e_kv("request_uri")

实现效果
p10

HTTP Code状态码映射

如果我们想把http code映射出具体的code描述信息,比如我想把404 映射为not found,可以用e_dict_map函数

e_dict_map(“字典如{‘k1’:‘v1’, ‘k2’:‘v2’}”, “源字段正则或列表”, “目标字段名”)

用到的DSL,如果有key match不到,就会使用*这个key对应的值

e_dict_map({'200':'OK',
            '304' : '304 Not Modified',
            '400':'Bad Request',
            '401':'Unauthorized',
            '403':'Forbidden',
            '404':'Not Found',
            '500':'Internal Server Error',
            '*':'unknown'}, "status", "status_desc")

效果

p11

通过User Agent判断客户端操作系统

如果我们想了解客户用的是什么os版本,可以通过user agent里的字段用正则匹配来判断,用到dsl语句

e_switch("条件1e_match(...)", "操作1如e_regex(...)", "条件2", "操作2", ..., default="可选无匹配时的操作")

regex_match('值如v("字段名")', r"正则表达式", full=False)

e_set("字段名", "固定值或表达式函数", ..., mode="overwrite")

用到的dsl语句

e_switch(regex_match(v("content"), "Mac"), e_set("os", "osx"),
         regex_match(v("content"), "Linux"), e_set("os", "linux"),
         regex_match(v("content"), "Windows"), e_set("os", "windows"),
         default=e_set("os", "unknown")
)

效果
p12

4xx的日志单独投递到指定logstore

可以使用e_output函数来做日志投递,用regex_match做字段匹配

regex_match('值如v("字段名")', r"正则表达式", full=False)

e_output(name=None, project=None, logstore=None, topic=None, source=None, tags=None)

e_if("条件1如e_match(...)", "操作1如e_regex(...)", "条件2", "操作2", ....)

实际的dsl语句

e_if(regex_match(v("status"),"^4.*"), 
                   e_output(name="logstore_4xx", 
                   project="dashboard-demo", 
                   logstore="dsl-nginx-out-4xx"))

在预览里看到这个效果。(保存加工的时候,需要设置好对应project、logstore的ak信息)

p13

完整的DSL代码以及上线流程

完整的DSL代码

# 通用字段抽取
e_regex("content",'(?<remote_addr>[0-9:\.]*) - (?<remote_user>[a-zA-Z0-9\-_]*) \[(?<local_time>[a-zA-Z0-9\/ :\-]*)\] "(?<request>[^"]*)" (?<status>[0-9]*) (?<body_bytes_sent>[0-9\-]*) "(?<refer>[^"]*)" "(?<http_user_agent>[^"]*)"')

# 设置localttime
e_set("local_time", dt_strftime(dt_strptime(v("local_time"),"%d/%b/%Y:%H:%M:%S %z"),"%Y-%m-%d %H:%M:%S"))

# uri字段抽取
e_regex("request", "(?<request_method>[^\s]*) (?<request_uri>[^\s]*) (?<http_version>[^\s]*)")
e_set("request_uri", url_decoding(v("request_uri")))
e_kv("request_uri")

# http code映射
e_dict_map({'200':'OK',
            '304':'304 Not Modified',
            '400':'Bad Request',
            '401':'Unauthorized',
            '403':'Forbidden',
            '404':'Not Found',
            '500':'Internal Server Error',
            '*':'unknown'}, "status", "status_desc")

# user agent 字段判断
e_switch(regex_match(v("content"), "Mac"), e_set("os", "osx"),
         regex_match(v("content"), "Linux"), e_set("os", "linux"),
         regex_match(v("content"), "Windows"), e_set("os", "windows"),
         default=e_set("os", "unknown")
)

# logstore单独投递
e_if(regex_match(v("status"),"^4.*"), 
                   e_output(name="logstore_4xx", project="dashboard-demo", logstore="dsl-nginx-out-4xx"))

在页面提交代码以后,保存数据加工

p14

配置目标logstore信息。如果有e_output的话,需要设置对应额外的存储目标名称、project、logstore需要和代码里一致
p15

保存完即完成上线,可以在数据处理-加工下看到该任务,点击进去可以看到加工延迟等信息。
如果需要进行修改,也可以通过该入口进入修改。

p16

参考

  1. https://help.aliyun.com/document_detail/125384.html 【阿里云日志服务- 数据加工简介】
  2. https://help.aliyun.com/document_detail/159702.html 【阿里云日志服务-数据加工函数总览】
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3125 1
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1181 55
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
947 90
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
1639 13
|
缓存 Java 编译器
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
人工智能 运维 监控
一招高效解析 Access Log,轻松应对泼天流量
一招高效解析 Access Log,轻松应对泼天流量
273 0
一招高效解析 Access Log,轻松应对泼天流量
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1863 0

相关产品

  • 日志服务
  • 推荐镜像

    更多
  • DNS