Logstash的安装以及使用

Logstash简介

Logstash是一款基于插件的数据收集和处理引擎。Logstash配有大量的插件,一边人们能够轻松进行配置以在多种不同的架构中收集,处理并转发数据。处理过程可分为一个或多个管道,在每个管道中,会有一个或多个输入插件接收或收集数据,然后这些数据会加入内部队列。默认情况下,这些数据很少并且会存储在内存中,但是为了提高可靠性和弹性,也可进行配置以扩大规模并长期存储在磁盘上。
在这里插入图片描述
处理线程会以小批量的形式从队列中读取数据,并通过任何配置的过滤插件按顺序进行处理。Logstash自带大量的插件,能够满足特定数据类型的操作,也就是解析、处理并丰富数据的过程。
处理完数据之后,处理线程会将数据发送到对应的输出插件,这些输出插件负责对数据进行格式化并进一步发送数据。

安装Logstash

Logstash管道有两个必须的元素,输入和输出,以及一个可选元素过滤器。输入插件从数据源那里消费数据,过滤器插件根据你的期望修改数据,输出插件将数据写入目的地。

  1. Logstash的下载地址:下载链接
  2. 下载安装包解压到/usr/local/logstash下
tar -zxvf logstash-6.5.4.tar.gz -C /usr/local/logstash
  1. 配置环境变量,vi /etc/profile
export LOGSTASH_HOME=/opt/logstash/logstash-6.5.4
export PATH=$PATH:$LOGSTASH_HOME/bin
  1. 查看是否安装成功
logstash -V

在这里插入图片描述
5. 运行第一个测试程序

logstash -e'input {stdin {}} output {stdout {}}'

解释一下这条命令的含义:

  • -e代表执行的意思
  • input即输入的意思,input里面即是输入的方式,这里选择了stdin,就是标准输入(从终端输入)
  • output即是输出的意思,output里面是输出的方式,这里选择了stdout,就是标准输出(输出到终端)
    启动后在命令行输入Hello World!回车,在控制台会显示,Ctrl+C停止。
    在这里插入图片描述
    但是在生产环境中,Logstash的管道要复杂得多,可能需要配置多个输入、过滤器和输出插件。因此需要一个配置文件管理输入、过滤器和输出。配置文件内容格式如下:
#输入
input{
   ...
}
#过滤器
filter{
   ...
}
#输出
output{
   ...
}

根据自己的需求在对应的位置配置输入插件、过滤器插件和输出插件以及编码插件即可。

插件用法

logstash有很多自己的filter过滤插件,专门用来对日志进行切割、过滤,最终保留日志中自己需要的部分,删除日志中多余的部分,将过滤出来的日志写入到easticsearch中。

输入插件

输入插件允许一个特定的事件源可以读取到Logstash管道中,配置在input{}中,且可以设置多个。

  • file:读取一个文件,这个读取功能有点类似于linux下面的tail 命令,一行一行地实时读取
  • syslog:监听系统514端口地syslog messages,并使用RFC3164格式进行解析。
  • redis:Logstash可以从redis服务器读取数据,此时redis类似于一个消息缓存组件。
  • kafka:Logstash也可以从kafka集群中读取数据,kafka加Logstash地架构一般用在数据量较大地业务场景,kafka可用作数据地缓冲和存储。
  • filebeat:filebeat是一个文本日志收集器,性能稳定,并且占用系统资源很少,Logstash可以接收filebeat发送过来的数据。
  1. stdin输入
    stdin输入就是把输入的内容直接输出到控制台,不做存储。
  2. 文件内容输入
    logstash使用一个名为filewatch的ruby gem库来监听文件变化,并通过一个叫sincedb的数据库文件来记录被监听的日志文件的读取进度(时间戳),这个sincedb数据文件的默认路径在logstash/data/plugin/inputs/file下面。
    配置示例:
input {
	file {
		path => "/usr/local/test.log"
		tags => "123"
		type => "syslog"
	}
}
filter {
}
output {
	stdout {
		codec => rubydebug
	}
}
  • path里面支持日志路径的通配符
  • 这个配置是监听并接收本机log文件里面的内容。默认情况下,logstash会从文件的结束位置开始读取数据,也就是说logstash进程会以类似tail -f命令的方式逐行获取数据。type用来标记事件类型,通常会在输入区域通过type标记事件类型。
    将上面的内容保存到logstash目录下面的config文件夹下面,然后通过命令启动:
./bin/logstash -r -f ./config/logstash-sample.conf

接下来,给/usr/local/test.log里面写入内容,查看logstash控制台。
在这里插入图片描述
3. 读取TCP网络数据
使用了logstash的TCP/UDP插件读取网络数据,其中5514端口是Logstash的TCP监听端口。
配置文件如下:

input {
  tcp {
    port => "5514"
  }
}
filter {
}
output {
    stdout{
        codec=>rubydebug
    }
}

编码插件

其实我们已经用过编码插件codec了,也就是这个rubydebug,它就是一种codec,虽然它一般只会用在stdout插件中,作为配置测试胡总和调试的工具。
编码插件(Codec)可以在logstash输入或输出时处理不同类型的数据。因此Logstash不只是一个input—>filter—>output的数据流。而是一个input–>decode—>filter—>encode—>output的数据流。
Codec支持的常见的编码格式有plain、json、json_lines等。
Codec插件之plain
plain是一个空的解析器,它可以让用户指定格式,也就是说输入是什么格式,输出就是什么格式。下面是一个包含plain编码的事件配置文件。

input{
    stdin{
	}
}
output{
    stdout{
        codec => "plain"
	}
}

Codec插件之json、json_lines
如果发送给logstash的数据内容为json格式,可以在input字段加入codec=>json字段来解析,这样可以根据具体内容生成字段,方便分析和存储。如果想让logstash输出为json格式,可以在output字段加入codec=>json,下面是一个包含json编码的事件配置文件:

input {
    stdin {
        }
    }
output {
    stdout {
        codec => json
        }
}

这就是json格式的输出,可以看出,json每个字段都是key:value格式,多个字段之间通过都好分隔。有时候,如果json文件比较长,需要换行的话,那么就要用json_lines编码格式。

Logstash过滤器插件

filter插件主要用于数据的过滤、解析和格式化,也就是将非结构化的数据解析成结构化的,可查询的标准化数据。常见的filter插件有如下几个:

  • grok:grok是Logstash最重要的插件,可解析并结构话任意数据,支持正则表达式,并提供了很多内置的规则和模板可供使用。此插件使用最多,但也最复杂。
  • mutate:此插件提供了丰富的基础数据类型数据处理能力。包括类型转换、字符串处理和字段处理等。
  • date:此插件可以用来转换你的日志记录中的时间字符串。
  • GeoIP:此插件可以根据IP地址提供对应的地域信息,包括国别、省市、经纬度等,对于可视化地图和区域统计非常有用。
  1. filter基本配置
input {
	stdin {
	}
}
filter {
	json {
		source => "message"
		target => "content"
	}
}
output {
	stdout {
		codec => rubydebug
	}
}

filter插件中的source表示对message部门进行解析,target表示目标字段,可以将message里面的内容解析出来后放到content中。
将上面的内容保存到配置文件中,然后运行

./bin/logstash -r -f ./config/logstash-sample.conf

在控制台输入一个json,示例

{
   "ip":”localhost“,
   "method": "POST",
   "url":"/user/response"
}

可以看到json的内容被解析到了content里面,而message里面是原始的接送字符串内容。
2. Grok正则捕获
grok是一个十分强大的logstash filter插件,它可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。它是目前logstash中解析非结构化日志数据最好的方式。
grok的语法规则是:%{语法:语义},”语法“指的是匹配的模式,例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样的IP地址。
例如输入的内容为:

172.16.213.132 [07/Feb/2018:16:24:19 +0800] "GET / HTTP/1.1" 403 5039

那么
%{IP:clientip}匹配模式将获得的结果为clientip:172.16.213.132
%{HTTPDATE:timestamp} 匹配模式将获得的结果为:timestamp: 07/Feb/2018:16:24:19 +0800
%{QS:referrer} 匹配模式将获得的结果为:referrer: "GET / HTTP/1.1"
下面是一个组合匹配模式,它可以获取上面输入的所有内容。

%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}	

通过上面这个组合匹配模式,我们将输入的内容分成了五个部分(即五个字段),将输入内容分割为不同的数据字段,这对于日后解析和查询日志非常有用,这正是使用grok的目的。
logstash默认提供了近200个匹配模式(其实就是定义好的正则表达式)让我么来使用,可以在logstash安装目录下vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns 目录里面查看。
下面是一个配置文件示例:

// Grok.conf

input{
    stdin{}
}
filter{
    grok{
        match => ["message","%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}"]
    }
}
output{
    stdout{
        codec => "rubydebug"
    }
}

将该配置文件命名为Grok.conf保存在config目录下面,并在终端执行命令

./bin/logstash -r -f ./config/Grok.conf

即可获得以下图片显示的结果。
在这里插入图片描述
3. 时间处理(Date)
date插件是对于排序事件和回填数据尤为重要,它可以用来转换日志中的时间字段,变成logstash:Timestamp对象,然后转存到@timestamp字段下面。下面是date字段的一个配置示例。

filter {
    grok {
        match => ["message", "%{HTTPDATE:timestamp}"]
    }
    date {
        match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
    }
}
  1. 数据修改(Mutate)
    (1)正则表达式替换匹配字段
    gsub可以通过正则表达式替换字段中匹配到的值,只对字符串字段有效,下面是一个关于mutate插件中gsub的示例
//这个示例表示将filed_name_1字段中所有"/"字符替换为"_"。
filter {
    mutate {
        gsub => ["filed_name_1", "/" , "_"]
    }
}
  1. GeoIP地址查询归类
    GeoIP是最常见的免费IP地址归类查询。GeoIP库可以根据IP地址提供对应的地域信息,包括国别、省市、经纬度等,此插件对于可视化地图和区域统计非常有用。下面是一个关于GeoIP插件的简单示例。
filter {
    geoip {
        source => "ip_field" //ip_field字段是输出IP地址的一个字段。
    }
}

Logstash的输出插件

output插件用于数据的输出,一个Logstash事件可以穿过多个output,直到所有的output处理完毕,这个事件才算结束,常用的输出插件如下:

  • file:表示将日志数据写入磁盘上的文件
  • elasticsearch:表示将日志数据发送给elasticsearch。Elasticsearch可以高效方便和易于查询的保存数据。
  • redis:发送数据到redis中,从这里可以看出,redis插件既可以用在input插件中,也可以用在output插件中。
  • kafka:发送数据到kafka中,与redis插件类似,此插件也可以用在logstash的输入和输出插件中。
  • graphite:表示将日志数据发送给graphite。graphite是一种流行的开源工具,用于存储和绘制数据指标。此外,Logstash还支持输出到nagios、hdfs、email、Exec。
  1. 输出到标准输出(stdout)
    stdout是最简单和最基础的输出插件,主要的功能和用途就是用于调试。
  2. 保存为文件(file)
    file插件可以将输出保存到一个文件中,比如下面的这个配置中,使用了变量匹配,用于自动匹配事件和主机名,在实际应用中很有帮助。
output {
    file {
        path => "/data/log3/%{+yyyy-MM-dd}/%{host}_%{+HH}.log"
    }
}
  1. 输出到elasticsearch
    Logstash将过滤、分析好的数据输出到elasticsearch进行存储和查询,是最经常使用的办法,下面是一个配置示例:
output {
    elasticsearch {
        host => ["172.16.213.37:9200","172.16.213.77:9200","172.16.213.78:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
        manage_template => false
        template_name => "template-web_access_log"
    }
}

host:是一个数组类型的值,后面跟的值是elasticsearch节点的地址与端口,默认端口是9200,可添加多个地址。
index:写入elasticsearch的索引名称,这里可以使用变量。Logstash提供了%{+YYYY.MM.dd}这种写法。在语法解析的时候,看到以+号开头的,就会自动认为后面是时间格式,尝试用时间格式来解析后续字符串。这种以天为单位分割的写法,可以很容易的删除老的数据或者搜索指定时间的范内的数据。此外,注意索引名中不能有大写字母。
manage_template:用来设置是否开启logstash自动管理模板功能,如果设置喂false将关闭自动管理模板功能。如果我们自定义了模板,那么应该设置为true。
template_name:这个配置用来设置在Elasticsearch中模板的名称。
下面是一个输出到elasticsearch的配置示例:

input {
    file {
        path => ["/var/log/syslog"]
        type => "system"
        tags => ["syslog","test"]
        start_position => "beginning"
    }
    file {
        path => ["/var/log/auth.log"]
        type => "system"
        tags => ["auth","test"]
        start_position => "beginning"
    }
}
filter {
}
output {
    if [type] == "system" {
        if [tags][0] == "syslog" {
            elasticsearch {
                hosts  => ["http://192.168.0.211:9200","http://192.168.0.212:9200","http://192.168.0.213:9200"]
                index  => "logstash-system-syslog-%{+YYYY.MM.dd}"
            }
            stdout { codec=> rubydebug }
        }
        else if [tags][0] == "auth" {
            elasticsearch {
                hosts  => ["http://192.168.0.211:9200","http://192.168.0.212:9200","http://192.168.0.213:9200"]
                index  => "logstash-system-auth-%{+YYYY.MM.dd}"
            }
            stdout { codec=> rubydebug }
        }
    }
}

以上配置的hosts部分使用了集群配置,如果是单个ES服务,直接使用单个IP和端口即可,例如:

hosts => [“http://127.0.0.1:9200”]
start_position => “beginning” 

表示从文件头部开始收集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值