ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash

2023-05-16

ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash

文章目录

    • ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash
  • 前言
  • 正常的采集配置
  • 开启多个端口监听
  • 优化nxlog(关键字放在开头)
  • 再优化nxlog(关键字放在结尾)
  • 使用filebeat

前言

网络上有很例子给出一示例是采集一种类型的日志输出到logstash,但一个系统上日志种类很多,同一个采集端能区分不同日志类型吗?
下面的结构是nxlog做客户端采集,通过tcp协议发送到logstash,然后logstash传输到elasticsearch。
前提条件必需:

  1. 安装好elasticsearch,logstash,nxlog,filebeat
  2. nxlog/filebeats安装在windows系统,elasticsearch/logstash安装在linux系统

正常的采集配置

nxlog配置nxlog.conf:

<Input in_donglilog>
	Module im_file
	File "D:\\jar\\dongli\\logs\\spring-boot.log"
	SavePos TRUE
</Input>

<Output out_donglitcp>
	Module om_tcp
	Host 192.168.1.238
	Port 514
</Output>

<Route 1>
	Path in_donglilog => out_donglitcp
</Route>

采集D:\jar\dongli\logs\spring-boot.log日志,输出到192.168.1.238:514上

logstash配置:

input {
	tcp {
		port => 514
		type=>"plm"
   	}
}
output{
	if [type] == "plm"{
		elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "kelian-%{+YYYY.MM.dd}"
		}
  }
}

通过tcp协议监控514端口,这时候logstash工作mode是server(另一个工作mode是client,用于采集并发送数据),是监控514端口数据的。
网上例子多数止步于些,监听一个端口,然后接收数据,发送到elasticsearch。
假设,我们不仅仅监控dongli的日志D:\jar\dongli\logs\spring-boot.log日志,我还监听另一个系统日志,假设应用为kelian。这2个日志格式不一样。nxlog配置相对简单,主要是logstash怎么能区分接收的不同日志,在elasticsearch创建不同的index。总不能把2个应用日志输出到同一个index吧。

开启多个端口监听

这个方法最简单,不同应用开启不同端口监控
nxlog配置

<Input in_donglilog>
	Module im_file
	File "D:\\jar\\dongli\\logs\\spring-boot.log"
	SavePos TRUE
</Input>

<Output out_donglitcp>
	Module om_tcp
	Host 192.168.1.238
	Port 514
</Output>

<Route 1>
	Path in_donglilog => out_donglitcp
</Route>

<Input in_kelianlog>
	Module im_file
	File "D:\\jar\\kelaien\\logs\\spring-boot.log"
	SavePos TRUE
</Input>
 <Output out_keliantcp>
	Module om_tcp
	Host 192.168.1.238
	Port 515
</Output>
<Route 2>
	Path in_kelianlog => out_keliantcp
</Route>

logstash配置:

input {
	tcp {
		port => 514
		type=>"dongli"
   	}
   	tcp {
		port => 515
		type=>"kelian"
   	}
}
output{
	if [type] == "dongli"{
		elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "dongli-%{+YYYY.MM.dd}"
		}
  }
  if [type] == "kelian"{
		elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "kelian-%{+YYYY.MM.dd}"
		}
  }
}

最简单,但我不希望这么做,因为每增加一个应用就会增加一个端口,而增加一个端口就要增加这个端口对外开放,如果是阿里云ECS,还要修改安全组规则。个人觉得麻烦,但是这也不失为一种可选方式

优化nxlog(关键字放在开头)

要是能携带一个数据区分发送日志类型就好了。遗憾的是,nxlog并没有提供这种选项,怎么办?
修改传输的数据。
nxlog每读一行发送到logstash,在每行日志前加个特殊的字符串,然后logstash截取这个字符串,根据这个特殊的字符串创建不同的index。

原理是logstash字符引用,只要是input输入的值,都可以引用

nxlog配置:

<Input in_donglilog>
	Module im_file
	File "D:\\jar\\dongli\\logs\\spring-boot.log"
	SavePos TRUE
</Input>
<Input in_kelianlog>
	Module im_file
	File "D:\\jar\\kelaien\\logs\\spring-boot.log"
	SavePos TRUE
</Input>


<Processor proc_donglilog>
	Module      pm_transformer
	Exec $raw_event = "dongli " + $raw_event;
</Processor>
<Processor proc_kelianlog>
	Module      pm_transformer
	Exec $raw_event = "kelian " + $raw_event;
</Processor>

<Output out_donglitcp>
	Module om_tcp
	Host 192.168.1.238
	Port 514
</Output>
 <Output out_keliantcp>
	Module om_tcp
	Host 192.168.1.238
	Port 514
</Output>
 

<Route 1>
	Path in_donglilog => proc_donglilog => out_donglitcp
</Route>

<Route 2>
	Path in_kelianlog => proc_kelianlog => out_keliantcp
</Route>

通过Processor模块,在每行日志行都添加了应用名。
logstash配置:

input {
	tcp {
		port => 514
		type=>"plm"
   	}
}
filter{
	if [type] == "plm" {
		grok{
			match=>{
				"message" => "%{WORD:key} %{WORD}"
			}
		}
		mutate{
			gsub=>["message","%{key}",""]
	    }
	}
}
output{
	if [type] == "plm"{
		if [key] == "dongli" {	
			elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "dongli-%{+YYYY.MM.dd}"
			}
		}
		if [key] == "kelian" {	
			elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "kelian-%{+YYYY.MM.dd}"
			}
		}
	}
}

处理的关键在过滤器代码中

grok{
			match=>{
			 #拿到应用名
				"message" => "%{WORD:key} %{WORD}"
			}
		}
		mutate{
		#将message里应用名替换为空
			gsub=>["message","%{key}",""]
	    }

在output里就可以使用字段引用功能做判断了

if [type] == "plm"{
		if [key] == "dongli" {	
		}
		if [key] == "kelian" {	
		}
	}

缺点
有个缺点,只对单行日志有作用,如果有多行合并为一行的异常日志就不适合,因为将关键字添加到行头,破坏了数据完。
当使用multiline插件过滤输入数据时,行头没办法区分,当使用multiline插件,合并多行时会出问题。

codec => multiline{
			#以[开头视为一行
			pattern => "^["
			negate => true
			what => "previous"
	}

再优化nxlog(关键字放在结尾)

如果把关键字放在每行的结尾呢
nxlog配置:


<Input in_donglilog>
	Module im_file
	File "D:\\jar\\dongli\\logs\\spring-boot.log"
	SavePos TRUE
</Input>
<Input in_kelianlog>
	Module im_file
	File "D:\\jar\\kelaien\\logs\\spring-boot.log"
	SavePos TRUE
</Input>


<Processor proc_donglilog>
	Module      pm_transformer
	Exec $raw_event = $raw_event + "(dongli)";
</Processor>
<Processor proc_kelianlog>
	Module      pm_transformer
	Exec $raw_event = $raw_event + "(kelian)";
</Processor>

<Output out_donglitcp>
	Module om_tcp
	Host 192.168.1.238
	Port 514
</Output>
 <Output out_keliantcp>
	Module om_tcp
	Host 192.168.1.238
	Port 514
</Output>
 

<Route 1>
	Path in_donglilog => proc_donglilog => out_donglitcp
</Route>

<Route 2>
	Path in_kelianlog => proc_kelianlog => out_keliantcp
</Route>

注意代码

<Processor proc_donglilog>
	Module      pm_transformer
	Exec $raw_event = $raw_event + "(dongli)";
</Processor>
<Processor proc_kelianlog>
	Module      pm_transformer
	Exec $raw_event = $raw_event + "(kelian)";
</Processor>

关键放在行尾并用小括号括起来。
logstash配置:

input {
	tcp {
		port => 514
		codec => multiline{
			pattern => "^\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}"
			negate => true
			what => "previous"
		}
		type=>"plm"
   	}
}
filter{
	if [type] == "plm" {
		grok{
			match=>{
				"message" => "(?<ckey>[(]\w+[)\\r])"
			}
		}
		mutate{
			gsub=>["message","[(]%{ckey}[)]",""]
			#gsub=>["ckey","\r",""]
	    }
	}
}
output{
	if [type] == "plm"{
		if [ckey] == "(dongli)" {	
			elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "dongli-%{+YYYY.MM.dd}"
			}
		}
		if [ckey] == "(kelian)" {	
			elasticsearch {
				hosts => ["127.0.0.1:9200"]
				index => "kelian-%{+YYYY.MM.dd}"
			}
		}
	}
}

主要的处理在过滤器里

if [type] == "plm" {
		grok{
			match=>{
				"message" => "(?<ckey>[(]\w+[)\\r])"
			}
		}
		mutate{
			gsub=>["message","[(]%{ckey}[)]",""]
	    }
	}

拿到关键字,然后把message字段里关键删除。
这种方式也不失为一种解决方案,但不绝不是优雅的方案

使用filebeat

它天生可多携带关键字,而且在windows运行也很稳定,所以我推荐使用filebeat替代nxlog。
filebeat.yml配置:

filebeat.inputs:
- type: log
  enabled: true

  paths:
    - D:\jar\dongli\logs\spring-boot.logg
  fields:
    appname: dongli
- type: log
  enabled: true
  paths:
    - D:\jar\kelaien\logs\spring-boot.log
  fields:
    appname: kelaien

logstash配置

input{
	beats  {
		port => 515
		type=>"beatss"
   	}
}

output{
	if [fields][appname] == "dongli"{
		elasticsearch {
			hosts => ["127.0.0.1:9200"]
			index => "dongli-%{+YYYY.MM.dd}"
		}
	}
	if [fields][appname] == "kelaien"{
		elasticsearch {
			hosts => ["127.0.0.1:9200"]
			index => "kelaien-%{+YYYY.MM.dd}"
		}
	}
}

上面对应的是单行日志,如果是多行日志,它的配置放在filebeats而不是logstash
filebeat.yml配置:

filebeat.inputs:
- type: log
  enabled: true

  paths:
    - D:\jar\dongli\logs\spring-boot.logg
   multiline:
    pattern: '^\d{4}-\d{1,2}-\d{1,2}'
    negate: true
    match: after
  fields:
    appname: dongli
- type: log
  enabled: true
  paths:
    - D:\jar\kelaien\logs\spring-boot.log
   multiline:
    pattern: '^\d{4}-\d{1,2}-\d{1,2}'
    negate: true
    match: after
  fields:
    appname: kelaien

多行的关键代码是

 multiline:
    pattern: '^\d{4}-\d{1,2}-\d{1,2}'
    negate: true
    match: after
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash 的相关文章

  • 从 activemq 主题获取消息时,logstash 输入速度非常慢

    我已经在logstash中配置了JMS输入来订阅JMS主题消息并将消息推送到弹性搜索 input jms id gt my first jms yaml file gt D softwares logstash 6 4 0 config j
  • Logstash 可以同时处理多个输出吗?

    我对 Logstash 和弹性搜索很陌生 我正在尝试将日志文件存储在elasticsearch 和平面文件中 我知道logstash 支持这两种输出 但它们是同时处理的吗 还是通过工作定期完成 是的 您可以通过使用托运人配置上的 add t
  • 如何禁用 filebeat 的 close_inactive 设置?

    我的 filebeat 来自的容器docker elastic co beats filebeat 6 1 2 收割机被 close inactive 关闭 我不希望它们被关闭 文档来自close inactive from here ht
  • Filebeat - 解析消息行中的字段

    我正在使用 Filebeat 将日志数据从本地 txt 文件发送到 Elasticsearch 并且 我想添加一些字段message事件行 例如时间戳和日志级别 例如 这是我的日志行之一 2016 09 22 13 51 02 877 IN
  • Logstash可以直接读取远程日志吗?

    我是 Logstash 的新手 几天来我一直在阅读有关它的内容 和大多数人一样 我试图拥有一个集中式日志系统并将数据存储在 elasticsearch 中 然后使用 kibana 来可视化数据 我的应用程序部署在许多服务器中 因此我需要从所
  • 如何用flutterbit分割日志(键)字段?

    我们使用 FluentBit 将 node js 代码发送到 OpenSearch 我们遇到问题是因为log键包含嵌套值作为message 我们需要拆分以下日志消息中提到的值 log level info message method GE
  • 运行多个实例时无法启动logstash - path.data 设置

    你好 我是 ELK 堆栈内部的新手 在后台运行一个logstash进程 当它找到匹配的文件模式时 它如下所示 我想了解这里的重要性是什么path data选项 请帮帮我 FATAL logstash runner Logstash coul
  • Logstash:Mutate { gsub ... } 不起作用

    mutate add field gt eee gt 2016 uaie gsub gt eee 2016 2015 这确实会创建一个字段 eee 但 gsub 会not更新它 为什么 add field 在底层过滤器成功时运行 在您的情况
  • 如何使用 Kibana 3 创建价值随时间变化的图表?

    我使用 Logstash 来存储包含车辆随时间变化的速度的日志文件 在 Kibana 3 中 如何生成一个显示随时间变化的值的面板 即 x 轴显示时间 y 轴显示相关值 例如车辆速度 我发现的大多数面板都会计算给定时间范围内事件的发生次数并
  • 删除包含哈希字符的日志行

    在我的 Logstash 发货程序中 我想过滤掉用哈希字符注释的行 This log row should be dropped But one this should not 我能够使用grep过滤器 但由于不鼓励 即将退役 我试图获得一
  • 将特定的MDC字段附加到logstash日志中

    我正在尝试将自定义字段添加到 logback spring xml 中的 Logstash Appender 中 如下所示
  • Docker-compose 链接与 external_links

    我相信这是一个简单的问题 但我仍然没有从 Docker compose 文档中得到它 链接和外部链接有什么区别 我喜欢 external links 因为我想要核心 docker compose 并且我想在不覆盖核心链接的情况下扩展它 我到
  • docker nginx 容器的日志存储在主机的哪里

    I use 默认 nginx 镜像 https hub docker com nginx 和Filebeat读取日志并发送给ELK 两个容器 nginx 容器和 Filebeat 容器 都位于同一主机上 这是 nginx 镜像的 Docke
  • 为什么 Elastic Cloud 部署中存在 Logstash 实例?

    我正在调查 Elastic Cloud 托管的 ELK 堆栈 https www elastic co cloud elasticsearch service https www elastic co cloud elasticsearch
  • Logstash 的 Java 过滤器

    你知道 Logstash 有一个 Ruby 过滤器 它使我能够用 Ruby 编写代码 它通常包含在配置文件中 如下所示 filter ruby code gt 现在我有两个 Jar 文件 我想将它们包含在过滤器中 以便可以根据我在这些 Ja
  • Logstash创建管道但未创建索引

    我正在尝试使用 json 文件在 elasticsearch 云上创建索引 我已经创建了如下所示的配置 input file path gt root leads json start position gt beginning ignor
  • Logstash 过滤器将“$epoch.$microsec”转换为“$epoch_millis”

    我正在尝试转换表单中的时间戳字段 epoch microsec to epoch millis Example 1415311569 541062 gt 1415311569541 Logstash 似乎没有任何乘法的方法 所以ts 100
  • 如何在 Logstash 中将一个事件的字段引用到另一个事件?

    我目前正在处理日志 其中一些内容如下所示 00 19 59 771 07120 evtThread TRC gt Cem lt Core1 CALL STATE 00 20 00 199 05768 BCMApplicationThread
  • 我的石墨中的 Logstash 指标在哪里?

    这可能是一个菜鸟问题 但我很难找到答案 所以我希望你们能在这里帮助我 我有一个running logstash实例将日志从一台服务器传送到另一台运行 Graphite 的服务器 这是我的输出配置 output stdout codec gt
  • Logstash 中的数学函数

    我期待对 Logstash 中收到的输入进行数学运算 但无法看到任何此类操作filter 输入如下 user id User123 date 2016 Jun 26 12 00 12 data doc name mydocs xls doc

随机推荐

  • pixhawk PX4FMU和PX4IO最底层启动过程分析

    首先 xff0c 大体了解PX4IO 与PX4FMU各自的任务 PX4IO STM32F100 为PIXHAWK 中专用于处理输入输出的部分 输入为支持的各类遥控器 PPM SPKT DSM SBUS 输出为电调的PWM 驱动信号 它与PX
  • pixhawk 姿态与控制部分的记录

    此篇是把之前看到的资料总结整理一遍 xff0c 大部分是搬砖 xff0c 也加入了自己的一点思考 xff0c 写的过程中晕了好多次 xff0c 先大体记录下来 xff0c 肯定有错误 xff0c 日后再改正吧 关于pixhawk程序执行流程
  • pixhawk 光流--位置估计--姿态估计--位置控制--姿态控制

    本文是边分析边写的 xff0c 顺便就记录下了分析的思路 xff0c 并不是按照教材那种思路介绍性的 xff0c 而是按照程序员分析程序的思路来的 所以读者跟着看有些地方看了意义不大 xff0c 但是这种程序分析的思路还是可以借鉴的 xff
  • pixhawk 整体架构的认识

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • pixhawk mc_pos_control.cpp源码解读

    好久没跟新blog了 xff0c 这段时期边调试边看程序 xff0c 所以有点慢 要开始着手调试了 这篇blog是顺着上一篇pixhawk 整体架构的认识写的 xff0c 接下来看程序的话 xff0c 打算把各个功能模块理解一遍 xff0c
  • pixhawk position_estimator_inav.cpp思路整理及数据流

    写在前面 xff1a 这篇blog主要参考pixhawk的高度解算算法解读 xff0c 并且加以扩展 xff0c 扩展到其他传感器 xff0c 其实里面处理好多只是记录了流程 xff0c 至于里面实际物理意义并不是很清楚 xff0c 也希望
  • 调试记录(一)pixhawk参数设置的问题

    一 光流模式进入不了 1 xff0e 网上下载的固件 xff0c 进入定点模式 xff0c qgc显示 拒绝 烧写自己编译的固件定高和定点都 拒绝 并且按照 xff08 源码解读 xff09 position estimator inav
  • 卡尔曼算法笔记---思想和实际应用物理含义的理解

    此片blog的目的是理解卡尔曼算法的思想和实际应用的物理含义 xff0c 想法很好 xff0c 却只能理解冰山一角 xff0c 先记下这一角 另本blog参考卡尔曼滤波 从推导到应用和徐亦达卡尔曼推导视频 首先认识卡尔曼算法在数学领域是什么
  • ELK-LogStash6.5.4

    ELK LogStash6 5 4 前言 与Elasticsearch Kibana不同 xff0c Logstash默认并不作为系统服务安装 xff0c 我们也不建议作为服务启动 主要原因为 xff1a 大多数情况下 xff0c Elas
  • pixhawk博客导读

    写的东西有点多 xff0c 写的也有点乱 xff0c 看题目也不知道内容是什么 xff0c 为了方便网友观看自己感兴趣的地方 xff0c 笔者把pixhawk博客归类一下 由于笔者也是边学习边写的 xff0c 难免有错误 xff0c 还请多
  • 科普“智能导航”--整理自大疆工程师

    1 飞行器想要稳定飞行 xff0c 需要 15 个状态量 xff1a 三维角度 xff0c 三维角度对应的三维速度 三维加速度 三维角速度 xff0c 三维位置 传感器的测量如下 xff1a 2 传感器自身的限制 xff1a 1 惯性测量元
  • pixhawk px4 字符型设备驱动

    分析字符型设备为什么register open read write怎样与底层驱动代码联系在一起的 xff0c 为什么需要注册 xff0c 为什么会有路径 xff0c 为什么open之后read write就可以读 写了 另 xff1a 此
  • pixhawk px4 spi设备驱动

    此篇blog是以nuttx官网介绍为出发点 xff0c 先分析如何初始化的 xff0c 再分析如何读取传感器数据的 xff0c 最后对比了字符型设备操作和spi驱动的实现方式的差别 如有错误还请指正 6 字符型设备 所有的结构体和API都在
  • Linux驱动概念扫盲篇

    驱动程序完全隐藏了设备工作的细节 用户的活动通过一套标准化的调用来进行 这些调用与特别的驱动是独立的 设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上 驱动应当做到使硬件可用 将所有关于如何使用硬件的事情留给应用程序 一
  • ardupilot & px4 书写自己的app & drivers (二)

    新建任务列表任务 打印时间 任务列表 const AP Scheduler span class hljs tag Task span Copter span class hljs tag scheduler tasks span span
  • Docs » Learning the ArduPilot Codebase » EKF » Extended Kalman Filter Navigation Overview and Tuning

    原文 xff1a http ardupilot org dev docs extended kalman filter html extended kalman filter navigation overview and tuning 本
  • Linux常用命令

    压缩 解压命令 01 tar格式 解包 xff1a xff0a xff0a xff0a xff0a xff0a xff0a xff0a tar xvf FileName tar 打包 xff1a xff0a xff0a xff0a xff0
  • linux C编程控制树莓派

    系统准备 1 xff09 打开Win32DiskImager exe 2 xff09 PC机插入sd卡 3 xff09 选择要烧录的系统 xff0c 笔者选择Ubuntu mate 16 04 4 xff09 烧录 显示 默认HDMI显示
  • mission planner发送数据之mavlink

    前段时间研究mp的地面站 xff0c 看了几天有点体会 xff0c 看网上的解析比较少 xff0c 写上来和大家分享下 xff0c 全是自己的理解 xff0c 东西比较少 xff0c 硬货不多 xff0c 还请见谅 最开始是想做个无人机超声
  • ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash

    ELK 使用nxlog 43 filebeat采集不同类型的日志输出到logstash 文章目录 ELK 使用nxlog 43 filebeat采集不同类型的日志输出到logstash 前言正常的采集配置开启多个端口监听优化nxlog xf