Logstash部署文档
一、环境准备
-
服务器配置: 4C 8G 80G
-
服务器系统版本: CentOS 8.3
-
Logstash版本:8.1.0
-
Logstash下载途径: 官网
-
服务器调整
# 内核参数需要调整,将虚拟内存区域改大
echo vm.max_map_count=655360 >> /etc/sysctl.conf
sysctl -p
#调整文件打开数限制,临时设置
ulimit -n 65535
#永久设置(加入文件末尾)
cat > /etc/security/limits.conf <<EOF
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
EOF
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 设置selinux
setenforce 0
# 添加ES服务器名解析(根据你的实际情况填写)
cat > /etc/hosts << EOF
192.168.1.1 es-node-01
192.168.1.2 es-node-02
192.168.1.3 es-node-03
EOF
二、部署方式
# 到部署目录解压,以下操作默认三台服务器均需执行,特殊操作会有标注
tar -zxvf logstash-8.1.0-linux-x86_64.tar.gz
# 移动到你的部署目录
mv logstash-8.1.0 /部署目录
#进入解压后的logstash目录
cd /部署目录/logstash-8.1.0
# 创建证书目录
mkdir config/certs
1、调整配置
# 拷贝在部署ES时获取的clent证书,放到config配置目录解压
tar -zxvf certs.tar.gz
# 进入config配置目录
cd config
# 修改配置文件
vi logstash.conf
```以下为配置文件
input # 输入配置
{
kafka # 输入源为kafka
{
# kafka地址配置
bootstrap_servers => ["你部署的kafka的ip:端口"]
# topic配置
topics => ["你的topic"]
# 客户端id配置
client_id => "你自己写的客户端id"
# 用来多个logstash消费同一个topic使用
group_id => "你自己写的组id"
# 是否记录元数据
decorate_events => true
# 为日志额外添加字段信息
add_field => {log_source_produce => "你的topic,或者别的,用来判断如何切割"}
# Kafka中没有初始偏移量或偏移量超出范围时,
# earliest:将偏移量自动重置为最早的偏移量
# latest:自动将偏移量重置为最新偏移量
# none:如果未找到消费者组的先前偏移量,则向消费者抛出异常
auto_offset_reset => "earliest"
# 超时时间
poll_timeout_ms => 10000
# 会话超时时间
session_timeout_ms => "30000"
# 多线程消费
consumer_threads => 2
}
# 可添加多个topic消费
kafka
{
# 配置参考上面
}
}
filter #过滤配置
{
ruby { # 采用ruby脚本切割
# ruby脚本文件路径
path => ["/部署目录/config/ruby/脚本文件名"]
}
mutate { # 过滤后处理
# 移除不需要的字段
remove_field => ["event","message"]
# 替换部分字段
gsub => ["map_context","[\\]",""]
# 切割部分字段
split => ["logtime"," "]
}
}
output # 输出配置
{
elasticsearch # 输出源为es
{
# es服务器主机配置
hosts => ["https://192.168.1.1:9200","https://192.168.1.2:9200","https://192.168.1.3:9200"]
# 索引格式
index => "%{[log_source_produce]}_%{[logtime][0]}"
# 连接用户
user => "elastic"
# 用户密码
password => "你的密码"
# ssl证书验证
ssl_certificate_verification => false
# ssl证书地址
cacert => "/部署目录/config/certs/client-ca.cer"
}
# 可以先输出到文件中来测试你的logstash切割是否正确无误
#file {
# path => ["文件输出路径"]
# }
}
2、ruby切割脚本
# 固定格式,定义过滤函数,event就是日志本身
def filter(event)
# 引入json模块
require 'json'
# 逻辑开始
begin
# logstash中自己设置的字段
log_source_produce=event.get("你设置的字段")
# 判断是否自己添加的字段值
if log_source_produce == "你设置的字段值"
# 获取日志中的message字段,并用json模块转换为json格式
tmp=JSON.parse(event.get("message"))
# 从json中切割获取你需要的字段
path=tmp["log"]["file"]["path"]
host=tmp["host"]["name"]
# 将切割出来的字段填到event中
event.set('path',path)
event.set('host',host)
elsif log_source_produce == "你设置的另一个字段"
# 用你需要的方式切割
end
# 异常捕获,会打到logstash自己的日志中
rescue Exception => e
puts "-----------------myerror----------------"
puts e.message
puts e.backtrace.inspect
puts event.get("message")
puts "----------------------------------------"
end
# 返回处理后的日志
return [event]
end
三、服务启动
# 编写启动脚本
```vi start.sh
#!/bin/sh
cd /部署目录/logstash-8.1.0
nohup ./bin/logstash --api.http.port=9610 -f config/logstash.conf > /部署目录/logs/logstash_8.1.log 2>&1 &
tail -f /部署目录/logs/logstash_8.1.log
# 启动服务并查看生成的日志是否有报错
chmod +x start.sh
sh start.sh
四、kafka部署
# 安装java
yum -y install java
# 创建数据目录
mkdir -p /部署目录/data/zookeeper
mkdir -p /部署目录/data/kafka
# 进入kafka目录
# 修改zookeeper配置文件
```vim ./config/zookeeper.properties
dataDir=/部署目录/data/zookeeper
clientPort=2181
maxClientCnxns=0
# 修改kafka配置文件
```vim ./config/server.properties
broker.id=0
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://你的主机名:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/部署目录/data/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
auto.create.topics.enable=true
# 启动脚本
```vi start.sh
#!/bin/sh
cd /部署目录/kafka_2.11-2.0.0
sh ./bin/zookeeper-server-start.sh -daemon ./config/zookeeper.properties
sleep 15
zk=`netstat -ntlp | grep :::2181 | wc -l`
if [ ${zk} -ne 0 ];then
sh ./bin/kafka-server-start.sh -daemon ./config/server.properties
else
echo "zookeeper not start,please check and try again"
fi
# 启动服务
chmod +x start.sh
sh start.sh
# 生产测试
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
# 消费测试
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
# kafka自带压测命令
bin/kafka-producer-perf-test.sh --topic test --num-records 100 --record-size 1 --throughput 100 --producer-props bootstrap.servers=localhost:9092