【Logstash8.1.0&kafka单机部署】

Logstash部署文档

一、环境准备

  1. 服务器配置: 4C 8G 80G

  2. 服务器系统版本: CentOS 8.3

  3. Logstash版本:8.1.0

  4. Logstash下载途径: 官网

  5. 服务器调整

# 内核参数需要调整,将虚拟内存区域改大
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

你可能感兴趣的:(elk)