logstash系列~2.logstash部署


前言

​ 从上一章的内容中可以了解到logstash的工作原理 以及 logstash在大数据分析平台中所处的位置。logstash作为数据采集、数据分析等任务的处理核心组件,首先我们需要将其运行起来,并调试日志信息的接收和打印。

注意:默认当前环境已经安装好docker环境了~

gitee代码地址:https://gitee.com/vincent_whf/logstash/tree/master/1.logstatsh_study%E7%AE%80%E5%8D%95%E8%BF%90%E8%A1%8C

1. logstash镜像拉取

拉取指定7.8.1版本的logstash镜像

1
docker pull logstash:7.8.1

2. 输入与输出的简单配置

2.1 代码路径

├── logstatsh_study

​ ├── config

​ └── logstash.yml

​ ├── pipeline

​ └── in.conf

​ └── out.conf

├── syslog.py

├── udp.py

代码路径解释:

config文件夹下存放的是配置文件logstash.yml,配置与logstash相关的配置。

pipeline文件夹为管道文件,主要存放的是接收、输出、过滤日志信息的conf配置文件

syslog.py和dup.py文件,主要用于测试,实现推送日志信息

2.2 logstash.yml配置

​ 在logstash.yml文件中设置如何运行logstash,当然也可以在启动logstash的时候在命令行中指定,所有在命令行中指定的参数会覆盖此文件中的配置。

如下是我在logstash.yml中定义的内容:

1
2
3
http.host: "0.0.0.0"
path.logs: /var/log/logstash
config.reload.automatic: true

参数解释:

​ config.reload.automatic: true 表示:自动检测配置文件变动并自动重载。

​ path.logs 表示:设置日志存储的位置

​ http.host 表示:设置绑定的Ip地址

​ http.port 表示:设置绑定的端口

以下罗列了logstash.yml中其他的参数:

Setting Description(描述) Default value(默认值)
node.name 节点的描述性名称。 Machine’s hostname
path.data Logstash及其插件持久化的数据的目录 LOGSTASH_HOME/data
pipeline.id The ID of the pipeline. main
pipeline.workers 管道中filter和output阶段并行工作的worker的数量。 如果发现事件正在备份,或者CPU未饱和,请考虑增加此数量以更好地利用机器处理能力。 CPU核心数量
pipeline.batch.size 前面有提到,用来定义worker每次从inputs发送到中央队列中取出的batch的数量。更大的数量通常意味着更好的性能,但也会占用更多的内存,你可以在 jvm.options文件中增加JVM堆空间。更多信息参考: Logstash配置文件 125
pipeline.batch.delay 当创建管道数据batch都时候,worker等待inputs数据的时间,即使没有拿到batch.size定义的数据量。 50
pipeline.unsafe_shutdown 当此项设置为true的时候,在收到shutdown事件的时候Logstash会强制退出,即使仍有数据在内存中。默认情况下,Logstash会拒绝退出直到所有接收到的数据发送给outputs。启用此选项可能导致在关闭期间丢失数据。 false
path.config 指定主管道配置文件路径,如果路径是目录或者通配符,Logstash会根据字母顺序进行读取。
config.string 包含用于主管道配置的一个字符串。和配置文件语法相同。 None
config.test_and_exit 当此项设置为true的时候,会检查配置文件,在完成之后退出。注意此项设置不会检查Grok匹配的正确性。 Logstash 可以从目录中读取多个配置文件。如果此项配置结合 log.level: debug,Logstash会对组合的配置的每一个配置添加注释。(Logstash会将配置文件中的每一项以Debug的形式显示出来) false
config.reload.automatic 当此项设置为true的时候,程序会周期性的检查配置文件的变化,并在有变化的时候重新加载配置文件。可以通过给进程发送SIGHUP信号来重读配置文件。 false
config.reload.interval Logstash检查配置文件变动的频率。 3s
config.debug 设置为 true的时候,将完整的编译配置作为debug日志消息。同时必须设置 log.level: debug. WARNING: 日志信息会包含明文密码。可能会导致你的密码明文出现在你的日志中。原文:The log message will include any password options passed to plugin configs as plaintext, and may result in plaintext passwords appearing in your logs! false
config.support_escapes 设置为true之后,将处理一下转意: \n 转成换行符 (ASCII 10). \r 转成回车(ASCII 13). \t 转成tab (ASCII 9). \\ 转成”"本身 \. \" 变成双引号 \'变成引号 false
modules When configured, modules must be in the nested YAML structure described above this table. None
queue.type 用于事件缓冲的内部队列模型。 设置为 memory 使用基于内存的队列, 或设置为 persisted 使用基于磁盘的 ACKed 队列 (persistent queues). memory
path.queue 启用持久化队列时的数据存储目录。 (queue.type: persisted). path.data/queue
queue.page_capacity 启用持久化队列时可以使用的页面文件大小。 (queue.type: persisted). The queue data consists of append-only data files separated into pages. 64mb
queue.max_events 启用持久化之后队列中未读事件的最大数量。 (queue.type: persisted). 0 (unlimited)
queue.max_bytes 队列最大的容量,以字节为单位,确保你定义的位置的磁盘上有足够的空间。 如果queue.max_eventsqueue.max_bytes同时定义,先到达的会生效。也就是小的生效。 1024mb (1g)
queue.checkpoint.acks 持久化队列开启的情况下,强制检查点之前ACKed事件的最大数量。 (queue.type: persisted)。 设置为0表示不限制:queue.checkpoint.acks: 0 1024
queue.checkpoint.writes 持久化队列开启的情况下,强制检查点之前writes事件的最大数量。 (queue.type: persisted)。 设置为0表示不限制:queue.checkpoint.writes: 0 1024
queue.drain 开启之后,Logstash处理完成持久化队列之后才会关闭。 false
dead_letter_queue.enable 开启由插件提供的DLQ功能。 false
dead_letter_queue.max_bytes 每个dead letter队列的最大值。 超出的部分会被删除。 1024mb
path.dead_letter_queue 存储dead-letter队列的目录。 path.data/dead_letter_queue
http.host 设置绑定的IP地址 "127.0.0.1"
http.port 设置绑定的端口 9600
log.level 设置日志级别,有以下几种: fatal``error``warn``info``debug``trace info
log.format 设置日志格式。设置为json以JSON格式记录日志。或这只为 plain 使用 Object#.inspect记录日志。(应该是设置Logstash日志格式) plain
path.logs The directory where Logstash will write its log to. LOGSTASH_HOME/logs
path.plugins 指定Logstash搜索插件的目录,可以多次设置以设置多个查检目录。目录必须遵循以下结构: PATH/logstash/TYPE/NAME.rb其中TYPE is inputs, filters, outputs, 或 codecs, NAME就是插件的名字。

2.3 pipeline管道配置

​ 从Logstash6.0开始,引入了Multiple Pipeline,用户可以在./config/pipeline.yml中配置单管道 或 多管道,并指定管道配置文件在./pipeline/in.conf文件和./pipeline/out.conf文件。启动logstash后,如果安装了X-Pack插件,就可以在Kibana->Monitoring->Logstash 中看到相关的管道信息。

以下在pipeline文件夹下定义接收和输出日志的管道文件:

2.2.1 in.conf为定义接收日志的规则文件
1
2
3
4
5
6
7
input {
syslog {
port => 514
grok_pattern => "<%{POSINT:priority}>%{GREEDYDATA:message}"
tags => "linux"
}
}

说明:通过514端口接收系统日志。其中使用grok组件来解析传入的数据,并转化具有结构化的数据。grok的详细用法方法,请看logstash-grok组件的使用规则

2.2.2 out.conf为定义输出日志的规则文件
1
2
3
output {
stdout { codec => rubydebug }
}

说明:rubydebug其实就是codec的一种编码格式,方便我们测试和调试,美化output输出,也可以理解成对输出进行格式化。

3. logstash 启动

在in.conf管道文件中配置了接收端口为514的系统日志syslog,因此需要配置防火墙ACLs,参考地址:https://discuss.elastic.co/t/logstash-bind-to-port-514/44022/9

3.1 防火墙

syslog 端口日志转发命令,如下:

1
sudo firewall-cmd --permanent --zone=internal --add-port=514/udp #syslog port

3.2 Docker容器启动

docker容器启动的时候,需要注意以下几点:

1)需要映射logstash.yml文件路径,即本地的logstash.yml必须与容器的/usr/share/logstash/config/logstash.yml形成映射关系。

2)需要映射管道pipeline文件夹,即本地pipeline文件夹必须与容器的/usr/share/logstash/pipeline文件夹形成映射关系。

1
docker run -itd --network host -u root -p 514:514/udp -v 	/media/psf/Home/study_workspace/logstatsh_study/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v /media/psf/Home/study_workspace/logstatsh_study/pipeline/:/usr/share/logstash/pipeline/ --name=logstash  logstash:7.8.1

4. 调试

调试环境:由于启动logstash容器的时候采用host模式,因此可以在本地直接执行以下脚本,即可实现日志发送与logstash日志的接收

模拟向系统日志syslog 514端口发送日志消息,并在name为logstash的容器中查看接收并输出的日志信息。

syslog.py中的代码逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# coding:utf-8
import json
import logging.handlers

logger = logging.getLogger('syslogtest')
logger.setLevel(logging.INFO)
sh = logging.handlers.SysLogHandler(('127.0.0.1', 514), logging.handlers.SysLogHandler.LOG_AUTH)
logger.addHandler(sh)

siplist = ['212.92.30.69', '94.74.172.218', '120.133.136.75', '49.36.247.72', '222.180.208.14', '111.19.157.70',
'133.18.208.232', '118.89.230.32', '184.145.167.92', '128.199.229.253', '61.224.201.44', '138.122.111.213',
'37.238.120.4']
shashlist = ['00004e073dde06b8e0b462ac3c8bcc15']

data = 'May 25 11:11:56 localhost fwlog: 日志类型:WEB应用防护, 策略名称:waf1, 规则ID:0, 源IP:' + siplist[0] + \
', 源端口:7224, 目的IP:192.168.254.31, 目的端口:80, 攻击类型:跨站请求伪造, 严重级别:低, 系统动作:允许, ' \
'URL:flag-760768087.amarilisperu.com/gate.html?location=09952f492400cff5b1680b990e21fe18 '
logger.info(data)

通过portainer进行查看name为logstash的容器日志,可以发现执行python syslog.py命令后,容器的日志中正常打印了接收日志的内容,并通过grok进行了结构化的处理,如下图所示:


文章作者: 王海飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王海飞 !
  目录