filebeat + redis +ELK
好久没有写博客了,看了一下上一篇的博客还是2017年的,写的东西都是基础的教学,感觉网上一搜一大把,而且写的比我好的千千万。所以打算以后写不写教学类的东西(写一篇好的教学类的博客真的很难)
最近稍微的了空,而且项目上有程序对日志查询这块有需求,就搭建了一套ELK日志系统。
选型,介绍什么的就不说了。这篇文章是我自己的笔记,主要是记录一些命令和一些问题的解决方法,而不是搭建教程,可以当作一个问题排查的地方。
docker 安装 elk
- 创建网络
docker network create --subnet=172.25.0.0/16 my-docker-net
- 安装es
docker run -d -p 9200:9200 --name=es --network=my-docker-net --ip=172.25.0.2 elasticsearch:5.6.13
- 修改
/usr/share/elasticsearch/config/elasticsearch.yml 解决 es-head 容器连不上es
echo -e 'http.cors.enabled: true\nhttp.cors.allow-origin: "*"' >> elasticsearch.yml
- 安装 es-head
docker run -d -p 9100:9100 --name=es --network=my-docker-net --ip=172.25.0.3 mobz/elasticsearch-head:5
- 安装redis
docker run -d -p 6379:6379 --name=redis --network=my-docker-net --ip=172.25.0.4 redis:latest
- 安装kibana
docker run -d -p 5601:5601 --name=kibana --network=my-docker-net --ip=172.25.0.5 kibana:6.5.0
修改配置文件 config/kibana.yml
server.host: "0.0.0.0"
#es 地址
elasticsearch.url: http://172.25.0.2:9200
logstash 和 filebeat 是直接运行在物理机上
grok 和filebeat 配置问题
- filebeat 配置多行日志合并,如java异常堆栈信息,在filebeat.yml上配置
官方配置文档
filebeat.inputs:
- type: log
# tags 可以和 logstash 配置匹配上
tags: ["debug"]
multiline:
# 配置分割前缀
pattern: '^\|\-'
negate: true
match: after
timeout: 10s
# 下面这个不需要复制
fields:
type: test1
host: 161
# 忽略多长时间内变化的文件
ignore_older: 1h
redis配置
output.redis:
hosts: ["127.0.0.1"]
port: 6379
key: "java-log"
db: 1
input {
tcp {
##host:port就是上面appender中的 destination,这里其实把logstash作为服务,开启9300端口接收logback发出的消息
host => "127.0.0.1"
port => 9300
mode => "server"
tags => ["tags"]
codec => json_lines
}
redis {
data_type => "list"
host => "127.0.0.1"
db => "1"
port => "6379"
key => "java-log"
#password => "123456"
}
}
filter {
grok {
# 正则文件存放目录 文件名叫什么无所谓
patterns_dir => "./patterns"
match => { "message" => "%{JAVA_NORMAL_LOG}" }
# 移除某些字段
remove_field => "message"
}
mutate {
rename => { "[host][name]" => "host" }
}
}
output {
# 控制台输出debug
stdout { codec => rubydebug }
#输出到es
if "info" in [tags] {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "java_info"
}
} else if "debug" in [tags] {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "java_debug"
}
} else {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "java_normal"
}
}
}
- 匹配日志匹配 logback 配置
|- %-12(%d{yyyy-MM-dd HH:mm:ss}) %-5level [%thread] %c : %L %msg%n
正则表达式 grok 支持将正则定义在一个目录中,文件名什么无所谓。将如下正则表达式贴到对应文件中
MYSELFTIMESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
JAVACLASS (?:[a-zA-Z$_][a-zA-Z$_0-9]*\.)*[a-zA-Z$_][a-zA-Z$_0-9]*
MATCH_ANY [\s\S]*
JAVA_LOG \|\- %{MYSELFTIMESTAMP:timestamp}(\s*)%{LOGLEVEL:level}(\s*)\[%{MATCH_ANY:thread}\](\s*)%{JAVACLASS:class}([\s\S]*)\: %{NUMBER:line} %{MATCH_ANY:logmessage}
tips
- 多tag配置 将不同类型的日志存放到不同的地方
设置tag(tag的作用是可以根据判断条件给不同类型的日志分配不同的索引,或者推送到不同的地方)
logstash
filter {
if "json" in [tags] {
grok { match => ["message", %{COMBINEDAPACHELOG}] }
}
}
output {
if "json" in [tags] {
nagios_nsca { nagios_status => "1" }
} else {
elasticsearch { }
}
}
filebeat
filebeat.inputs:
- type: log
. . .
tags: ["json"]
elasticsearch-head 基本操作
- 删除数据
POST {index}/_delete_by_query
{
"query": {
"match": { "message": "some message" }
}
}
- 查询数据
GET {index}/_search
{
"query": {
"match": { "message": "some message" }
}
}
命令大全
- logstash 启动 --config.reload.automatic 动态刷新配置 可选参数
./lagstash -f configfile.conf --config.reload.automatic
- filebeat 启动
./filebeat -e -c filebeat.yml