centos7-Logstash的使用
1.下载
Logstash官方下载
2.安装
2.1 yum安装
logstash.repo[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安装
sudo yum install logstash
查看logstash安装位置

2.2 tar解压安装
下载安装包之后,解压即可3.配置
3.1 实例和管道
实例是指通过bin/logstash启用的一个服务 管道是指实例中处理数据的通道,包括三个部分收集器(input)、过滤器(filter)、转发器(output)。- 每一个运行的logstash实例至少有一个管道,数据的收集、过滤、转发都是在管道中进行的。
- 在一个实例中,每一个管道的收集器input有独立的一个线程进行处理,但是每个管道的过滤器filter、转发器output没有独立的线程,是所有管道共用的线程处理。
3.2 配置文件
配置是指logstash的配置文件,有两个配置文件logstash.yml和pipelines.yml,对应实例和管道的配置。- logstash.yml主要配置包括管道设置、主管道配置、api设置、模块设置、队列设置、死信队列设置、调试设置、插件设置、xpack设置等,是logstash运行实例的主要配置。
- pipelines.yml主要是每个logstash运行实例的多管道配置,默认管道是main,配置:
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
一个管道的配置文件,参考文章
- 如果指向的是一个具体的配置文件,则按该配置文件进行处理。
- 如果指向的是一个配置文件的目录,则会合并该目录下的所有文件,即形成一个大文件,如confd.d目录下有配置文件a.conf和b.conf
input {
file {
path => "/data/log/a.log"
}
}
filter {
date {
match => [ "message", "yyyy-MM-dd HH:mm:ss" ] locale => "Asia/Shanghai" timezone => "Europe/Paris" target => "messageDate"
}
}
output {
elasticsearch {
hosts => ["192.168.118.14"]
index => "a-log-%{+YYYY.MM.dd}"
}
}
b.conf
input {
file {
path => "/data/log/b.log"
}
}
filter {
extractnumbers {
source => "message" target => "message2"
}
}
output {
elasticsearch {
hosts => ["192.168.118.24"]
index => "a-log-%{+YYYY.MM.dd}"
}
}
那么合并后就是
input {
# a.conf input
file {
path => "/data/log/a.log"
}
# b.conf input
file {
path => "/data/log/b.log"
}
}
filter {
# a.conf filter
date {
match => [ "message", "yyyy-MM-dd HH:mm:ss" ]
locale => "Asia/Shanghai" timezone => "Europe/Paris" target => "messageDate"
}
# b.conf filter
extractnumbers {
source => "message"
target => "message2"
}
}
output {
# a.conf output
elasticsearch {
hosts => ["192.168.118.14"]
index => "a-log-%{+YYYY.MM.dd}"
}
# b.conf output
elasticsearch {
hosts => ["192.168.118.24"] index => "a-log-%{+YYYY.MM.dd}"
}
}
3.3 单实例单管道
单实例单管道,即启用一个实例,且实例只有一个管道。logstash安装后默认是单管道。 因为同一个实例中一个管道的配置文件目录如conf.d下的多个conf文件会被合并为一个配置文件,且实例的管道收集器线程分开,过滤器、转发器是线程共用,会导致过滤器、转发器多次执行,进而产生数据混乱。 这种情况下可以通过在收集器添加索引或者标签,在过滤器和转发器上通过条件判断进行区分,如下 a.confinput {
file {
path => "/data/log/a.log"
type => "a-log"
# tag => "a-log"
}
}
output {
# if "a-log" in [tags]
if [type] == "a-log" {
elasticsearch {
hosts => ["192.168.118.14"]
index => "a-log-%{+YYYY.MM.dd}"
}
}
}
b.conf
input {
file {
path => "/data/log/b.log"
type => "b-log"
# tag => "b-log"
}
}
output {
# if "b-log" in [tags]
if [type] == "b-log" {
elasticsearch {
hosts => ["192.168.118.24"]
index => "b-log-%{+YYYY.MM.dd}"
}
}
}
这种情况对于复杂业务来说,只会越来越臃肿,显然不适合。
而且一个实例的资源配置是相同的,但不同收集器对资源的要求(管道的要求)是不一样,因此资源设置太大会造成浪费,设置太少会造成不足。这时可以使用单实例多管道解决上述问题。
3.4 单实例多管道
对于单实例单管道问题,可以通过为单实例配置多管道进行解决问题。多管道的配置参考:- pipeline.id: main # 管道名
path.config: "/etc/logstash/conf.d/*.conf" # 管道配置文件位置,将合并*.conf文件
pipeline.workers: 3 # cpu核数
pipeline.batch.size: 125 # 输入源批量事件的数量
queue.type: persisted # 队列类型,persisted硬盘模式
queue.page_capacity: 50mb # 硬盘模式每页数据大小
- pipeline.id: my-other-pipeline # 管道名
path.config: "/etc/different/path/p2.cfg" # 管道配置文件
pipeline.batch.size: 2 # 输入源批量事件的数量
pipeline.batch.delay: 1 # 轮询下一次事件的等待时长
queue.type: memory # 队列类型,memory内存模式
管道配置文件pipelines.yml可以针对不同管道的参数进行配置,满足不同管道的资源要求。
同样需要注意的是管道配置文件指定为目录是配置文件合并的问题,需要通过条件判断合理解决。
3.5 多实例单管道
多实例单管道,即通过bin/logstash运行多个logstash实例。 注意:- 运行实例时logstash.yml配置文件中的path.data不同实例要配置不同的路径,不能共用一个数据存储的路径。
- 多实例相当于启用多个服务,占用更多的服务资源,所以非不得以情况下还是建议使用单实例多管道。
3.6 多实例多管道
多实例多管道,即启用多个实例,且每个实例都是多管道,参考前面。3.7 yum安装下配置
yum安装的logstash是以服务的形式运行,所以可以理解为logstash启动时是启动了一个logstash实例,当然也可以通过手动启动实例。 因此该模式适用也推荐使用单例单管道和单例多管道的配置。3.8 tar安装配置
tar安装的logstash是通过手动bin/logstash进行启动,可以启动多个实例,所以可以灵活使用单例单管道、单例多管道、多实例单管道、多实例多管道,综合考虑资源的情况去选择。4. nginx日志收集
现在采用单例单管道模式,以收集nginx日志为例,实操logstash服务。4.1 配置文件
logstash安装后main管道的默认配置文件是在/etc/logstash/conf.d/*.conf,因此我们拷贝/etc/logstash/logstash-sample.conf到/etc/logstash/conf.d/logstash-sample.conf,并改名为logstash-local-nginx-log.conf,并编辑,最终内容input {
# 从文件读取日志信息
file {
path => "/var/log/nginx/access.log"
type => "nginx-access-log"
# 从日志的第一行开始进行分析
# start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:time}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code} %{NUMBER:bytes} \"(?\S+)\" %{QS:agent} \"(?\S+)\"\"(?\S+)\""
}
}
geoip {
source => "clientip"
}
}
output {
# 输出es
elasticsearch {
hosts => ["192.168.181.100:9200"]
index => "nginx-access-log-%{+YYYY.MM.dd}"
}
}
4.2 启用服务
# 查看服务状态
systemctl status kibana
# 启动服务
systemctl start kibana
# 停止服务
systemctl stop kibana
# 重启服务
systemctl restart kibana
4.3 验证结果
打开elasticsearch_head,可以看到对应的索引,如下图


