Logtail从入门到精通(五):分隔符Nginx访问日志采集实战

本文涉及的产品
对象存储 OSS,20GB 3个月
云备份 Cloud Backup,100GB 3个月
对象存储 OSS,内容安全 1000次 1年
简介: 除正则表达式方式外,日志服务还支持分隔符模式的日志,分隔符支持单字符和多字符两种方式。本文通过Nginx分隔符访问日志为大家介绍如何使用Logtail采集分隔符类型的日志。

前言


上一节中我们介绍了如何使用正则表达式的方式来解析日志,将非结构化的日志转化为半结构的数据。除正则表达式方式外,日志服务还支持分隔符模式的日志,分隔符支持单字符和多字符两种方式。本文通过Nginx分隔符访问日志为大家介绍如何使用Logtail采集分隔符类型的日志。


分隔符日志介绍


分隔符日志使用分隔符(Separator)将一条日志切分成多个字段,一般会分为支持单字符和多字符两种模式。其中单字符分隔符较难理解和掌握,配置方式也更加复杂,建议大家使用简单易用的多字符分隔符


单字符模式


单字符模式通过匹配单字符进行日志切分,例如制表符(\t)、空格、竖线(|)、逗号(,)、分号(;)等单字符。


单字符分隔符容易出现日志字段中包含分隔符的场景,为避免日志字段被误分割,需要使用Quote(${Quote})对日志字段进行包裹隔离。如果内容中在非Quote情况下出现双引号,则需要进行转义,处理成两个Quote,即${Quote}${Quote}。Quote必须在字段的边界单次出现,要么作为字段内数据成对出现(
{Quote}`),其它情况不符合分隔符日志的格式定义,解析会出错。


正常情况下${Quote}一般设置为",但很多用户并不理解,在使用中容易出现各种问题。因此在日志服务中,默认的${Quote}设置成\u0001(不可见字符)。


例如,逗号,作为分隔符,双引号"作为Quote。双引号和逗号作为日志字段中的一部分,需要将包含逗号的日志字段用Quote包裹,同时将日志字段中的双引号转义为成对的双引号""。处理后的日志格式为:1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00。该日志可以被解析为五个字段: 1999ChevyVenture "Extended Edition, Very Large"、空字段和5000.00


多字符分隔符


多字符模式中,分隔符可以包括2~3个字符,如(||)、(&&&)、(^_^)等多字符。多字符分隔符模式下,日志解析完全根据分隔符进行匹配,您无需使用Quote对日志进行包裹。


  • 注意:  多字符分隔符中没有Quote概念,您 唯一需要关心 的是:需确保日志字段内容中不会出现分隔符的完整匹配,否则会产生字段误分割。


例如,分隔符设置为&&的情况下,日志:1997&&Ford&&E350&&ac&abs&moon&&3000.00会被解析为5个字段:1997FordE350ac&abs&moon3000.00


使用多字符分隔符解析Nginx access日志


为何使用多字符分隔符


一般Nginx访问日志使用正则或者grok的方式来进行解析,但这两种方式相对多字符分隔符都存在一个非常重要的缺陷:解析效率太低。多字符分隔符通俗易懂,而且解析性能极高,只需一遍简单的字符匹配查找,性能是正则或者grok的3倍以上。因此若您的Nginx访问日志量极大,建议使用多字符分隔符类型的access log,可节省相当多的CPU。


Nginx access日志格式配置


如何配置nginx access日志格式,您可以参考Nginx配置示例Nginx log module


配置Nginx多字符分隔符的日志,需要特殊注意的一点是:requests, referrers, user-agents等字段中不能出现相同的多字符分隔符。因此需要给多字符分隔符中配置一个不会再这些字段直接出现的符号,例如"。下面是一个配置示例:


log_format parsable '$remote_addr |"| $remote_user |"| $time_local |"|'
                      '$request |"| $status |"| $body_bytes_sent |"|'
                      '$http_referer |"| $http_user_agent';


Logtail配置多字符分隔符


日志样例


上述配置的Nginx access日志示例如下:


66.249.65.159|"|-|"|06/Nov/2014:19:10:38 +0600|"|GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1|"|404|"|177|"|-|"|Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)


解析配置


  1. 创建采集配置:在数据接入页面中,我们选择自定义数据中的文本文件接入。
  2. 在采集配置中我们选择分隔符模式,日志路径中的文件夹和文件名分别输入/var/log/nginxaccess.log
  3. 在日志样例中输入上述样例。
  4. 分隔符输入|"|
  5. 分隔符输入完毕后,配置页面会自动分解出8个字段,此时填上分解出的key名称。


最后配置如下:


9b5c858e-e07d-4bd8-982b-8b6f75f44d72.png


采集结果


配置应用到机器组后,Logtail会对新产生的日志执行多字符分割,最后采集到服务端的效果如下:


afb3045d-f7c6-4ccb-8a28-634bda9b2f13.png


高级定制


在日志服务控制台中,您可以完成80%以上常用的配置管理。但也有一定情况下,控制台无法满足您的配置功能,例如:


  1. 设置Quote(默认为\u0001
  2. 将分隔符设置为不可见字符或空格
  3. 隐藏的高级配置


如果您有上述需求,可以使用日志服务的CLI(command language interface)来满足您的需求:


建议初次使用的同学们按照以下方式使用:


  1. 安装CLI工具,具体请参考使用手册
  2. 在控制台创建一个分隔符配置
  3. 使用CLI工具获取该配置,保存到本地文件中
  4. 修改本地文件,把其中您需要修改的字段替换
  5. 调用CLI工具的update_logtail_config命令更新配置


操作示例如下:


aliyun log get_logtail_config --project_name="demo-log-project" --config_name="delimiter-log" > temp.json
vim temp.json
aliyun log update_logtail_config --project_name="demo-log-project" --config_detail="file://./temp.json"


相关文档和参考


Nginx配置样例


Nginx日志格式配置


分隔符日志帮助文档


日志服务cli工具使用说明


使用cli工具管理配置

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
20天前
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
28天前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
28天前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
1月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
16天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
32 0
|
19天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
36 0
|
19天前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
21 0
|
25天前
|
网络安全
【Azure Service Bus】启用诊断日志来获取客户端访问Azure Service Bus的IP地址 [2024-03-26 实验结果失败]
【Azure Service Bus】启用诊断日志来获取客户端访问Azure Service Bus的IP地址 [2024-03-26 实验结果失败]
|
1月前
|
存储 Kubernetes Java
在k8S中,容器内日志是怎么采集的?
在k8S中,容器内日志是怎么采集的?
|
应用服务中间件 nginx
Nginx 服务器中设置禁止访问文件或目录的方法
Nginx 服务器中设置禁止访问文件或目录的方法

相关产品

  • 日志服务