Docker 搭建 ELK 收集并展示 tomcat 日志
架构
前端展示 --> 索引搜索 <-- 日志提取及过滤 --> 日志缓存 <-- 日志收集
Kibana --> Elastash <-- Logstash --> redis <-- filebeat
操作系统: CentOS 7.4
相关软件:filebeat-6.3.0-linux-x86_64.tar.gz, docker 18.03.1-ce, redis_version:4.0.10, docker-compose 1.18.0
日志文件名称及内容:
/iba/ibaboss/java/bossmobile-tomcat-8.0.26/logs/catalina.out
#截取的内容:
22-Jun-2018 17:45:22.397 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.0.26
22-Jun-2018 17:45:22.399 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Aug 18 2015 11:38:37 UTC
22-Jun-2018 17:45:22.399 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.0.26.0
/iba/ibaboss/java/bossmobile-tomcat-8.0.26/logs/ibalife.log
# 截取的内容:
[ERROR] [2018-06-30 17:41:56][com.iba.boss.pubsub.listener.core.ListenerTemplate]ErpCustomerRegEventListener onListen Done
[ERROR] [2018-06-30 17:41:56][com.iba.boss.pubsub.listener.user.BmcLevelDescEventListener]bmcLevelDescEventListener -> Waiting for set levelDesc
[ERROR] [2018-06-30 17:41:56][com.iba.boss.pubsub.listener.core.ListenerTemplate]BmcLevelDescEventListener onListen Done
安装 docker
详情可以参考
https://www.cnblogs.com/klvchen/p/8468855.html
https://www.cnblogs.com/klvchen/p/9098745.html
安装 docker-compose
详情可以参考 https://www.cnblogs.com/klvchen/p/9242774.html
安装 redis (这里使用 docker)
docker pull redis
mkdir /home/ibaboss/compose/config -p
cd /home/ibaboss/compose/config
# redis 的配置,密码为 ibalife
vi redis.conf
#daemonize yes
pidfile /data/redis.pid
port 6379
tcp-backlog 30000
timeout 0
tcp-keepalive 10
loglevel notice
logfile /data/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass ibalife
maxclients 30000
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events KEA
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 1000
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
# 编写 docker-compose redis yml 文件
cd /home/ibaboss/compose
vi docker-compose-redis.yml
version: '3'
services:
elk-redis: # 注意这里不能使用 _ 线命名,在java中需转义
image: redis:latest
container_name: elk-redis
ports:
- "192.168.0.223:6379:6379" # 为提升安全,redis只对内网开放
volumes:
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
networks:
- logs-elk # 使用指定的网络 logs-elk
entrypoint:
- redis-server
- /usr/local/etc/redis/redis.conf
networks:
logs-elk:
external: # 指定使用网络
name: logs-elk
# 创建 elk 专用的网络
docker network create --attachable logs-elk
# 启动 redis
docker-compose -f docker-compose-redis.yml up -d
# 查看状态
docker ps -a
# 可通过上一步获得 CONTAINER ID,查看启动日志
docker logs -f 4841efd2e1ef
安装 filebeat
mkdir /home/tools -p
cd /home/tools
# 安装包上传到 /home/tools
tar zxvf filebeat-6.3.0-linux-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -s /usr/local/filebeat-6.3.0-linux-x86_64 /usr/local/filebeat
配置 filebeat 配置文件
cd /usr/local/filebeat
cat filebeat4bossmobile.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /iba/ibaboss/java/bossmobile-tomcat-8.0.26/logs/catalina.out
multiline.pattern: '^[[:word:]]|^java' # 匹配多行时指定正则表达式
multiline.negate: true # 定义上边pattern匹配到的行是否用于多行合并,也就是定义是不是作为日志的一部分,multiline 规则参考文章底下链接
multiline.match: after # 定义如何将匹配到的行组合成,在之前或者之后
fields: # 在采集的信息中添加一个自定义字段 service,里面的值为 bossmobile_catalina,区分两类日志
service: bossmobile_catalina
- type: log
enabled: true
paths:
- /iba/ibaboss/java/bossmobile-tomcat-8.0.26/logs/ibalife.*
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
fields: # 在采集的信息中添加一个自定义字段 service,里面的值为 bossmobile_ibalife,区分两类日志
service: bossmobile_ibalife
output.redis:
hosts: ["192.168.0.223"] # 这里是 redis 的内网地址
password: "ibalife"
key: "bossmobile" # 存入到 redis 中的 bossmobile key 中
db: 0
timeout: 5
启动 filebeat
# 创建 filebeat 保存日志的文件夹
mkdir /iba/ibaboss/filebeat_logs
nohup ./filebeat -e -c filebeat4bossmobile.yml >/iba/ibaboss/filebeat_logs/filebeat4bossmobile.log 2>&1 &
# 如果想重新读取日志,可以停止 filebeat 后删除,再重新启动即可
ps -ef|grep filebeat
kill -9 PID
rm /usr/local/filebeat/data/registry
安装配置 ELK
cd /home/ibaboss/compose
cat docker-compose-elk.yml
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: logs_elasticsearch # 给容器命名
restart: always
environment:
- discovery.type=single-node
- cluster.name=docker-cluster
- network.host=0.0.0.0
- discovery.zen.minimum_master_nodes=1
- ES_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- /iba/ibaboss/elk-data:/var/lib/elasticsearch
networks:
logs-elk: # 指定使用的网络
aliases:
- elasticsearch # 该容器的别名,在 logs-elk 网络中的其他容器可以通过别名 elasticsearch 来访问到该容器
kibana:
image: docker.elastic.co/kibana/kibana:6.2.4
container_name: logs_kibana
ports:
- "5601:5601"
restart: always
networks:
logs-elk:
aliases:
- kibana
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
- SERVER_NAME=kibana
depends_on:
- elasticsearch
logstash:
image: docker.elastic.co/logstash/logstash:6.2.4
container_name: logs_logstash
restart: always
environment:
- LS_JAVA_OPTS=-Xmx256m -Xms256m
volumes:
- ./config/logstash.conf:/etc/logstash.conf
networks:
logs-elk:
aliases:
- logstash
depends_on:
- elasticsearch
entrypoint:
- logstash
- -f
- /etc/logstash.conf
networks:
logs-elk:
external:
name: logs-elk
cd /home/ibaboss/compose/config
cat logstash.conf
input {
redis {
port => "6379"
host => "elk-redis" # redis 主机是 logs-elk 网络中的 elk-redis 主机
data_type => "list"
key => "bossmobile" # 从 redis 中 bossmobile key 中获取数据
password => "ibalife"
}
}
filter {
mutate { # 定义去除的字段
remove_field => ["_id","@version","_index","_score","_type","beat.hostname","beat.name","beat.version","fields.service","input.type","offset","prospector.type","source"]
}
if [fields][service] == "bossmobile_catalina" {
grok { # 匹配 message 字段中的 时间,放入自定义的 customer_time 字段中
match => [ "message" , "(?<customer_time>%{MONTHDAY}-%{MONTH}-%{YEAR} %{HOUR}:%{MINUTE}:%{SECOND})" ]
}
}
if [fields][service] == "bossmobile_ibalife" {
grok {
match => [ "message" , "(?<customer_time>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND})" ]
}
}
date {
match => [ "customer_time", "dd-MMM-yyyy HH:mm:ss.SSS","yyyy-MM-dd HH:mm:ss" ] # 格式化 customer_time 中的时间类型从string 变成 date,例如 22-Jun-2018 17:45:22.397,对应为 dd-MMM-yyyy HH:mm:ss.SSS
locale => "en"
target => [ "@timestamp" ] # 替换 @timestamp 字段的值,@timestamp 的值用于 kibana 排序
timezone => "Asia/Shanghai"
}
}
output { # 根据 redis 中的 service 的字段,分别创建不同的 elasticsearch index
if [fields][service] == "bossmobile_catalina" {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "bossmobile_catalina-%{+YYYY.MM.dd}"
}
}
if [fields][service] == "bossmobile_ibalife" {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "bossmobile_ibalife-%{+YYYY.MM.dd}"
}
}
}
# 启动容器
mkdir /iba/ibaboss/elk-data -p
cd /home/ibaboss/compose
docker-compose -f docker-compose-elk.yml up -d
docker ps -a
访问 kibana 所在的 ip:5601,创建 Index Patterns, bossmobile_catalina-* 和 bossmobile_ibalife-*
覆盖 -- overwrite
使用 Grok 的 overwrite 参数也可以覆盖日志中的信息
grok {
match => { "message" => "\[%{WORD}\] \[%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}\]%{GREEDYDATA:message}" }
overwrite => [ "message" ]
}
这里会把 [ERROR] [2019-06-18 10:58:56] 这类信息去除
参考
#grok 在线调试
http://grok.qiexun.net/
# multiline 官方说明
https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
# kibana 中文用户手册
https://www.elastic.co/guide/cn/kibana/current/index.html
https://elasticsearch.cn/question/2651
http://www.importnew.com/27705.html
https://www.elastic.co/guide/en/logstash/current/index.html
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
注意:测试期间曾碰到 logstash 与 elasticsearch 无法通信,解决的办法是:
一:创建 elk 专用的网络,不使用 "_" ,如:
docker network create --attachable logs-elk 代替 docker network create --attachable logs_elk
二:看错误日志
Docker 搭建 ELK 收集并展示 tomcat 日志的更多相关文章
- Docker安装ELK并实现JSON格式日志分析
ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash和Kibana. 其中Logstash ...
- Docker 搭建 ELK 集群步骤
前言 本篇文章主要介绍在两台机器上使用 Docker 搭建 ELK. 正文 环境 CentOS 7.7 系统 Docker version 19.03.8 docker-compose version ...
- K8S(15)监控实战-ELK收集K8S内应用日志
K8S监控实战-ELK收集K8S内应用日志 目录 K8S监控实战-ELK收集K8S内应用日志 1 收集K8S日志方案 1.1 传统ELk模型缺点: 1.2 K8s容器日志收集模型 2 制作tomcat ...
- elk收集分析nginx access日志
elk收集分析nginx access日志 首先elk的搭建按照这篇文章使用elk+redis搭建nginx日志分析平台说的,使用redis的push和pop做队列,然后有个logstash_inde ...
- Docker 搭建 ELK 读取微服务项目的日志文件
思路: 在docker搭建elasticsearch与kibana来展示日志,在微服务部署的机子上部署logstash来收集日志传到elasticsearch中,通过kibana来展示,logstas ...
- 通过docker搭建ELK集群
单机ELK,另外两台服务器分别有一个elasticsearch节点,这样形成一个3节点的ES集群. 可以先尝试单独搭建es集群或单机ELK https://www.cnblogs.com/lz0925 ...
- 【杂记】docker搭建ELK 集群6.4.0版本 + elasticsearch-head IK分词器与拼音分词器整合
大佬博客地址:https://blog.csdn.net/supermao1013/article/category/8269552 docker elasticsearch 集群启动命令 docke ...
- Docker搭建ELK的javaweb应用日志收集存储分析系统
1.启动elasticsearch docker run -d --name myes -p 9200:9200 elasticsearch:2.3 2.启动kibana docker run --n ...
- Docker 部署 ELK 收集 Nginx 日志
一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
随机推荐
- R语言-编写自定义函数 ZZ
一.函数构造器 每一个R函数都包括三个部分:函数名,程序主体以及参数集合,在编写自定义R函数时,需要将三个部分各自储存在一个R对象中.这里需要使用function函数,形如: my_function& ...
- 选项卡--原生js
比较基础的一个特效,毕业设计要做一些记录,就把这些都记下来吧,万一用到的时候忘了呢 function changeTab() { let navs = document.getElementsByTa ...
- PHP中字符串与html相互转化函数
在一般通信过程中,可能会遇到文档文本编码中所不包括很多字符,或者无法在键盘上输入的字符.例如,版权符号(©).分币符号(¢)和语法重音符号等就属于这种字符.为了克服这些缺点,专门设计了一组统一的按键编 ...
- CVE-2015-1641 Office类型混淆漏洞及shellcode分析
作者:枕边月亮 原文来自:CVE-2015-1641 Office类型混淆漏洞及shellcode分析 0x1实验环境:Win7_32位,Office2007 0x2工具:Windbg,OD,火绒剑, ...
- JavaScript实现HTML页面集成QQ空间分享功能
<!DOCTYPE HTML> <html> <head> <title>QQ空间分享</title> <meta http-equi ...
- Linux - 基础命令汇总
珠玉在前,不再赘言. 60个命令 对Linux新手非常有用的20个命令 对中级Linux用户非常有用的20个命令 对Linux专家非常有用的20个命令 一些技巧 最实用的 Linux 命令行使用技巧 ...
- Python - 集成开发环境Pycharm的使用方法和技巧
PyCharm HomePage:PyCharm 我的Pycharm,我做主 Getting Started with PyCharm Pycharm使用技巧 Documentation & ...
- LeetCode:104_Maximum Depth of Binary Tree | 二叉树的最大深度 | Easy
要求:求二叉树的深度(二叉树的深度为最远叶子节点到根节点的距离,即根节点到最远叶子节点的距离) Given a binary tree, find its maximum depth. The max ...
- Origin的使用问题集锦
在空间上看见同学转的一篇关于学术研究的文章,由于不常常上空间,更别说在上面看一些好的文章,所以特意将那篇文章整理到自己的博客中,方便以后做科研的时候能够用到,原文出处:http://user.qzon ...
- 实现文本在标签内平均分布的css样式
这里有一个容器,添加了一段文字,想让它们平均分布达到标签flex布局的效果,而不是靠左.靠右或者居中显示. 添加样式: text-align: justify; text-align-last: ju ...