日志分析系统的搭建与使用
日志分析系统一般有ELK
和EFK
两种,区别在于使用日志搜集的组件不同L
—logstash
,F
—FileBeat
,剩下的两种分别是_E
—Elasticsearch
和K
—Kibana
。
过程中所有不懂的地方,请及时查看Elasticsearch官方文档,这个文档目前是业内好评做多的文档,很全!很全!很全!
版本介绍: ElasticSearch
、Kibana
、FileBeat
均使用7.12.0
版本。
各种组件的搭建
Elasticsearch
的搭建过程
Docker
方式安装搭建(可以连接外网并有访问权限)
1、104服务器拉取ElasticSearch
镜像
注意:直接从docker hub
搜索到的镜像版本可能比较低,这里以官方文档中给出的镜像为准:
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
尝试执行,发现找不到资源,不清楚什么鬼,若无法拉取,可以改成这样(后面的一些操作照葫芦画瓢):
docker pull elasticsearch:7.10.1
2、创建并启动elasticsearch
因为是本地开发用,所以部署为单机模式,若以集群模式部署可以参考这里
discovery.type=single-node
表示单节点(单机模式)。
/home/dockerapps/elasticsearch/data:/usr/share/elasticsearch/data
将物理机dockerapp
下的目录映射到容器以进行持久化。
另外可以不映射9300
端口,这里的9300
是集群用的。
docker run -p 9200:9200 -p 9300:9300
-v /home/dockerapps/elasticsearch/data:/usr/share/elasticsearch/data
-e "discovery.type=single-node"
--name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.10.1
执行后出现AccessDeniedException
,修改物理机目录对应权限
chmod -R 777 /home/dockerapps/elasticsearch/data
重新启动容器,问题解决。测试访问http://192.168.3.104:9200/
得到es基本信息
{
"name" : "XX-XX-XX",
"cluster_name" : "elasticsearch-application",
"cluster_uuid" : "HLt04VgUTkisbTgIGXrQ",
"version" : {
"number" : "7.12.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a",
"build_date" : "2021-03-18T06:17:15.410153305Z",
"build_snapshot" : false,
"lucene_version" : "8.8.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
有以上信息表示成功部署,若没有请查看日志,根据报错去找百度。
至此es
的docker
部署完毕。
离线安装搭建
1、创建用户和组
Elasticsearch 5
版本开始,出于系统安全考虑设置,不再允许直接使用 root
用户启动了,会报 can not run elasticsearch as root
异常信息,所以需要将 Elasticsearch
启动在普通用户下,且为了环境隔离,最好为 Elasticsearch
单独创建一个独立的用户,譬如 elsearch
,用户名可自定义。
useradd elsearch # 新建 elsearch 用户
passwd elsearch # 修改 elsearch 用户的密码, 这一步不设置就是没密码
请使用 root 用户执行上述命令,以创建 elsearch 用户及修改密码。
2、环境变量
为 elsearch
用户配置 Elasticsearch
配置环境变量。切换到 elsearch
用户下,编辑打开用户环境变量文件:
vim /home/elsearch/.bash_profile
将如下信息追加到文件中末尾的新行中:(我安装是提示此处需要JDK环境我就把JDK也放下去了,这里应该是不需要的,因为ES自己有Java类库和环境。在根目录下bin/elasticsearch-env中有对于Java环境的判断)
export JAVA_HOME=${你的Java的安装路径}
export ES_HOME=/usr/local/elasticsearch
export PATH=$PATH:$ES_HOME/bin:$JAVA_HOME/bin
再通过键入 :wq
保存且退出后,一定要再通过 source ~/.bash_profile
命令使变更生效。
3、资源限制
3.1 最大线程数
一般在 Linux
系统的默认情况下,系统普通用户可以创建的线程数是 1024
个,此处应确保 elsearch
用户可以创建的线程数至少为 2048
个。可用如下方式设置:
vim /etc/security/limits.d/90-nproc.conf
在打开的文件新行中追加如下内容:
elsearch soft nproc 4096
如果未修改该配置,启动时将会报形如下述内容的异常信息:
max number of threads [1024] for user [elsearch] likely too low, increase to at least [4096]
3.2 打开的文件数与线程数
vim /etc/security/limits.conf
在打开的文件新行中追加如下内容:
elsearch soft nofile 65536
elsearch hard nofile 131072
elsearch soft nproc 4096
elsearch hard nproc 4096
注意:此处的 elsearch
与上述创建的用户名elsearch
对应。
如果未修改该配置,启动时将会报形如下述内容的异常信息: node validation exception bootstrap checks failed
3.3 系统控制文件
Elasticsearch
默认使用 mmapfs
目录存储索引,而 Linux
默认对 mmap
计数限制可能太低,会导致内存异常。系统控制文件是管理系统中的各种资源控制的配置文件,ES
需要开辟一个 65536
字节以上空间的虚拟内存,但 Linux
又不允许任何用户直接开辟虚拟内存,所以通过如下方式修改:
vim /etc/sysctl.conf
在打开的文件新行中增加如下内容:
vm.max_map_count=655360
再执行 sysctl -p
命令使其生效。
如果未修改该配置,启动时将会报形如下述内容的异常信息: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
4、下载安装配置
官方下载压缩包地址:https://www.elastic.co/cn/start
找对应的机器版本下载,这里我使用最新版本Linux 7.12.0
4.1、启动
将下载好的安装包 elasticsearch-7.12.0-linux-x86_64.tar.gz
上传至 elsearch
用户的主目录下,解压并移动到 /usr/local/
目录下(不一定是/usr/local
目录, 也可以是别的目录, 只是我比较喜欢把程序文件夹放到这个目录下, 把数据文件夹放到 /data
目录下而已) 。
tar -zxf elasticsearch-7.12.0-linux-x86_64.tar.gz #解压安装包
mv elasticsearch-7.12.0-linux-x86_64 /usr/local/elasticsearch #移动到指定目录,并更名
chown -R elsearch:elsearch /usr/local/elasticsearch #变更程序所属用户组
注意:使用root用户执行上述命令。
ElasticSearch
目录结构:
目录 | 配置文件 | 备注 |
---|---|---|
bin | 二进制脚本文件。 启动 elasticsearch、安装插件、运行统计数据等 |
|
config | elasticsearch.yml,jvm.options | 集群配置文件。user、role based 相关配置。 jvm配置文件可以配置jvm启动参数 -Xms 和-Xmx 等参数,一般设置为RAM的50%就可以了。 |
jdk | Java 运行环境 | |
data | path.data | 数据文件 |
lib | Java 类库 | |
logs | path.log | 日志默认存放目录 |
modules | 所有 Elasticsearch 模块 | |
plugins | 已安装的插件 |
JVM其他配置
Elasticsearch
为 JVM
的配置专门准备了一个 config/jvm.options
配置文件,7.12.0
版本的默认设置 JVM
启动时占用内存与运行时的最大占用内存皆为 1 GB
,即 -Xms1g -Xmx1g。在实际使用环境中,可能存在需调整的情况,下面给出三条调整建议:
· Xmx 和 Xms 设置成一样。
· 不要超过机器总内存的 50%。
· 不要超过 30 GB。
ElasticSearch的配置
Elasticsearch
的配置同样遵循“约定大于配置”的设计原则。Elasticsearch
具有极好的默认值设置,用户仅需很少的配置既可使用 Elasticsearch
。用户既可以使用集群更新设置 API
在在正在运行的集群上更改大多数设置,也可以通过配置文件对 Elasticsearch
进行配置。Elasticsearch
服务的主配置文件为 config/elasticsearch.yml
。
注意:下述配置中多处使用了 hostname 作为地址信息,请留意配置相关 hosts 映射关系。
1、集群名称
默认的集群名称为 elasticsearch
,如果存在多个集群,或需要为该集群起一个具有义务含义的名称,则需要为其重定义名称。
cluster.name: elasticsearch-application
注意:elasticsearch-application
的日志文件名皆以集群名为前缀。
2、节点名称
默认情况下,Elasticsearch
将使用随机生成的 UUID
的前七个字符作为节点 ID
,该节点名称一经生成后,即使重启服务亦不会变更,所以建议配置一个更有意义的名称,一般直接使用主机名(hostname)作为节点名。
node.name: ${HOSTNAME}
一般情况下,直接使用上述表达式即可,服务启动时会自动通过执行hostname
命令获取节点名。如若将其变更为具体的节点名,且是直接将此配置拷贝到其他节点上,以形成集群时,则需要另单独修改之,因为形成集群的必要条件是集群名相同,节点名不同。
3、logs
和 data
路径配置
Elasticsearch
是会像数据库一样存储大量数据的,且有时还会根据日志信息排查问题,所以数据和日志的存放目录都会另外指定到有较大存储空间的磁盘上保存。
path.data: /home/ellison/elasticsearch-7.12.0/data
path.logs: /home/ellison/elasticsearch-7.12.0/logs
若不存在上述目录,Elasticsearch
在启动时是不会去自动创建,所以需自行创建,且需保证 elsearch
用户拥有读写权限,最好将该目录所属用户及用户组修改为 elsearch
。下面提供相关命令,以供参考。
mkdir -p /home/ellison/elasticsearch-7.12.0/data #递归创建目录
chown -R elsearch:elsearch /home/ellison/elasticsearch-7.12.0 #变更目录所属用户及用户组
data
目录是可以设多个路径。
path:
data:
- /data/elasticsearch/data_1
- /data/elasticsearch/data_2
- /data/elasticsearch/data_3
在生产环境中一定要为path.data
指定多个路径,如果有条件的话,最好保证这些目录挂载到不同的物理磁盘上。这样做有两个好处:
提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
能够实现故障转移:即 Failover。
4、network.host
默认情况下,此 elasticsearch
服务绑定到回环地址上,例如 127.0.0.1``(::1)
,因为几乎每台机器的回环地址都是 127.0.0.1
,在其他机器上通过回环地址访问的肯定只能也是其本地环境,所以如此配置,意味着只有本机才能访问此服务。要想其他节点也能访问到此服务,则需要绑定到一个非回环地址。
network.host: 10.251.74.113
请将上述 IP 地址(IPv4 或 IPv6)修改为当前节点的对外 IP 地址。
5、discovery.seed_hosts
集群中拥有被选举成 Master 节点资格的地址列表。可以是以逗号分隔的单个字符串,每个节点的格式为:host:port 或 host,若并没有明确指定端口,则默认使用 9300。
discovery.seed_hosts: ["node1", "node2", "node3"]
上述表示 node1、node2 和 node3 三个节点皆有资格被选举成 Master 节点。
cluster.initial_master_nodes
在一个新集群初始化时,符合 Master 节点资格的节点集。
cluster.initial_master_nodes: ["slave09", "slave10"]
在完成环境变量和参数配置的前提下,使用 elsearch
用户执行以下命令即可启动 elasticsearch
[elsearch@JV-PRD-MD elasticsearch-7.12.0] ./bin/elasticsearch -d
参数-d表示在后台以守护进程模式运行。或者使用nohup后台启动也可以。
执行完启动命令后,可通过查看/home/ellison/elasticsearch-7.12.0/logs
目录下的 elasticsearch-application-xxxxx.log
(若在配置过程中修改了集群名称,则此文件名应为"集群名.log")文件,来检测启动过程中是否存在问题。
在确认启动日志中无异常信息后,在浏览器中输入地址访问即可:出现一堆json数据则表示安装成功。
4.2、单节点多实例启动
在同一个节点上启动多个 elasticsearch 实例:
bin/elasticsearch -E node.name=node1 -E cluster.name=my_cluster -E path.data=/data/es/node1 -d
bin/elasticsearch -E node.name=node2 -E cluster.name=my_cluster -E path.data=/data/es/node2 -d
bin/elasticsearch -E node.name=node3 -E cluster.name=my_cluster -E path.data=/data/es/node3 -d
执行完上述命令后,可在终端执行下述命令查看集群的节点信息:
curl -X GET http://localhost:9200/_cat/nodes
得到的节点信息为:
10.251.74,113 26 64 0 0.00 0.01 0.05 dilmrt - node1
10.251.74,113 25 64 0 0.00 0.01 0.05 dilmrt * node2
10.251.74,113 27 64 0 0.00 0.01 0.05 dilmrt - node3
4.3、停止
简单粗暴,使用jps
查询Java
进程,然后直接kill -9
干死。
或者网上有一些会封装一些脚本操作,可以学习(下面封装是copy其他博客):
# 方式一:组合命令
ps -ef|grep Elasticsearch|grep -v grep|awk '{print $2}'|xargs kill -SIGTERM
# 方式二:封装脚本,整理成一个stop.sh 脚本,存放于 你安装的es的根目录的/bin/ 目录下,要记得为该脚本赋可执行权限:chmod +x stop.sh
#!/bin/sh
SIGNAL=${SIGNAL:-TERM}
case "`uname`" in
Linux)
bin_abs_path=$(readlink -f $(dirname $0))
;;
*)
bin_abs_path=`cd $(dirname $0); pwd`
;;
esac
base_dir=`cd $bin_abs_path/..; pwd`
PIDS=$(ps ax|grep Elasticsearch|grep java|grep "$base_dir"|grep -v grep|awk '{print $1}')
if [ -z "$PIDS" ]; then
echo "No elasticsearch server to stop"
exit 1
else
kill -s $SIGNAL $PIDS
while true
do
PID=$(ps ax|grep Elasticsearch|grep java|grep "$base_dir"|grep -v grep)
if [ -z "$PID" ]; then
echo " stopped"
break
fi
echo -n "."
sleep 1
done
fi
Kibana
的搭建过程
Docker
方式安装搭建
docker run -p 5601:5601 --name kibana docker.elastic.co/kibana/kibana:7.10.1
此时通过日志发现无法连接到elasticsearch,因此做一个容器和物理机的路径映射,并修改一些配置
docker cp kibana:/usr/share/kibana /home/dockerapps
docker stop kibana
docker rm kibana
docker run -p 5601:5601 -v /home/dockerapps/kibana:/usr/share/kibana --name kibana docker.elastic.co/kibana/kibana:7.10.1
修改kibana/config/kibana.yml,指定elasticsearch.hosts的正确地址并重启容器。
访问http://192.168.3.104:5601 进入kibana管理页面,有界面显示表示成功,否则请查看日志具体排查问题。
kibana 安装完毕首次访问。
离线安装搭建
先参考官方教程:https://www.elastic.co/guide/en/kibana/6.5/rpm.html
跟 es步骤一样,下载、安装、配置、启动、停止
这里列一下配置、启动和停止:
配置
[ellison@JV-PROD-MD Kibana-7.12.0]# vi /home/ellison/Kibana-7.12.0/kibana.yml
填写如下配置:
server.port: 5601 // 监听端口
server.host: "10.251.74.113" // 监听IP地址,建议内网ip
elasticsearch.url: "http://10.251.74.113:9200" // elasticsearch连接kibana的URL,也可以填写10.251.74.*,因为它们是一个集群
启动
[ellison@JV-PROD-MD Kibana-7.12.0]# ./bin/kibana
后台进程启动
[ellison@JV-PROD-MD Kibana-7.12.0]# nohup ./bin/kibana &
启动无报错后.
验证服务看到有TCP进程后,去浏览器地址访问 10.251.74.113:5601
会有界面出现。
验证服务命令:
[root@JV-PROD-MD Kibana-7.12.0]# ss -antlup | grep 5601
停止
[root@JV-PROD-MD Kibana-7.12.0]# netstat -tunlp | grep 5601
查到进程后直接kill -9
FileBeat
的搭建过程
Docker
方式安装搭建
**1、启动FileBeat容器 **
注意映射spring boot的日志存放路径和elasticsearch地址。
docker run -d \
--name=filebeat \
--user=root \
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
--volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
--volume="/root/dockerapps/services/logs:/data/logs" \
docker.elastic.co/beats/filebeat:7.10.1 filebeat -e -strict.perms=false \
-E output.elasticsearch.hosts=["192.168.3.104:9200"]
2、配置FileBeat
读取日志文件的路径及规则
我这里是不同的服务部署在了多个服务器,所以我在相应的机器均部署一个FileBeat组件进行日志读取传输。
全部属性配置,官网想当全也很白话,建议查看官网
或者参考CSDN博客:https://blog.csdn.net/qq_27818541/category_10299800.html
<<112机器配置文件>>:
下面是测试通过的最终配置文件:
# ============================== Filebeat inputs ===============================
filebeat.inputs:
# 业务系统日志抓取
- type: log
enabled: true
paths:
- "/root/applog/boe-wms/*"
tags: ["wms"]
multiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 接口日志抓取
- type: log
enabled: true
paths:
- "/root/applog/boe-wms-interface/*"
tags: ["interface"]
multiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 工作流服务日志抓取
- type: log
enabled: true
paths:
- "/root/applog/boe-wms-workflow/*"
tags: ["workflow"]
multiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 读取 FileBeat 软件的日志,并配置标签便于检索
- type: filestream
enabled: true
paths:
- "/usr/local/filebeat-data/logs/*"
# ============================== Filebeat modules ==============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# ======================= Elasticsearch template setting =======================
setup.template.settings:
index.number_of_shards: 1
# =================================== Kibana ===================================
setup.kibana:
host: "10.251.74.113:5601"
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
hosts: ["10.251.74.113:9200"]
# ================================= Processors =================================
processors:
- script:
lang: javascript
id: my_filter
tag: enable
source: >
function process(event){
var str = event.Get("message");
var time = str.splict(" ").slice(0,2).join(" ");
event.Put("_time",time);
}
- timestamp:
field: log_time
timezone: Asia/Shanghai
layouts:
- '2006-01-02 15:04:05'
- '2006-01-02 15:04:05.999'
test:
- '2021-04-13 14:57:51'
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
# ================================== Logging ===================================
logging.level: info
logging.to_files: true
logging.files:
path: /usr/local/filebeat-data/logs
name: filebeat
keepfiles: 7
permissions: 0644
重启filebeat
容器,进入[kibana
>Stack Management
>Index patterns
] 添加filebeat
索引并查看日志。
<<111服务器配置>>:
下面是测试通过的最终配置文件:
# ============================== Filebeat inputs ===============================
filebeat.inputs:
# 读取 admin 服务的日志,并配置标签便于检索
- type: log
enabled: true
paths:
- "/root/applog/savor-admin/*"
tags: ["admin","savor-admin"]
mutiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 读取 auth 服务的日志,并配置标签便于检索
- type: log
enabled: true
paths:
- "/root/applog/savor-auth/*"
tags: ["auth","savor-auth"]
mutiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 读取 dict 服务的日志,并配置标签便于检索
- type: log
enabled: true
paths:
- "/root/applog/savor-dict/*"
tags: ["dict","savor-dict"]
mutiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 读取 gate 服务的日志,并配置标签便于检索
- type: log
enabled: true
paths:
- "/root/applog/savor-gate/*"
tags: ["gate","savor-gate"]
mutiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 读取 general 服务的日志,并配置标签便于检索
- type: log
enabled: true
paths:
- "/root/applog/savor-general/*"
tags: ["general","savor-general"]
mutiline:
pattern: ^[0-9]{4}
negate: true
match: after
timeout: 3s
# 读取 FileBeat 软件的日志,并配置标签便于检索
- type: filestream
enabled: true
paths:
- "/usr/local/filebeat-data/logs/*"
# ============================== Filebeat modules ==============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# ======================= Elasticsearch template setting =======================
setup.template.settings:
index.number_of_shards: 1
# =================================== Kibana ===================================
setup.kibana:
host: "10.251.74.113:5601"
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
hosts: ["10.251.74.113:9200"]
# ================================= Processors =================================
processors:
- script:
lang: javascript
id: my_filter
tag: enable
source: >
function process(event){
var str = event.Get("message");
var time = str.splict(" ").slice(0,2).join(" ");
event.Put("_time",time);
}
- timestamp:
field: log_time
timezone: Asia/Shanghai
layouts:
- '2006-01-02 15:04:05'
- '2006-01-02 15:04:05.999'
test:
- '2021-04-13 14:57:51'
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
# ================================== Logging ===================================
logging.level: info
logging.to_files: true
logging.files:
path: /usr/local/filebeat-data/logs
name: filebeat
keepfiles: 7
permissions: 0644
离线安装搭建
这里离线安装是傻瓜式的,直接tar
后,上面的配置信息写到filebeat.yml
文件启动即可。
启动
保守一点,启动新进行测试启动,会验证yaml
的配置文件是否正确,正常启动后 ctrl+c
,然后利用后台启动即可。
非后台启动服务方式:
[ellison@JV-PROD-MD ~]# cd filebeat-7.12.0-linux-x86_64
[ellison@JV-PROD-MD filebeat-7.12.0-linux-x86_64]# ./filebeat -e -c filebeat.yml
后台启动服务方式:
[ellison@JV-PROD-MD filebeat-7.12.0-linux-x86_64]# nohup ./filebeat -e -c filebeat.yml &
LogStash
的搭建过程
Docker
方式安装搭建
离线安装搭建
启动
各种组件的使用
Kibana 使用
Kibana
在搭建结束后,界面配置教程,参考官方使用手册Kibana使用手册
ElasticSearch
+Kibana
+filebeat
设置用户名密码登陆
修改ES
配置
首先修改ES
的配置文件:elasticsearch.yml
, 添加如下配置
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
配置完后,重启ES
。然后去ES
的bin
目录下,执行设置用户名和密码的命令,然后一次逐个设置密码:
./elasticsearch-setup-passwords interactive
这里会设置六个账号的密码:
- elastic
- apm_system
- kibana
- kibana_system
- logstash_system
- beats_system
- remote_monitoring_user
修改kibana
配置
设置完毕后,去设置kibana
的配置文件:
elasticsearch.username: "elastic"
elasticsearch.password: "boe123456"
修改保存后,重启Kibana
。
这时候 需要认证才可登陆,登陆账号密码为elastic
/boe123456
。
修改fileBeat
配置
在安装FileBeat服务的每台机器上都修改下配置文件。
filebeat.yml
配置文件中添加ES
的访问用户名和密码。
注意:Kibana设置中也要添加用户名密码,均为ES的密码:
# =================================== Kibana ===================================
setup.kibana:
host: "10.251.74.113:5601"
username: "elastic" # ES 服务用户名
password: "你的es服务密码" # ES 服务密码
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
hosts: ["10.251.74.113:9200"] # ES 服务地址
username: "elastic" # ES 服务用户名
password: "你的es服务密码" # ES 服务密码
在修改完配置后,记得要重启FileBeat服务。