docker搭建简单elk日志系统5(logstash管道配置文件logstash.conf)

news2024/9/21 19:44:44

1.查看logstash管道配置文件logstash.conf

cd ~/elk/logstash/pipeline/
cat logstash.conf

在这里插入图片描述
默认的配置文件输入是beat;
beat表示ELK Stack中的核心组件Beats;
Beats指轻量型数据采集器,是一些列beat的合称;目前官网上的beat有:

Filebeat
用于采集日志和其他数据的轻量型采集器

Metricbeat
轻量型指标数据采集器

Packetbeat
轻量型网络数据采集器

Winlogbeat
轻量型 Windows 事件日志采集器

Auditbeat
轻量型审计数据采集器

Heartbeat
用于运行状态监测的轻量型采集器
那么搭建日志系统所用的beat就是filebeat;关于filebeat连接logstash,在
docker搭建简单elk日志系统4中有相关配置
默认的配置文件输出是stdout;
stdout(标准输出),即默认会将beat发送过来的数据打印到控制台上

2.修改logstash的默认输出

通过filebeat收集的日志传到logstash中,logstash处理后最后要传送到elasticsearch才能让日志持久化到磁盘中,方便后续查看分析;
vim ~/elk/logstash/pipeline/logstash.conf
在output中添加

  elasticsearch {
    hosts => ["https://192.168.182.128:9200"]
    index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
    cacert => "/usr/share/logstash/config/certs/http_ca.crt"
    user => "elastic"
    password => "+4TMJBgOpjdgH+1MJ0nC"
  }

在这里插入图片描述
logstash.yml相关配置
hosts :elasticsearch的地址;使用https;同logstash.yml中的配置
index:索引,所有存到elasticsearch的数据都需要设置索引([fields][env]和[fields][application]是在filebeat中添加的自定义字段)
cacert:elasticsearch证书;同logstash.yml中的配置
user :elasticsearch账户;同logstash.yml中的配置
password :上面user对应的密码;同logstash.yml中的配置

3.重启logstash

docker restart logstash

在这里插入图片描述

4.生成日志供filebeat收集

这里生成了一条错误日志
在这里插入图片描述
查看logstash日志

docker logs -f --tail 200  logstash

在这里插入图片描述

5.登录kibana查看是否生成索引

在这里插入图片描述
在这里插入图片描述
此处生成了一个名为dev-test-2023.04.18的索引;
这个索引由logstash.conf中的index配置生成的

index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"

{[fields][env]}和%{[fields][application]}分别表示取json数据中的fileds.env和fileds.application字段;
fileds.env和fileds.application是在filebeat配置中设置的
在这里插入图片描述
%{+YYYY.MM.dd}表示取当前日期;索引名中动态取当前日期意味着,每天产生的日志对应elasticsearch中都有一个单独的索引

6.在kiban中查看日志

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
视图名称使用dev-test-*匹配所有以dev-test-开头的索引
在这里插入图片描述
在这里插入图片描述
这里的文档就对应产生的一条日志
这个文档里面的字段可能除了日志本身外还有很多我们不关心的字段
可以在左侧过滤出想展示的字段
找到message字段添加
在这里插入图片描述
此时展示的内容即为产生的日志
在这里插入图片描述
产生的日志是一条错误日志,内容比较多;这里并没有全部展示出来而是折叠了;设置日志行宽度自适应
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.logstash.conf输出配置中添加action配置

如果配置action => “create”;则会生成数据流,数据流下面的后备索引才是真正的索引,类似索引的别名;设置数据流主要是方便设置索引的生命周期,日志会不断地产生,但是磁盘确实有限的资源,所以需要给索引设置生命周期,自动删除那些老旧的日志,为新的日志腾出空间;如何设置索引生命周期后面再说

在这里插入图片描述
数据流命名格式一般为“logs-应用名-环境“
修改配置文件

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["https://192.168.182.128:9200"]
    #index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
    index =>"logs-%{[fields][application]}-%{[fields][env]}"
    action => "create"
    cacert => "/usr/share/logstash/config/certs/http_ca.crt"
    user => "elastic"
    password => "+4TMJBgOpjdgH+1MJ0nC"
  }

  stdout {
    codec => rubydebug
  }
}

在这里插入图片描述

8.重启logstash,生成新的日志,查看logstash日志

docker restart logstash
docker logs -f logstash

程序日志输出
在这里插入图片描述
logstash日志
在这里插入图片描述
elasticsearch中出现数据流
在这里插入图片描述

9.按照前面的方法创建数据视图

logs-test-dev
通过Discover查看视图
在这里插入图片描述
从产生的三条日志来看,发现一个问题:这里默认排序是按@timestamp字段倒序排列的;但是按日志产生的顺序来看最上面两条是正序排列的,而最上面两条日志和第三条日志之间又是倒序排列的
在这里插入图片描述
这样日志看起来可能就比较混乱;造成这个现象的原因是:@timestamp字段是filebeat收集日志的时间,但是filebeat收集日志并不是应用产生一条日志就收集一条,而是一批一批收集的,也就是最上面两条日志是同一批次收集的,es并不能区分同一批里面日志的先后顺序;而日志里面的时间才是日志真实产生的时间,@timestamp只是收集日志的时间;
所以要解决的问题就是从日志将日志真实产生时间提取出来,并设置到@timestamp字段中,要从日志中提取时间就需要给将日志进行拆分

10.日志字段拆分

java日志一般有固定格式;我们可以根据格式将每一条日志拆分成固定数量的字段,就像关系型数据库一样
如下面的日志:

2023-04-21 17:09:36.394 ERROR [xcoa,,] 23072 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - Exception during pool initialization.

2023-04-21 17:09:36.394 =>日志产生时间
ERROR =>日志级别
[xcoa,] =>上下文等信息
23072 => 进程id
[ main] => 线程名
com.zaxxer.hikari.pool.HikariPool =>类名
HikariPool-2 - Exception during pool initialization. =>日志内容
针对这个日志,在logstash中可以根据下面的grok表达式进行匹配:

(?m)^%{TIMESTAMP_ISO8601:log-time}\s+%{LOGLEVEL:log-level}\s+\[%{DATA:application}\]\s+%{INT:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:log-message}

拆分出的各个字段如下:

log-time:日志产生时间
log-level:日志级别
application :上下文等信息
pid:进程id
thread:线程名
class:类名
log-message.:日志内容

对应在logstash配置

input {
  beats {
    port => 5044
  }
}

filter{
  grok{
    match => {
      "message" => "(?m)^%{TIMESTAMP_ISO8601:log-time}\s+%{LOGLEVEL:log-level}\s+\[%{DATA:application}\]\s+%{INT:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:log-message}"
    }
  }
}

output {
  elasticsearch {
    hosts => ["https://192.168.182.128:9200"]
    #index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
    index =>"logs-%{[fields][application]}-%{[fields][env]}"
    action => "create"
    cacert => "/usr/share/logstash/config/certs/http_ca.crt"
    user => "elastic"
    password => "+4TMJBgOpjdgH+1MJ0nC"
  }

  stdout {
    codec => rubydebug
  }
}

在这里插入图片描述

11.日志字段拆分效果测试

重启logstash

docker restart logstash

产生日志
在这里插入图片描述
kibana中查看(已经可以在字段列表中看到拆分出来的字段,后续可以用这些字段筛选)
在这里插入图片描述

12.日志按产生时间排序

前面已经将日志产生时间拆分出来并放在log-time字段里面
在这里插入图片描述
所以需要做的是,用log-time字段的内容覆盖@timestamp就可以了
logstash.conf的filter中加入配置:

  date {
      match => ["log-time", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601"] #原字段转换成时间类型
      locale => "en"
      target => [ "@timestamp" ] #目标字段
      timezone => "Asia/Shanghai"
  }

这里的配置就是将log-time按格式化转化为时间类型然后覆盖到@timestamp字段

如果想保留原@timestamp,可以将原@timestamp值赋值给新的字段:
下面配置将@timestamp设置给了一个新字段collection_time

  ruby {
    code => "event.set('collection_time', event.get('@timestamp'))"
  }

完整配置为:
在这里插入图片描述

input {
  beats {
    port => 5044
  }
}

filter{
  grok{
    match => {
      "message" => "(?m)^%{TIMESTAMP_ISO8601:log-time}\s+%{LOGLEVEL:log-level}\s+\[%{DATA:application}\]\s+%{INT:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:log-message}"
    }
  }
  ruby {
    code => "event.set('collection_time', event.get('@timestamp'))"
  }
  date {
      match => ["log-time", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601"]
      locale => "en"
      target => [ "@timestamp" ]
      timezone => "Asia/Shanghai"
  }
}

output {
  elasticsearch {
    hosts => ["https://192.168.182.128:9200"]
    #index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
    index =>"logs-%{[fields][application]}-%{[fields][env]}"
    action => "create"
    cacert => "/usr/share/logstash/config/certs/http_ca.crt"
    user => "elastic"
    password => "+4TMJBgOpjdgH+1MJ0nC"
  }

  stdout {
    codec => rubydebug
  }
}

13.效果测试

重启logstash

docker restart logstash

在这里插入图片描述
产生日志

在这里插入图片描述
kibana中查看新产生的日志:
在这里插入图片描述
可以看到新产生的日志@timestamp值现在是一致的。使用@timestamp也不会出现日志乱序的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql注入 Quine注入解析

前言 quine注入,即查询的结果是查询的语句 首先看看如下sql语句会返回什么 select replace(".",char(46),".");返回了一个点 匹配字符串".“中ascii码为46的字符并替换为”.“,也就是将”.“转换为”."并返回 继续看下面这个sql语句 selec…

状态机编程

//定义的枚举 typedef enum { KEY_UP 1, //按键按下 Edge_Lead2, //前沿抖动 KEY_DOWN 3, //按键松开 Edge_Back4, //后沿抖动 } KEY_Status; 主函数: #include "stm32f4xx.h" #include "led.h" #include "delay.h" #include "…

QMS-云质说质量 - 8 颠覆你的认知,中小型企业数字化转型更容易成功

数字化转型,不但不遥远,而且似乎离我们每个人的生活还非常近。尤其是近几年,出于政府号召与扶持,市场竞争以及企业自身发展需要等各方面原因,越来越多的企业已经开始或者正在准备进行数字化转型。即使是规模一两百人的…

MATLAB如何自定义颜色图(colormap)

MATLAB有一套自己的颜色库,常用的都有,但是数量不算太多。我们有时候需要用到一些MATLAB没有的colormap,比如Python的Matplotlib就有很多的colormap,我们也有可能需要自己来定义一些渐变的颜色。本片笔记主要是介绍colormap如何自…

在vite中使用mockjs, vite中使用vite-plugin-mock

相信前端同学都会碰见类似的问题,就是页面可能很快写完了,但是接口同学还在缓慢设计表中! 这个时候咳咳,你就可以去摸鱼了或者看小说了 但实际上可不能这样哦,要老老实实做个打工人 步入正题了 在vite中有个mock的插…

SpringCloud学习6(Spring Cloud Alibaba)断路器Sentinel熔断降级

文章目录 服务熔断降级Sentinel高并发请求模拟(这里我们使用contiperf来进行测试)修改tomcat配置最大线程数引入测试依赖编写测试代码 服务雪崩服务雪崩的容错方案(隔离、超时、限流、熔断、降级)隔离机制:超时机制&am…

混淆电路(GC)

基本概念 在混淆电路框架下,任意功能函数可被表示为一个与门和异或门组成的布尔电路,协议的参与方由生成方(Garbler)和计算方(Evaluator)组成。 **大致的流程:**生成方生成密钥并加密查找表&am…

淘宝天猫数据查询(天猫智能手环数据分析)

近几年,中国智能可穿戴设备市场规模不断增长,也取得了傲人的成绩。从可穿戴设备市场整体发展来看,智能手环是一大主角。智能手环市场接受度和认可度的逐渐提升,为各类厂商提供了更多机会,同时这也蕴含了更多市场增量空…

分享两个有意思的登录界面

1.带有浮动占位符和灯光按钮的登录界面 先上效果: 代码如下: <!DOCTYPE html> <html lang="en"> <head>

L2-2 天梯赛的赛场安排

作者 陈越 单位 浙江大学 天梯赛使用 OMS 监考系统&#xff0c;需要将参赛队员安排到系统中的虚拟赛场里&#xff0c;并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们&#xff0c;以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#…

this.$set的正确使用

this.#set(obj, key, value) 我们在项目开发的过程中&#xff0c;经常会遇到这种情况&#xff1a;为data中的某一个对象添加一个属性 <template><div class"hello"><button click"setMessage">添加属性</button>{{ student.name…

开发IM(即时通讯)服务端

首先讲讲IM&#xff08;即时通讯&#xff09;技术可以用来做什么&#xff1a;可以说几乎所有高实时性的应用场景都需要用到IM技术。 本篇将带大家从零开始搭建一个轻量级的IM服务端&#xff0c;麻雀虽小&#xff0c;五脏俱全&#xff0c;我们搭建的IM服务端实现以下功能&#x…

gpt.4.0-gpt 国内版

gpt 使用 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种预训练的语言模型&#xff0c;可用于多种自然语言处理任务&#xff0c;如情感分析、文本分类、文本生成等。下面是使用GPT的一些步骤和建议&#xff1a; 确定任务和数据集&#xff1a;首先&…

选择美国虚拟主机需注意的安全问题

在选择美国虚拟主机时&#xff0c;安全性应该是您首要关注的问题。虚拟主机通常是网站托管的最便宜和最方便的方式之一&#xff0c;但也存在安全问题。在本文中&#xff0c;我们将讨论一些您应该注意的安全问题&#xff0c;并提供一些解决方案来保护您的网站。 一、了解虚拟主机…

Linux 配置与磁盘管理

目录 物理设备的命名规则Linux中硬盘分区部分Linux在分区上建立文件系统挂载Linux硬盘管理工具LVM逻辑卷管理器物理卷、卷组合逻辑卷的建立 逻辑卷的使用LVM整体创建流程硬盘配额配置&#xff08;针对用户或者群组使用的空间&#xff09; 物理设备的命名规则 Linux系统内核中的…

分析trace 知识点分析的很全面

Total time breakdown&#xff1a;依据关键tag拆分&#xff0c;比如binderapplication/activitystart/doframe 找出时间差异大tag的cpu status &#xff1a;Running/Runnable/Sleeping/Uninterruptible sleep Running:SW-diff-check 或 cpu能力(大小核或频率&#xff09; Runna…

v-for比v-if优先级更高?面试官:回去等通知吧

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 v-if和v-for哪个优先级更高呢&#xff1f;这是面试官常常问到的一个问题&#xff0c;…

七、vue-基础之条件渲染

一、条件渲染 在某些情况下&#xff0c;我们需要根据当前的条件决定某些元素或者组件是否渲染&#xff0c;这个时候我们就需要进行条件判断了。 Vue提供了下面的指令来进行条件判断&#xff1a; v-ifv-elsev-else-ifv-show &#xff08;1&#xff09;需求demo体验 我们直接…

Win11的两个实用技巧系列之内存不足导致永劫无间闪退解决方法、Win11本地安全机构保护误报修复方法

Win11内存不足导致永劫无间闪退解决方法 Win11内存不足导致永劫无间闪退怎么办&#xff1f;其实解决方法很简单&#xff0c;本文就为大家带来了详细的解决方法&#xff0c;感兴趣的朋友一起看看吧 Win11内存不足导致永劫无间闪退怎么办&#xff1f;永劫无间出现闪退的情况可能…

python练手小案例——采集二手车数据

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例亮点: 1、系统分析目标网页 2、html标签数据解析方法 3、海量数据一键保存 环境介绍: 在开始写我们的代码之前&#xff0c;我们要准备好运行代码的程序 Python 3.8.8 | Anaconda, Inc. &#xff1a;解释器 Pych…