Elastic日志系统-filebeat-redis-logstash-elasticsearch-kibana-6.8.0搭建流程

mac2025-10-22  9

Elastic日志系统-filebeat-redis-logstash-elasticsearch-kibana-6.8.0搭建流程

搭建步骤1. 需要准备的环境系统环境1.1 软件版本1.2 软件安装1.3 需求说明 2. elasticsearch简单配置2.1 elasticsearch配置2.2 es-head配置 3. kibana简单配置4. elasticsearch配置用户认证,权限管理(X-pack)5. filebeat配置6. logstash配置7. 开始测试es的定期删除策略

搭建步骤

1. 需要准备的环境

系统环境

主机软件192.168.100.104elasticsearch, es-head, redis, logstash192.168.100.105filebeat, elasticsearch192.168.100.106elasticsearch, kibana, filebeat

系统版本:CentOS Linux release 7.7.1908 (Core)

1.1 软件版本

elastic系列为6.8.0版本,使用rpm包安装,简单,方便管理。

1.2 软件安装

elastic系列软件下载地址:https://www.elastic.co/cn/downloads/past-releases 这个地址可以下载各个版本的elastic系列软件包。

点击下载 elasticsearch下载 kibana下载 logstash下载 filebeat下载

将上面的rpm包下载好,上传到指定主机,用yum命令安装即可。

1.3 需求说明

所有日志收集后,通过index进行区分;不同的服务,输出到不同的index中;相同的服务,不在一个主机,也输入到一个index进行管理。index按照时间滚动,只保留指定天数(比如7天)的index,防止不断积累。

2. elasticsearch简单配置

2.1 elasticsearch配置

es简单配置如下

cluster.name: my-application # 集群名称,3个节点的都要一样 node.name: node-104 # 节点名 path.data: /var/lib/elasticsearch # 数据存储路径 path.logs: /var/log/elasticsearch # 日志输出路径 network.host: 192.168.100.104 # 主机IP http.port: 9200 # 开放的端口 # 3节点 discovery.zen.ping.unicast.hosts: ["192.168.100.104:9300", "192.168.100.105:9300","192.168.100.106:9300"]

9200端口是http协议端口,主要用于外部通信 9300端口是tcp协议端口,主要用于集群间传递信息 在每台主机上修改好配置。启动es

systemctl start elasticsearch systemctl status elasticsearch

启动成功后,可以通过api接口命令查看集群状态

curl http://192.168.100.104:9200 curl http://192.168.100.104:9200/_cat/nodes curl http://192.168.100.104:9200/_cat/master

可以看到3节点都已经加到了集群中,且104被选为master。

2.2 es-head配置

需要配置nodejs环境。nodejs可以用yum安装,或者用源码安装。

yum install epel-release git -y yum install nodejs npm -y

下载源码

cd /usr/local git clone https://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install npm install grunt --save

安装

npm install -g grunt-cli #安装grunt命令行工具grunt-cli npm install grunt --save-dev #安装grunt及其插件 grunt -version #查看安装版本情况

修改elasticsearch配置文件,增加如下字段

http.cors.enabled: true http.cors.allow-origin: "*"

修改es配置可以只在es-head需要连接的那台主机上进行。 修改elasticsearch-head目录下的Gruntfile.js文件

#其中增加一段配置 hostname: '0.0.0.0' 或者是 hostname: '*'

如果有端口冲突的情况,也可以修改下面的监听端口。 启动es-head

cd /usr/local/elasticsearch-head/ # 注意,一定要进入代码目录下启动,否则启动不了 nohup grunt server > ./grunt.log 2>&1 & netstat -tnulp|grep 9100 # 如果没有端口冲突的情况,启动不会有什么异常

如果是长期使用es-head,可以考虑把它配置为系统服务。 可以参考https://blog.csdn.net/wind_2307154495/article/details/79402911 启动成功后就可以连接使用了。

3. kibana简单配置

配置文件:/etc/kibana/kibana.yml

server.port: 5601 server.host: "192.168.100.106" server.name: "elk-106" elasticsearch.hosts: ["http://192.168.100.106:9200"] # es地址 kibana.index: ".kibana" logging.dest: /var/log/kibana.log # 日志输出路径 i18n.locale: "zh-CN" # 中文配置

注意:

kibana如果不配置日志输出,一般日志会输出到/var/log/message里面,导致系统日志文件越来越大,且信息太多,难以区分,所以最好配置单独的日志输出路径。如果要配置日志输出路径,特别要注意权限文件,执行以下命令 touch /var/log/kibana.log chown kibana.kibana /var/log/kibana.log # 或者直接改权限 chmod 666 /var/log/kibana.log

登录:http://192.168.100.106:5601 可以添加样例数据。打开之后如下显示: es索引管理

4. elasticsearch配置用户认证,权限管理(X-pack)

生产中,需要对es进行管理,首先要有权限管理配置,否则任何人,只要能访问到es主机,知道端口,都可以对他进行管理操作,这是非常危险的。 如果是生产中,需要添加es认证,需要停服务,这个操作,需要提前跟开发沟通好,最好选择业务低峰期。这样对用户的影响就非常小。

生成秘钥,在主节点执行以下操作 /usr/share/elasticsearch/bin/elasticsearch-certutil ca /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 mkdir /etc/elasticsearch/cert/ mv elastic-* /etc/elasticsearch/cert/ chmod 600 /etc/elasticsearch/cert/* chown -R elasticsearch.elasticsearch /etc/elasticsearch/cert/elastic-* # 更改权限

生成的配置文件elastic-certificates.p12需要copy到所有节点上/etc/elasticsearch/cert/目录下,注意保存秘钥密码 2. 秘钥密码认证,在所有节点执行 这一步一定不能少,否则es会启动报错,启动失败

/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password /usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 所有节点增加如下配置

vim /etc/elasticsearch/elasticsearch.yml

# ---------------------------------- X-pack ------------------------------------ xpack.license.self_generated.type: basic # xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: cert/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: cert/elastic-certificates.p12 # #-------ellasticsearch-head------------- http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type 重启服务 sudo systemctl start elasticsearch.service sudo systemctl status elasticsearch.service

要确保各节点服务启动正常,上面的命令执行缺一不可,如果启动异常可以通过日志检查错误。 5. 重启之后,生成账号密码(在其中一台上执行)

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

执行后会生成一些默认账号的密码: 6. 配置kibana,配置账号密码 增加如下配置段 配置完成后,重启,重新刷新kibana页面

sudo systemctl restart kibana.service

输入你的账号密码既可以了。 常用的账号已经配置到了es中 账号配置流程:新建角色–>配置角色权限(集群权限,索引权限,可以使用正则匹配)–>配置用户(绑定角色) 配置角色权限也可以直接用已经配置好的角色,以权限角色运行。 角色权限参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/security-privileges.html#privileges-list-cluster

为了方便开发人员查看日志,我们新建一个只读账号 索引权限,可以使用正则匹配。只给只读权限。 如果是项目使用,在配置单独索引的读写权限。 单个用户,是可以选择多个角色的。 使用新建用户的账号密码登录。可以看到,用户看不到es的index界面,也不能修改kibana已经创建的索引。

下面是日志传送流程:

5. filebeat配置

/etc/filebeat/filebeat.yml

filebeat.inputs: # 这一段是默认配置 - type: log enabled: false # 是否启用,默认不启用 paths: - /var/log/*.log # 下面是我们自定义的配置 - type: log enable: true # 启用配置,收集日志 paths: - /tmp/002.txt # 日志路径,可以定义多个,可以使用正则 tail_files: true # Filebeat从文件尾开始监控文件新增内容,非从头开始 document_type: "test-redis" #设定Elasticsearch输出时的document的type字段 可以用来给日志进行分类。Default: log fields_under_root: true fields: # 下面是自定义字段,可以用来区分日志类型,日志信息 log_type: "test-redis" service: "test-redis" - type: log enable: true paths: - /tmp/003.txt # 这个是测试路径,方便我们调试 tail_files: true document_type: "testlog" exclude_files: ['.gz$'] tags: "testlog" fields_under_root: true fields: log_type: "testlog" service: "testlog" # java日志收集 - type: log enable: true paths: - /tmp/logs/catalina* exclude_files: ['.gz$'] exclude_lines: ['^$'] tags: "java" # 定义多行的情况 multiline: # 这个匹配,根据日志情况自定义 pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})' negate: true match: after max_lines: 1000 timeout: 60 fields_under_root: true fields: log_type: "java" service: "cms" # 下面是输出配置 # 具体配置参考官网:https://www.elastic.co/guide/en/beats/filebeat/current/redis-output.html # 输出中间,如果数据量不大的情况下,redis是很好的选择,数据量很大,建议使用kafka集群 output.redis: hosts: ["192.168.100.104:6379"] password: "changeme" # redis一定要加上认证 key: "filebeat" # 日志发布到的Redis列表或渠道的名称 db: 0 timeout: 5 #连接超时时间

如何对filebeat搜集的日志进行区分,然后保存到不同的index里面呢? 通过自定义字段

redis简单配置 主要是下面两个配置。

bind 192.168.100.104 requirepass changme

配置完成后,可以启动服务了。

systemctl restart filebeat systemctl restart redis

注意观察日志啊。

6. logstash配置

日志通过filebeat到了redis,然后logstash从redis中取数据,输出到es中,在这一部,我们要通过自定义的字段,把日志输出到不同的index中。 配置如下: vim /etc/logstash/conf.d/redis.conf

注意:logstash配置文件路径是/etc/logstash/conf.d/

# 从redis中拿数据 input { redis { data_type => "list" key => "filebeat" host => "192.168.100.104" port => "6379" password => "changme" } } # 输出到es中 output { # 通过自定义字段fields.service判断日志是属于哪个服务的,相同的服务输出到一个index中 if [service] { elasticsearch { hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"] user => "elastic" password => "changme" index => "logstash-%{service}-%{+YYYY.MM.dd}" http_compression => true } } # 如果没有source字段匹配,就输出到另一个公共的index中 else { elasticsearch { hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"] user => "elastic" password => "changme" index => "logstash-other-%{+YYYY.MM.dd}" http_compression => true } } }

配置之后,可以先对配置文件进行测试,确认配置没有问题

/usr/share/logstash/bin/logstash -t /etc/logstash/conf.d/redis.conf --debug

配置文件检查没有问题,重启logstash服务

sudo systemctl restart logstash

7. 开始测试

现在所有服务都已经配置完了。我们开始测试。 刚才在filebeat中定义了3个日志输入路径:

/tmp/002.txt 对应service:test-redis /tmp/003.txt 对应service:testlog /tmp/logs/catalina* 对应service:cms 写入日志到这些测试文件中。可以看到已经有index了 然后创建kibana的索引,方便进行查看 创建完索引之后,就可以在Discover里面看到了 其它几个kibana索引的创建方式。参考上面的即可。

至此,所有流程就全部打通了。 后面需要做的工作:

nginx接入进来,展示nginx信息,站点访问情况,状态码等等es的index要按照日期,定时删除

es的定期删除策略

可以参考如下脚本:

# 保留15天内日志索引 date=$(date -d "-15 days" "+%Y.%m.%d") # 获取要删除的索引 delete_index=$(curl -s -u elastic:l7oTPEalirnWNBZHnuWt http://192.168.100.104:9200/_cat/indices|grep test|grep ${date} |awk '{print $3}') # for index in ${delete_index} do #echo $index curl -XDELETE -u elastic:changme http://192.168.100.104:9200/$index done

使用es的定期删除策略

配置生命周期管理:3天后删除配置索引模板,引用策略 在kibana的开发工具中操作 PUT _template/logs_template { "index_patterns": ["logs-*"], # 匹配所有以logs开头的索引 "settings": { "number_of_shards": 1, "number_of_replicas": 1, "index.lifecycle.name": "delete-3day", "index.lifecycle.rollover_alias": "logs" } }

参考: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/_applying_a_policy_to_our_index.html 注意:只有新索引会自动绑定策略,原来的不会变化,还是需要手动绑定

最新回复(0)