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

数据加工服务简介

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

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

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

数据分发场景

  1. 数据规整(一对一)
    日志服务 - 数据加工- Nginx日志解析实践
  2. 数据分配(一对多)
    日志服务 - 数据加工- Nginx日志解析实践

接下来,咱们以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"';

机器上看到日志是这样的

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

运用阿里云日志服务收集极简日志如下
日志服务 - 数据加工- Nginx日志解析实践

控制台启用数据加工

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

控制台翻开“数据加工”按钮,然后在输入框里输入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>[^"]*)"')

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

时刻字段处理

默许格局的localtime不易读,咱们把它解析成易读的格局
日志服务 - 数据加工- Nginx日志解析实践

用到的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"))

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

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")

完结作用
日志服务 - 数据加工- Nginx日志解析实践

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")

作用

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

经过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")
)

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

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信息)

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

完好的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"))

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

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

装备方针logstore信息。假如有e_output的话,需求设置对应额定的存储方针称号、project、logstore需求和代码里共同
日志服务 - 数据加工- Nginx日志解析实践

保存完即完结上线,能够在数据处理-加工下看到该使命,点击进去能够看到加工推迟等信息。
假如需求进行修正,也能够经过该进口进入修正。

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

参阅

  1. https://help.aliyun.com/document_detail/125384.html 【阿里云日志服务- 数据加工简介】
  2. https://help.aliyun.com/document_detail/159702.html 【阿里云日志服务-数据加工函数总览】