百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

ELK技术栈-Logstash使用详解

bigegpt 2024-09-09 01:17 8 浏览

常用启动参数

我们在上一节中演示了启动Logstash的实例,其中我们启动的时候给Logstash脚本传入了-e的参数,但实际上,Logstash的启动参数有很多,我们来看一下各个启动参数的作用:

  • -e #立即启动实例,例如:./logstash -e "input {stdin {}} output {stdout {}}"
  • -f #指定启动实例的配置文件,例如:./logstash -f config/test.conf
  • -t #测试配置文件的正确性,例如:./logstash -f config/test.conf -t
  • -l #指定日志文件名称,例如:./logstash -f config/test.conf -l logs/test.log
  • -w #指定filter线程数量,不指定默认是5,例如:./logstash-f config/test.conf -w 8

配置文件语法

文件结构

我们刚刚知道,启动参数可以指定一个配置文件,那么接下来就有必要来了解一下配置文件的结构:

Logstash通过{}来定义区域,区域内可以定义插件,一个区域内可以定义多个插件,如下:

input {
 #标准输入源插件
 stdin {
 }
 #普通文件源插件
 file {
 path => ["/var/log/*.log", "/var/log/message"]
 ....
 }
 ......
}
filter {
 #grok过滤插件
 grok {
 match => ["message", "%{HTTPDATE:logdate}"]
 .....
 }
 #date过滤插件
 date {
 match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
 .....
 }
 .....
}
output {
 stdout {
 }
 elasticsearch {
 hosts => ["127.0.0.1:9200"]
 ....
 }
 .....
}

我们先大概了解一下配置文件的结构,接下来我们再详细看这些插件的配置。

数据类型

Logstash配置文件支持的数据类型有:

1、Boolean,例如:ssl_enable => true

2、Number,例如:port => 33

3、String,例如:name => “Hello world”

4、hash,例如:options => {key1 => “value1”, key2 => “value2”}

5、array,例如:match => [“datetime”, “UNIX”, “ISO8601”]

字段引用

Logstash数据流中的数据被称之为Event对象,Event以JSON结构构成,Event的属性被称之为字段,如果你想在配置文件中引用这些字段,只需要把字段的名字写在中括号[]里就行了,如[type],对于嵌套字段每层字段名称都写在[]里就可以了,比如:[tags][type];除此之外,对于Logstash的arrag类型支持下标与倒序下表,如:[tags][type][0]和[tags][type][-1]

以下的内容就是一个Event对象:

{
 "message" => "hello logstash",
 "@version" => "1",
 "@timestamp" => 2018-08-13T17:32:01.122Z,
 "host" => "localhost.localdomain"
}

条件判断

Logstash支持下面的操作符:

1、==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)

2、=~(匹配正则), !~(不匹配正则)

3、in(包含), not in(不包含)

4、and(与), or(或), nand(非与), xor(非或)

5、()(复合表达式), !()(对复合表达式结果取反)

例如以下的条件判断:

if "_grokparsefailure" not in [tags] {
} 
else if [status] !~ /^2\d\d/ or ( [url] == "/noc.gif" nand [geoip][city] != "beijing" ) {
} 
else {
}

环境变量引用

Logstash支持引用系统环境变量,环境变量不存在时可以设置默认值,例如:

export TCP_PORT=12345
input {
 tcp {
 port => "${TCP_PORT:54321}"
 }
}

常用输入插件

在第九章中,我们已经使用是标准输入,以键盘的输入数据作为Logstash数据源,但实际上我们也知道,Logstash的数据源有很多,每种数据源都有相应的配置,在Logstash中,这些数据源的相应配置称为插件,我们常用的输入插件有:file、jdbc、redis、tcp、syslog,这些输入插件会监听数据源的数据,如果新增数据,将数据封装成Event进程处理或者传递,更多的输入插件大家可以看Logstash官网,接下来我们以file和jdbc两个输入插件作为例子,来学习输入插件的使用,其他输入插件使用起来大同小异,大家自行扩展。

file输入插件

读取文件插件主要用来抓取文件的数据变化信息,以此作为Logstash的数据源。

  • 配置示例:
input{
file {
 path => ["/var/log/*.log", "/var/log/message"]
 type => "system"
 start_position => "beginning"
}
}
output{
stdout{}
}
  • 常用参数

jdbc输入插件

该插件可以使用jdbc把关系型数据库的数据作为Logstash的数据源

  • 配置示例:
input {
jdbc {
 jdbc_driver_library => "/opt/logstash/mysql-connector-java-5.1.36-bin.jar"
 jdbc_driver_class => "com.mysql.jdbc.Driver"
 jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
 jdbc_user => "mysql"
 jdbc_password => "123456"
 parameters => { "favorite_artist" => "Beethoven" }
 schedule => "* * * * *"
 statement => "SELECT * from songs where artist = :favorite_artist"
}
}
output{
stdout{}
}
  • 常用参数(空 = 同上)

常用过滤插件

丰富的过滤器插件的是 logstash威力如此强大的重要因素,过滤器插件主要处理流经当前Logstash的事件信息,可以添加字段、移除字段、转换字段类型,通过正则表达式切分数据等,也可以根据条件判断来进行不同的数据处理方式。我们常用的过滤插件有:grok、date、geoip、mutate、json、Split、ruby,更多的过滤插件大家可以看Logstash官网,接下来我们以grok、date和geoip这3个过滤插件作为例子,来学习过滤插件的使用,其他过滤插件使用起来大同小异,大家自行扩展。

grok正则插件

grok正则捕获是Logstash中将非结构化数据解析成结构化数据以便于查询的最好工具,非常适合解析system log,web log, database log等任意的 log文件。

  • 内置正则表达式调用
  • grok提供100多个常用正则表达式可供使用,这100多个正则表达式定义在logstash/vendor/bundle/jruby/x.x/gems/logstash-patterns-core-xxx/patterns/grok-patterns文件中,想要灵活的匹配各种数据,那么必须查看该文件,大概了解grok提供了什么内置的正则表达式。调用它们的语法如下:%{SYNTAX:SEMANTIC}
  • SYNTAX:表示内置的正则表达式的名称
  • SEMANTIC:表示在Event中创建该字段名来存储匹配到的值
  • 例如:输入的数据内容为“[debug] 127.0.0.1 - test log content”,我们想提取127.0.0.1这个IP地址,那么可以使用以下语法来匹配:%{IP:client},将获得“client: 127.0.0.1”的结果,该结果将成为Event的一个新的字段和字段值;如果你在捕获数据时想进行数据类型转换可以使用%{NUMBER:num:int}这种语法,默认情况下,所有的返回结果都是string类型,当前Logstash所支持的转换类型仅有“int”和“float”;
  • 自定义表达式调用
  • 与预定义表达式相同,你也可以将自定义的表达式配置到Logstash中,然后就可以像于定义的表达式一样使用;以下是操作步骤说明:
  • 1、在Logstash根目录下创建文件夹“patterns”,在“patterns”文件夹中创建文件“extra”(文件名称无所谓,可自己选择有意义的文件名称);
  • 2、在文件“extra”中添加表达式,格式:patternName regexp,名称与表达式之间用空格隔开即可,例如:POSTFIX_QUEUEID [0-9A-F]{10,11}
  • 3、使用自定义的表达式时需要在grok插件配置“patterns_dir”属性,属性值为extra文件所在的目录。
  • 配置示例
  • 日志文件http.log每行内容为:55.3.244.1 GET /index.html 15824 0.043 message-id:BEF25A72965
  • grok表达式:表达式:%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
  • 配置文件内容:
input {
file {
 path => "/var/log/http.log"
}
}
filter {
grok {
 patterns_dir => ["./patterns"]
 match => {"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} message\-id:%{POSTFIX_QUEUEID:queueid}"}
}
}
output{
 stdout{}
}
  • 输出结果:
client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043
queueid: BEF25A72965
  • 示例解析
  • 1、/var/log/http.log文件每一行的格式为55.3.244.1 GET /index.html 15824 0.043 message-id:BEF25A72965,到时候会把每一行数据封装成一个Event。
  • 2、使用grok过滤插件处理该文件,match为匹配Event中的message,message就是该文件的一行数据,比如55.3.244.1 GET /index.html 15824 0.043 message-id:BEF25A72965。
  • 3、匹配message的内容使用%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} message\-id:%{POSTFIX_QUEUEID:queueid}表达式,把一条message拆成client、method、request、bytes、duration、queueid这6个字段,并添加到Event中。
  • 4、其中%{POSTFIX_QUEUEID:queueid}为自定义表达式的调用,其他5个是grok内置的表达式调用,如果需要使用自定义表达式,则需要在grok插件配置patterns_dir属性,属性值数据类型为array,就是自定义表达式定义的文件所在的目录。
  • 5、在表达式中,特殊字符需要使用\来转义,比如-,"",[]这些特殊字符,所以我们上面实例中的message-id数据在用表达式匹配的时候是使用了message\-id去匹配了。
  • 常用参数(空 = 同上)

date时间处理插件

在讲date插件的使用前,我们需要先讲解一下Logstash的时间记录方式。在Logstash产生了一个Event对象的时候,会给该Event设置一个时间,字段为“@timestamp”,同时,我们的日志内容一般也会有时间,但是这两个时间是不一样的,因为日志内容的时间是该日志打印出来的时间,而“@timestamp”字段的时间是input插件接收到了一条数据并创建Event的时间,所有一般来说的话“@timestamp”的时间要比日志内容的时间晚一点,因为Logstash监控数据变化,数据输入,创建Event导致的时间延迟。这两个时间都可以使用,具体要根据自己的需求来定。

但是不管“@timestamp”字段的时间还是日志内容中的时间,其时间格式一般都不是我们想要的,所以我们就需要使用date插件,把时间格式转成我们想要的格式,比如:比如将Apr 17 09:32:01(MMM dd HH:mm:ss)转换为04-17 09:32:01 (MM-dd HH:mm:ss)。

  • 配置示例:
filter {
 date {
 match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
 } 
}
  • 示例解析
  • timestamp是自定义的Event字段,用于存放通过grok解析到的日志内容中的时间,dd/MMM/YYYY:HH:mm:ss Z是日志内容中的时间格式,比如:16/Sep/2018:00:42:38 +0800,匹配到了之后,date插件会默认把该时间转成本地格式的时间,并且覆盖掉Event为我们创建的@timestamp字段中的时间。
  • 常用参数(空 = 同上)

geoip插件

geoip插件是用于根据IP地址来确定该IP的归属地,默认的数据来源于Maxmind公司GeoLite2(https://dev.maxmind.com/geoip/geoip2/geolite2/)数据库,该数据库内嵌在geoip插件中,存储位置为:`logstash/vendor/bundle/jruby/x.x/gems/logstash-filter-geoip-x.x-java/vendor`目录中,数据库文件名分别为`GeoLite2-City.mmdb`和`GeoLite2-ASN.mmdb`。

从Maxmind的描述 ——“GeoLite2数据库是免费的IP地理位置数据库,可与MaxMind收费的GeoIP2数据库相媲美,但没有GeoIP2准确”。 有关更多详细信息,请参阅GeoIP Lite2许可证。

Maxmind的商业数据库GeoIP2(https://www.maxmind.com/en/geoip2-databases)也支持geoip插件。简单来说就是两个数据库一个免费的一个商业的,免费的不如商业的地理位置精准。

如果您需要使用内嵌的GeoLite2以外的数据库,则可以直接从Maxmind网站下载数据库,并使用数据库选项指定其位置(下面会讲到如果使用数据选项)。

  • 配置示例:
filter {
 if [remote_ip] !~ "^127\.|^192\.168\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[01]\.|^10\." {
 geoip {
 source => "remote_ip"
 database => "/usr/share/GeoIP/GeoLite2-Country.mmdb"
 }
 }
}
  • 示例解析
  • 由于geoip使用的ip数据库不能匹配私网地址,所以在使用geoip插件前,先判断一下ip地址是否为私网ip,如果不是,这使用geoip插件。source为指定一个ip地址,为其查询归属地等信息,remote_ip为Event中存储ip地址的自定义字段,database为IP地址数据库所在的位置,不指定的话,使用geoip插件内置的GeoLite2-City默认数据库。
  • 常用参数(空 = 同上)

常用输出插件

经过以上的学习,我们已经学习了Logstash三大主件中的其中两个了,分别是input和filter,那现在我们就来学习最后一个组件:output。

每个数据流经过input和filter后,最终要由output输出,以上的内容我们都是使用最简单的标准输出:stdout,把数据输出到显示器,但实际上stdout只是Logstash的其中一个输出插件而已,它的常用输出插件有:Elasticsearch,Redis,File,TCP等等,更多的输出插件大家可以看Logstash官网,接下来我们以Elasticsearch和Redis输出插件作为例子,来学习输出插件的使用,其他过滤插件使用起来大同小异,大家自行扩展。

elasticsearch输出插件

用于将Event信息写入到Elasticsearch中,官方推荐插件,ELK技术栈必备插件。

  • 配置示例
output {
 elasticsearch {
 hosts => ["127.0.0.1:9200"]
 index => "logstash-%{type}-%{+YYYY.MM.dd}"
 document_type => "%{type}"
 }
}
  • 常用参数(空 = 同上)

redis输出插件

用于将Event写入Redis中进行缓存,由于Redis数据库是先把数据存在内存的,所以效率会非常高,是一个常用的logstash输出插件

  • 配置示例
output {
 redis {
 host => ["127.0.0.1"]
 port => 6379
 data_type => "list"
 key => "logstash-list"
 }
}
  • 常用参数(空 = 同上)

后记

那到这里,我们已经介绍了Logstash配置文件的语法和常用插件的配置方式了,这些常用的插件都是使用频率非常高的,所有我们后面需要来做一个Logstash的实战案例,综合运用我们这章所学的内容。

作者:叩丁狼教育罗海鹏老师

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...