此文针对7.6.2版本的elkf
一、搭建Elasticsearch遇到的问题
-
max virtual memory areas vm.max*_map_count [65530] likely too low, increase to at least [262144]*
max virtual memory areas vm.max*_map_count [65530] likely too low, increase to at least [262144]*
修改
/etc/sysctl.conf
文件,添加vm.max_map_count=262144
一行,使用sycstl -p
重置 -
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error=’Cannot allocate memory’ (errno=12)
elasticsearch5.0以后默认分配jvm空间大小为2g,内存不足以分配导致。
运行docker命令加上
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
二、搭建kibana遇到的问题
docker运行kibana最大的问题就是启动之后访问不了,因为kibana需要es输入,但是使用docker启动的话这两个容器的网络不在一个网段,就无法通信,所以我们需要在启动容器的时候指定network
- 创建docker network
docker network create somenetwork
- 启动es、kibana容器时,使用
--network=someonework
指定network - 若没挂在kibana.yml,我们待启动好后,利用
docker exec
命令进入kibana容器编辑/usr/share/kibana/config/kibana.yml文件,修改elasticsearch.hosts: [ "http://192.168.8.10:9200" ] #改成es地址
三、关于logstash与Filebeat
logstash和filebeat的启动是很便捷的,我使用的时候遇到的主要问题就是配置文件的编辑
我这边主要的安装思路是,使用filebeat获取日志发送到logstash,进行过滤
- 使用filebeat接收多个日志,包括两个业务系统及nginx
- 利用logstash,在es中创建不同的index
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/base.log
tags: ["base-logs"]
fields:
log_type: base
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:' #将以空格开头的所有行合并到上一行 并把以Caused by开头的也追加到上一行
multiline.negate: false
multiline.match: after
....
....
这里标记了tags
和fields
键值对,我们可以在logstash中使用
# 我先贴出网上找到的配置文件使用tags的写法(logstash配置文件xxx.conf)
output {
if [tags] == "base-logs" {
elasticsearch {
hosts => ["192.168.8.10:9200"]
index => "base-logs"
}
}
...
...
}
这样配置的话,我们永远获取不到tags的值,也就是永远不能创建索引
我找遍了网上很多资料,都解决不了,于是我从logstash的日志下手
我们截取一段日志
{
"tags" => [
[0] "base-logs"
],
"ecs" => {
"version" => "1.4.0"
},
"message" => "2020-07-20 14:08:26.822 INFO [base,,,] 5184 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration",
"log" => {
"offset" => 64846975,
"file" => {
"path" => "/var/log/base.log"
}
},
"fields" => {
"log_type" => "base"
},
"agent" => {
"ephemeral_id" => "80e14e5c-4653-43e3-8826-bb017bf90d64",
"version" => "7.6.2",
"type" => "filebeat",
"hostname" => "a9617dbc992d",
"id" => "9c23379c-2bd3-403d-a7a9-6fa9c354785b"
},
"@version" => "1",
"@timestamp" => 2020-07-20T14:08:26.822Z,
"timestamp" => "2020-07-20 14:08:26.822",
"host" => {
"name" => "a9617dbc992d"
},
"input" => {
"type" => "log"
}
}
我们可以清晰的看到第一行 “tags” => [ [0] “base-logs” ]
我才恍然大悟,原来tags是一个数组,所以我们要改成下面这种写法
output {
if [tags][0] == "base-logs" {
elasticsearch {
hosts => ["192.168.8.10:9200"]
index => "base-logs"
}
}
...
...
}
使用field的话也是差不多的用法
output {
if [fields][log_type] == "base" {
elasticsearch {
hosts => ["192.168.8.10:9200"]
index => "base-logs"
}
}
...
...
}