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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
日志服务 SLS,月写入数据量 50GB 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 【阿里云日志服务-数据加工函数总览】
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
28天前
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
1月前
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
日志审计的必要性在于其能够帮助企业和组织落实法律要求,打破信息孤岛和应对安全威胁。选择 SLS 下日志审计应用,一方面是选择国家网络安全专用认证的日志分析产品,另一方面可以快速帮助大型公司统一管理多组地域、多个账号的日志数据。除了在日志服务中存储、查看和分析日志外,还可通过报表分析和告警配置,主动发现潜在的安全威胁,增强云上资产安全。
147 12
|
2月前
|
存储 监控 安全
网络安全视角:从地域到账号的阿里云日志审计实践
日志审计的必要性在于其能够帮助企业和组织落实法律要求,打破信息孤岛和应对安全威胁。选择 SLS 下日志审计应用,一方面是选择国家网络安全专用认证的日志分析产品,另一方面可以快速帮助大型公司统一管理多组地域、多个账号的日志数据。除了在日志服务中存储、查看和分析日志外,还可通过报表分析和告警配置,主动发现潜在的安全威胁,增强云上资产安全。
|
2月前
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
483 12
云上数据安全保护:敏感日志扫描与脱敏实践详解
|
2月前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
208 3
|
3月前
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
|
4月前
|
Web App开发 存储 监控
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
本文为 iLogtail 开源两周年的实践案例分享,讨论了 iLogtail 作为日志采集工具的优势,包括它在性能上超越 Filebeat 的能力,并通过一系列优化解决了在生产环境中替换 Filebeat 和 Logstash 时遇到的挑战。
169 13
|
4月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
198 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
5月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
71 2
|
5月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
231 9

相关产品

  • 日志服务
  • 推荐镜像

    更多