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 的相关文章

随机推荐

  • 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