elk中logstash的使用

news2024/11/23 8:55:30

1.前言

logstash是一个相对较重的日志收集器,可以通过多种方式获取到日志数据,如tcp、日志文件、kafka、redis、rabbitmq等方式,还可以使用filter去过滤日志、转换日志为json格式,所以logstash是一个功能强大的日志收集器,logstash日志的收集都是通过配置文件去控制,所以需要更改收集方式,就更改配置文件,在重新使用新的配置文件启动即可

2.实践

通过tcp端口获取日志

可以用于收集微服务日志,微服务调用logstash日志框架直接将日志发送到logstash配置的端口中,logstash可以使用filter过滤需要的日志内容,也可以不过滤,若日志不是json格式,也可以通过filter去将日志做成json格式,在发送到elasticsearch中

vi /opt/logstash/logstash/config/logstash.conf

input {
  tcp {
    port => 5044      #接收日志的监听端口
    codec => "json"   #将输入的json日志结构化,输入的是json日志才需要配置此项,不是json日志配置此项可能会报错导致数据丢失
  }
}

filter {   #配置过滤日志,或者将日志配置为json日志

}

output {
#  stdout{       #测试使用的功能,将数据输出到当前页面
#    codec => rubydebug   #将输出的数据写入到logstash日志中
#  }
  elasticsearch {       #将数据输出到es中
    hosts => ["http://10.1.60.114:9200","http://10.1.60.115:9200","http://10.1.60.118:9200"]  #eslasticsearch集群地址
    index => "java-log-%{+YYYY.MM.dd}"   #eslasticsearch的索引名称,以时间的变量结尾,这样就会每天自动创建新的索引分割日志,默认是一主分片一副本分片,将数据写入到分片中,当eslasticsearch是单节点模式时,副本分片将不会被分配,索引状态显示yellow
  }
}

通过日志文件获取日志方式

此方式可以用于生成日志文件的应用收集日志,jar包、nginx等等应用,若是本来就是json格式的日志可以不用使用filter更改日志格式,直接输出到elasticsearch中,以下两个grok的内容分别是nginx access、nginx error日志的json模板,对于模板内容的解释会专门写一篇关于grok的

grok使用参考:grok使用(将日志结构化)_Apex Predator的博客-CSDN博客

vi /opt/logstash/logstash/config/logstash.conf

input {
  file {
    path => "/var/log/nginx/access.log"    #日志文件路径
    type => "nginx-access"                 #再有多个输入的情况下可以通过type去区分
  }
  file {
    path => "/var/log/nginx/error.log"     #日志文件路径
    type => "nginx-error"
  }
}

filter {
  if [type] == "nginx-access" {    #判断是哪一个日志
    grok {              #使用grok将日志重新做成json格式
      match => {        #nginx access日志的json格式模板,可以直接复制使用,不能确保完全匹配,还是需要根据自己的日志情况去更改模板
        "message" => "%{IP:ip} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:timestamp}\] \"%{WORD:request_method} %{URIPATHPARAM:request_url} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} %{NUMBER:bytes} \"(%{DATA:referrer}|-)\" \"%{DATA:http_agent}\" \"(%{DATA:forwarded}|-)\""
      }
    }
  }
  else if [type] == "nginx-error" {
    grok {
      match => {        #nginx error日志的json格式模板,可以直接复制使用,不能确保完全匹配,还是需要根据自己的日志情况去更改模板
        "message" => "%{DATA:timestamp} \[%{WORD:severity}\] %{NUMBER:pid}#%{NUMBER:tid}: %{GREEDYDATA:prompt}"
      }
    }
  }
}

output {          #数据输出端
#  stdout{
#    codec => rubydebug
#  }
  elasticsearch {
    hosts => ["http://10.1.60.114:9200","http://10.1.60.115:9200","http://10.1.60.118:9200"]
    index => "%{[type]}-%{+YYYY.MM.dd}"     #直接引用type字段创建索引,然后以时间结尾,这样的话每天都会自动分割日志了,还可以自动分配数据到合适的索引上
  }
}

通过filebeat获取日志

通过部署filebeat在每台需要收集日志的主机上,收集日志后统一传输到logstash中,logstash在input中配置监听端口去获取filebeat传输过来的日志

input {
  beats {           #配置为beats,供filebeat调用
    port => 5044      #配置监听端口,用于接收filebeat传输过来的日志
    codec => "json"    #如果传输过来的是json格式日志则需要此项配置,否则就删掉此项配置
  }
}

#若是收集得日志不是json格式,则通过以下filter配置为json格式,如果是json格式则不用要以下filter配置
filter {
  if [fields][log_type] == "nginx-access-log" {
    grok {
      match => {
        "message" => "%{IP:ip} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:timestamp}\] \"%{WORD:request_method} %{URIPATHPARAM:request_url} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} %{NUMBER:bytes} \"(%{DATA:referrer}|-)\" \"%{GREEDYDATA:agent}\" \"(%{DATA:forwarded}|-)\""
      }
    }
  }
  else if [fields][log_type] == "nginx-error-log" {
    grok {
      match => {
        "message" => "%{DATA:timestamp} \[%{WORD:severity}\] %{NUMBER:pid}#%{NUMBER:tid}: %{GREEDYDATA:prompt}"
      }
    }
  }
}

output {
#  stdout{
#    codec => rubydebug
#  }
  elasticsearch {
    hosts => ["http://10.1.60.114:9200","http://10.1.60.115:9200","http://10.1.60.118:9200"]
    index => "%{[fields][log_type]}-%{+YYYY.MM.dd}"
  }
}

通过kafka获取日志方式

通过消息队列获取日志,通常需要和filebeat轻量级日志收集器搭配使用,filebeat将日志消息写入到消息队列中,logstash在input中去kafka的主题中获取日志信息,在通过filter将日志变成json格式,在输入到elasticsearch中

vi /opt/logstash/logstash/config/logstash.conf

input {
  kafka {    #配置为从kafka获取数据
    bootstrap_servers => "10.1.60.112:9092,10.1.60.114:9092,10.1.60.115:9092"  #kafka集群地址
    client_id => "nginx"            #消费者id
    group_id => "nginx"             #消费者组id,避免重复消费的关键
    auto_offset_reset => "latest"   #偏移量,设置latest为使用主题中最新的偏移量,避免重复消费,即使logstash宕机恢复后,也会消费完宕机的时间段产生的数据
    consumer_threads => 1         #消费者线程1  
    decorate_events => true        
    topics => ["nginx-access-log","nginx-error-log"]   #数据存放的主题
    codec => json   #将kafka的json数据结构化,这样的话在通过kibana展示的时候就可以通过字段查找数据
  }
}

filter {
  if [fields][topic] == "nginx-access-log" {   #此处也是通过topic的变量去辨别是哪个主题,不过此处的变量参数和output中的topic变量有点区别
    grok {
      match => {
        "message" => "%{IP:ip} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:timestamp}\] \"%{WORD:request_method} %{URIPATHPARAM:request_url} HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} %{NUMBER:bytes} \"(%{DATA:referrer}|-)\" \"%{DATA:http_agent}\" \"(%{DATA:forwarded}|-)\""
      }
    }
  }
  else if [fields][topic] == "nginx-error-log" {
    grok {
      match => {
        "message" => "%{DATA:timestamp} \[%{WORD:severity}\] %{NUMBER:pid}#%{NUMBER:tid}: %{GREEDYDATA:prompt}"
      }
    }
  }
}

output {
#  stdout{
#    codec => rubydebug
#  }
  elasticsearch {
    hosts => ["http://10.1.60.114:9200","http://10.1.60.115:9200","http://10.1.60.118:9200"]
    index => "%{[@metadata][kafka][topic]}-%{+YYYY.MM.dd}"   #通过topic和时间的变量去分别设置索引名称
  }
}                                       

以上是logstash收集日志的其中三种方式,配置收集的时候可以参考

3.json格式日志收集展示

更改nginx配置文件,将日志改为json格式日志

vi /etc/nginx/nginx.conf

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

#上面部分是nginx默认的输出日志格式,包括参数
#下面部分是按照原日志中的参数,改为json格式

    log_format  log_json '{ "time_local": "$time_local", '
                           '"remote_addr": "$remote_addr", '
                           '"referer": "$http_referer", '
                           '"request": "$request", '
                           '"status": $status, '
                           '"bytes": $body_bytes_sent, '
                           '"agent": "$http_user_agent", '
                           '"x_forwarded": "$http_x_forwarded_for", '
                           '"up_addr": "$upstream_addr", '
                           '"up_host": "$upstream_http_host", '
                           '"up_resp_time": "$upstream_response_time", '
                           '"request_time": "$request_time" }';

#此处也需要将nginx日志引用到输出的日志文件中

    access_log  /var/log/nginx/access.log  log_json;

优雅重载nginx配置

ngins -s reload

通过http去访问一下nginx的80端口,查看一下日志

curl 10.1.60.115

tail -f /var/log/nginx/access.log

可以对比一下上下两条日志,上一条是nginx默认的日志格式,在logstash中需要通过filter去更改为json格式,而下面一条是直接在nginx配置文件就修改nginx的日志格式为json格式,主要是如果不改json格式,在kibana中就没法通过字段去查询需要的内容,展示的日志内容就是一长串的日志,根据以上配置我们输出到eslasticsearch看一下,额外再多收集一个默认格式error报错日志作为对比

 我们就是用从file收集日志的logstash配置

vi /opt/logstash/logstash/config/logstash.conf

input {
  file {
    path => "/var/log/nginx/access.log"  
    type => "nginx-access"             
    codec => "json"
  }
  file {
    path => "/var/log/nginx/error.log" 
    type => "nginx-error"
  }
}

filter {     

}

output {         
#  stdout{
#    codec => rubydebug
#  }
  elasticsearch {
    hosts => ["http://10.1.60.114:9200","http://10.1.60.115:9200","http://10.1.60.118:9200"]
    index => "%{[type]}-%{+YYYY.MM.dd}"
  }
}

以上output配置中,可以先禁用输出到elasticsearch中,启用stdout配置项输出到日志中查看一下日志是否配置正确,使用该配置文件启动logstash服务

nohup /opt/logstash/logstash/bin/logstash -f /opt/logstash/logstash/config/logstash.conf > /opt/logstash/logstash/logstash.log &

 先访问nginx的80端口,让nginx写入日志数据

curl 10.1.60.115

查看logstash的日志,看输出的日志数据格式是否正确

tail -f /opt/logstash/logstash/logstash.log

可以看到能正常获取到正确的日志数据格式

此时需要将logstash配置文件中的stdout配置注释,将elasticsearch取消注释,再次重启logstash服务即可,重启的话先kill掉正在运行的logstash服务,在启动新的logstash服务,然后再次访问nginx去产生日志,查看kibana输出

可以看到nginx生成访问日志后,elasticsearch 也自动创建了符合配置规则的索引,并将日志写入,查看一下日志数据

 可以看到蓝色标签的都是json日志的字段,并且都包含了nginx日志配置的字段,kibana可以通过字段搜索到想要的内容 

接下再来生成一下没有json格式的nginx error日志看看效果

先更改nginx的配置文件,随便往里面写入一些字母,再优雅重载nginx配置文件,因为配置文件有问题,重载nginx配置会生成错误日志

vi /etc/nginx/nginx.conf

nginx -s reload

通过kibana看一下效果

可以看到nginx生成报错日志后,elasticsearch 也自动创建了符合配置规则的索引,并将日志写入,查看一下日志数据

 

message字段就是nginx的error日志,因为日志不是json格式的原因,所以是没有字段的,只有一长条日志,若是需要将日志修改为json格式就需要用到logstash的filter去将日志更改为json格式 

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

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

相关文章

MFC项目添加外部头文件和源文件后编译出现C1010错误

出现这个问题的主要原因是如果使用VC向生成工程的话&#xff0c;默认使用预编译头文件“stdafx.h”&#xff0c;这样做的目的是为了加快编译速度。 如果加入第三方c/cpp文件没有#include “stdafx.h” &#xff0c;就会报此错误。 在<解决方案管理器中>(就是可以看到工程…

NLLloss,KLDivLoss,CrossEntropyLoss三类损失函数比对

前置知识 这三个函数在深度学习模型中十分常见&#xff0c;尤其是在知识蒸馏领域&#xff0c;经常会将这三个函数进行比较 1、Softmax函数 softmax函数通常作为多分类以及归一化函数使用&#xff0c;其公式如下&#xff1a; s o f t m a x ( x ) e x i ∑ i 1 e x i soft…

Drools概述和基本原理

目录 ​编辑 一、Drools是什么&#xff1f; 二、Drools使用场景 三、Drool架构内容 3.1 总体架构 3.2 构成内容说明 3.2.1 Rules 3.2.2 Production memory 3.2.3 Facts 3.2.4 Working memory 3.2.5 Pattern matcher 3.2.6 Agenda 四、为什么要用规则引擎&#xff1f; 4.1 声明…

el-descriptions的使用

el-descriptions的使用 解释&#xff1a; 我们页面有很多无序的列表展示&#xff0c;为了高效得去开发我们得页面&#xff0c;可以借助于这个组件进行适应。图片&#xff1a; 代码&#xff1a; template部分 <el-descriptions class"margin-top" :column"…

IP数据云揭示高风险IP的来源地

在全球网络安全日临近之际&#xff0c;IP数据云揭示高风险IP的来源地。这些高风险IP以其潜在威胁和犯罪活动而闻名&#xff0c;已引起了全球范围内的关注。 根据IP数据云介绍&#xff0c;高风险IP的主要来源地是位于亚洲和东欧的国家其中包括俄罗斯、朝鲜和乌克兰等地。这些地区…

论文阅读:Segment Anything之阅读笔记

目录 引言整体结构介绍论文问答代码仓库中&#xff0c;模型哪部分转换为了ONNX格式&#xff1f;以及如何转的&#xff1f;Mask decoder部分 Transformer decoder block?如何整合image_embedding&#xff0c;image_pe, sparse_prompt_embedding和dense_prompt_embedding的&…

Android Framework基础面试必问习题~

AMS 下面是一些可能会被问到的 Android Framework 中 Activity Manager Service (AMS) 相关的面试题&#xff1a; 1.什么是 AMS&#xff1f; AMS 是 Android framework 中的一个系统进程&#xff0c;它负责管理应用程序生命周期&#xff0c;处理应用程序间的交互和协调不同组…

用Electron将Vue项目打包成桌面版软件

创建Electron项目这里是直接通过官方教程创建的 要检查 Node.js 是否正确安装&#xff0c;请在您的终端输入以下命令&#xff1a; node -vnpm -v这两个命令应输出了 Node.js 和 npm 的版本信息。 创建Electron应用程序 使用脚手架创建 Electron 应用程序遵循与其他 Node.js…

【Squid 代理服务器应用】

目录 一、Squid 代理服务器1、代理的工作机制2、代理服务器的概念及其作用3、Squid 代理的类型 二、安装 Squid 服务1&#xff0e;编译安装 Squid2&#xff0e;修改 Squid 的配置文件3&#xff0e;Squid 的运行控制1、检查配置文件语法是否正确2、启动 Squid&#xff0c;第一次…

在SpringBoot中对es集群的查询操作

在进行查询之前要先给ll索引中插入数据: POST /ll/product/1 {"id":1,"title": "小米手机Mix","category": "手机","brand": "小米","price": 2899.00,"images": "http://ima…

【数据结构】——常见排序算法(演示图+代码+算法分析)

目录 1. 常见排序算法 1.2 稳定性 2. 常见排序算法的实现 2.1 插入排序 2.1.1基本思想 2.1.2代码 2.1.4算法分析 2.2 希尔排序 2.2.1基本思想 2.2.2代码 2.2.3演示图 2.2.4算法分析 2.3 选择排序 2.3.1基本思想 2.3.2代码 2.3.3演示图 2.3.4算法分析 2.4 堆排…

[Visual Studio 报错] error 找不到指定的 SDK“Microsoft

[Visual Studio 2022 报错] error : 找不到指定的 SDK“Microsoft.NET.Sdk.Web” 问题描述&#xff1a; 在新电脑上安装了VS2022&#xff0c;打开现有项目的解决方案后的时候报了这个错&#xff0c;所有projet文件都加载失败,如图所示&#xff1a; 报错分析及解决 打开项目配…

黑客是怎样炼成的?

前言 首先我谈下对黑客&网络安全的认知&#xff0c;其实最重要的是兴趣热爱&#xff0c;不同于网络安全工程师&#xff0c;他们大都是培训机构培训出来的&#xff0c;具备的基本都是防御和白帽子技能&#xff0c;他们绝大多数的人看的是工资&#xff0c;他们是为了就业而学…

MFC扩展库BCGControlBar Pro v33.5新版亮点 - 控件、脚本管理增强

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.5已正式发布了&#xff0c;此版本包含了Ribbon&#xff08;功能区&#xff09;自定义…

CSS文本样式

CSS文本样式 1、字体 友情提醒&#xff1a; 字体有没有版权&#xff1f; 省略写法 语法&#xff1a; [ [ <‘font-style’> || || <‘font-weight’> || <‘font-stretch’> ]? <‘font-size’> [ / <‘line-height’> ]? <‘font-fam…

IDEA2023.1.3自带插件禁用,减少内存占用

前言 前两个星期安装了idea2023.1.3&#xff08;之前用的一直是idea2020.3版本&#xff09;&#xff0c;我发现新版界面确实更好看一些&#xff0c;而且启动速度也非常快&#xff0c;打开多个项目也一样很快&#xff0c;都是秒开。但是吧&#xff0c;它的内存占用比idea2020.3…

【若依】框架搭建,前端向后端如何发送请求,验证码的实现,开启注册功能

若依框架 若依框架&#xff08;Ruoyi&#xff09;是一款基于Spring Boot和Spring Cloud的开源快速开发平台。它提供了一系列的基础功能和通用组件&#xff0c;能够帮助开发者快速构建企业级应用。若依框架采用了模块化的设计理念&#xff0c;用户可以选择需要的功能模块进行集…

(03)QEMU模拟ATF启动

QEMU启动 准备一个目录qemu_boot存放所有镜像文件。最终启动需要的镜像如下所示。 Image QEMU_EFI.fd bl1.bin bl2.bin bl31.bin fip.bin flash.bin rootfs.cpio.gz准备镜像 EDK2 下载QEMU_EFI。 wget http://snapshots.linaro.org/components/kernel/leg-virt-tian…

go-redis

安装redis&#xff08;docker&#xff09; sudo docker pull redis sudo docker images 在官网下载redis.conf配置文件 redis官网&#xff1a;http://www.redis.cn/download.html 将下载后的压缩包解压得到redis.conf文件&#xff0c;放到自己的目录&#xff0c;我的是/hom…

数据结构与算法——图

&#x1f60a;数据结构与算法——图 &#x1f680;前言&#x1f680;图的基本概念&#x1f6a2;图的定义&#x1f6a2;图的基本操作&#x1f6a2;无向图和有向图&#x1f6a2;完全图&#x1f6a2;顶点的度、入度和出度&#x1f6a2;子图&#x1f6a2;顶点关系常用术语&#x1f…