ELKB 日志系统
前情
为啥要做这个?
"灵感来源"是博主自己的项目。这个项目博主写的太自由了,杂七杂八的功能什么都有,总是报一些奇奇怪怪的错误… 报错,那咱就看日志,怎么个错法对吧。但是呢,这个本地报错那没事,我直接一眼控制台,ok 能很快解决。错就错在有个测试环境,用 jenkins 做了流水线部署,跑在服务器上了,那报错了就只能去看日志文件了。这找日志对吧 tail -n 300 xxx.log
或者 tail -f xxx.log
,这不纯xx吗。那行,那就直接自己做一个日志系统呗,顺便集成一下 jinkens。这都是后话了…
我的日志在远端服务器上,我会把 Beats 安装在服务器上,它相对 Logstash 而言较轻,然后用 Redis 做一个消息队列,在虚拟机上部署真正的 ELK 系统。
为什么要加这个 Redis?
因为我虚拟机在内网,并不能保证虚拟机随时都开着的,所以我想着起一个 ftp 服务,然后每次去查询日志的时候都手动去调一次这个 FTP 下载,但是呢,我发现好像这个东西我每次都要手动去下载这个日志,很烦。后面了解到了 Beats 但是这个我又在想,等他给 Logstash 的时候我虚拟机又宕机了呢?意外看到了一篇帖子,说了一下 Filebeat 有持久化机制,发现目的地不可用会支持存盘,等可用了再发回去。然后想了一下,如果丢消息中间件里边其实也可以嗷。但是呢,现目前那个聊天系统还没正式进入开发阶段只是一个 demo,所以还没有用到消息队列,所以说呢,就用 redis 做一个消息队列好了。我还在想,等真正起起来了,会不会给我剩下的 1g 的内存撑爆,害,到时候再说吧,谁没几次事故呢对吧…
怎么做?需要什么?
es 肯定要会吧,其实现在我也就会个 es 和 kibana。L 和 B 分别是 Logstash、Beats。
Logstash
是开源的数据收集引擎有很好的实时性,可以动态的统一不同来源的数据,将数据规范化的输出到你想要的目的地,可以直接将数据导入到 ES 中。我记得我自己学 ES 的时候还是自己手写 Java 代码将数据从 MysqL 中取出来,然后自己组装放入到 ES 中去,Logstash 完全可以替代这个步骤,让我们 Java 只关心核心检索业务就行了
Beats
是开源的数据传送器,可以将他安装在代理服务器上,并且它可以直接对接到 ES 中。它分为很多种因为做日志收集嘛,其实就是一些个日志文件,所以 Filebeat 就完全能够胜任了
Filebeat
下载和安装
https://www.elastic.co/guide/en/beats/filebeat/7.16/setup-repositories.html#_yum
我这里直接用官网提供的 YUM 下载方式了(CentOS 8.2)
# 引入 rpm
sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
# 配置 yum 仓库
vim /etc/yum.repos.d/elastic.repo
# 粘贴下面的代码 执行 :wq
[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# 安装
sudo yum install filebeat
# 开机自启
sudo systemctl enable filebeat
# 如果是 CentOS 7.x 开机自启
sudo chkconfig --add filebeat
# 目录结构 和 Nginx 很像
# home -- /usr/share/filebeat
# bin -- /usr/share/filebeat/bin
# conf -- /etc/filebeat
# data -- /var/lib/filebeat
# logs -- /var/log/filebeat
https://www.elastic.co/guide/en/beats/filebeat/current/index.html
简单配置
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/Nginx/*.log
# ============================== 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
# ================================== Outputs ===================================
# ------------------------------ Logstash Output -------------------------------
output.redis:
hosts: ["47.96.5.71:9736"]
password: "Tplentiful"
key: "filebeat:"
db: 0
timeout: 5
#output.logstash:
# The Logstash hosts
#hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
# ================================= Processors =================================
processors:
- add_host_Metadata:
when.not.contains.tags: forwarded
- add_cloud_Metadata: ~
- add_docker_Metadata: ~
- add_kubernetes_Metadata: ~
数据样例
我这里是把数据 Output 到 Redis 里边,用可视化工具查看
input 配置
由于我只收集我自己项目的日志文件,所以对于 filebeat 的 Input 相关就不做其他复杂的配置了,有兴趣的 hxd 可以自己去查一查官方文档
filebeat.inputs:
- type: log
enabled: true
backoff: "1s"
paths:
- /data/family_doctor/logs/article/*.log
- /data/family_doctor/logs/article/*/*.log
fields:
filename: article_log
fields_under_root: true
multiline:
type: pattern
pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
- type: log
enabled: true
backoff: "1s"
paths:
- /data/family_doctor/logs/other/*.log
- /data/family_doctor/logs/other/*/*.log
# 自定义一个 feilds 字段用来做输出的过滤
fields:
filename: other_log
fields_under_root: true
# 用正则匹配去匹配 timestampe 做多行统计(官网的例子)
multiline:
type: pattern
# type: count 可以自定义统计的行数
pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
...
output 配置
output.redis:
hosts: ["host:port"]
password: "Tplentiful"
# 默认的 key 值
key: "default_log"
db: 0
timeout: 5
keys:
# 根据自定义字段名称生成不同的键值
- key: "article_log"
when.equals:
filename: article_log
- key: "other_log"
when.equals:
filename: other_log
- key: "user_log"
when.equals:
filename: user_log
- key: "sys_log"
when.equals:
filename: sys_log
- key: "rtc_log"
when.equals:
filename: rtc_log
filebeat 启动脚本
#!/bin/bash
agent="/usr/share/filebeat/bin/filebeat"
args="-c /etc/filebeat/filebeat.yml"
test() {
$agent $args
}
start() {
pid=`ps -ef | grep $agent | grep -v grep | awk '{print $2}'`
if [ ! "$pid" ];then
echo "启动 filebeat: "
test
if [ $? -ne 0 ]; then
echo
exit 1
fi
$agent $args &
if [ $? == '0' ];then
echo "filebeat 启动成功"
else
echo "filebeat 启动失败"
fi
else
echo "filebeat 正在运行中"
exit
fi
}
stop() {
echo -n $"停止 filebeat: "
pid=`ps -ef | grep $agent | grep -v grep | awk '{print $2}'`
if [ ! "$pid" ];then
echo "filebeat 已经停止"
else
kill $pid
echo "filebeat 停止成功"
fi
}
restart() {
stop
start
}
status(){
pid=`ps -ef | grep $agent | grep -v grep | awk '{print $2}'`
if [ ! "$pid" ];then
echo "filebeat 当前已经停止"
else
echo "filebeat 当前正在运行"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac
Logstash
下载和安装
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
# 要使用 Java 版本的,这之前还需要安装 JDK。网上一大堆,就不专门贴出来了
# rpm 包管理
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# 创建编辑文件
vim /etc/yum.repos.d/logstash.repo
# 复制粘贴
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# 安装
sudo yum install logstash
# 目录结构和默认位置
# home -- /usr/share/logstash
# bin -- /usr/share/logstash/bin
# settings -- /etc/logstash
# conf -- /etc/logstash/conf.d/*.conf
# logs -- /var/log/logstash
# plugins -- /usr/share/logstash/plugins
# data -- /var/lib/logstash
基础知识
https://www.elastic.co/guide/en/logstash/current/pipeline.html
Input(输入)
采集的数据来源
Logstash 输入常用的四种形式:
- file: 标准的文件系统,采集数据好比 tail -fn 100
- syslog: 系统的日志文件(不是很了解)
- redis: 从 redis 里边获取数据(其实可以说是消息中间件)
- beats: 直接从 beats 里边获取数据
更多的还有 ES、HTTP、JDBC、Kafka、Log4j、RabbitMQ、WebSocket…
Filters(过滤器)
过滤器是 Logstash 管道里边特有的事件处理设备,根据特定的条件对不同的事件进行过滤处理
- grok 官网目前解析数据为
结构化
和可查询
的最佳方式 - mutate: 对事件字段进行处理,可以重命名、删除、修改替换等
- drop: 完全删除事件
- clone: 克隆一份事件,可以添加或删除一些字段
Output(输出)
这是 Logstash 管道最后一个阶段,一个事件可以通过多个不同的输出,一旦所有的输出完毕,事件就完成了
- ElasticSearch: 和 ES 直接对接
- file: 将数据写到磁盘上
- email: 以邮件的形式进行发送
- HTTP: 以 HTTP 请求的形式
- 消息中间件: Kafka、RabbitMQ、Redis(假装是消息中间件)
- WebSocket: 以 socket 的形式发送出去
编解码器(Codecs)
编解码器可以让不同的数据拥有不同的输出形式
配置文件
logstash.yml
在命令行里边的参数会覆盖 yml 里边配置
# 可以理解为采集频率的最大上上限条件
pipeline:
batch:
size: 50
delay: 5
# 节点名称
node.name: logstash1
# 数据路径
path.data: /var/lib/logstash
# 配置自动加载,Logstash 最好不要强行 kill 掉,如果当前还有阻塞住的日志没有输出,会有数据丢失
config.reload.automatic: true
# 配置热加载检测周期
config.reload.interval: 10s
# host 和 port
api.http.host: 192.168.5.128
api.http.port: 9600
# 日志路径
path.logs: /var/log/logstash
pipeline.yml
一个 Logstash 实例能够运行多个 pipeline 的配置
这里面没给配置,完全用不了这么高级的功能,官方文档说,这里边的配置会覆盖上面那个 yaml 里面对 pipeline 的配置
jvm.options
Logstash 的 JVM 参数
## JVM configuration
# xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-xms384m
-Xmx384m
################################################################
## Expert settings
################################################################
##
## All settings below this section are considered
## expert settings. Don't tamper with them unless
## you understand what you are doing
##
################################################################
## GC configuration
8-13:-XX:+UseConcmarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly
## Locale
# Set the locale language
#-Duser.language=en
# Set the locale country
#-Duser.country=US
# Set the locale variant, if any
#-Duser.variant=
## basic
# set the I/O temp directory
#-Djava.io.tmpdir=$HOME
# set to headless, just in case
-Djava.awt.headless=true
# ensure UTF-8 encoding by default (e.g. filenames)
-Dfile.encoding=UTF-8
# use our provided JNA always versus the system one
#-Djna.nosys=true
# Turn on JRuby invokedynamic
-Djruby.compile.invokedynamic=true
# Force Compilation
-Djruby.jit.threshold=0
# Make sure joni regexp interruptability is enabled
-Djruby.regexp.interruptible=true
## heap dumps
# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError
# specify an alternative path for heap dumps
# ensure the directory exists and has sufficient space
#-XX:HeapDumpPath=${LOGSTASH_HOME}/heapdump.hprof
## GC logging
#-XX:+PrintGCDetails
#-XX:+PrintGCTimeStamps
#-XX:+PrintGCDateStamps
#-XX:+PrintClassHistogram
#-XX:+PrintTenuringdistribution
#-XX:+PrintGCApplicationStoppedTime
# log GC status to a file with time stamps
# ensure the directory exists
#-Xloggc:${LS_GC_LOG_FILE}
# Entropy source for randomness
-Djava.security.egd=file:/dev/urandom
# copy the logging context from parent threads to children
-Dlog4j2.isthreadcontextMapInheritable=true
17-:--add-opens java.base/sun.nio.ch=ALL-UNNAMED
17-:--add-opens java.base/java.io=ALL-UNNAMED
log4j2.properties
Logstash 的日志配置文件-用默认的就行了,这个日志我们只是自己排错
startup.options
启动参数配置,一些路径和工作目录以及启动用户的配置
logstash 输入和输出的配置就大家自己根据 /etc/logstash/ 下的 logstash-sample.conf 做配置
ElasticSearch
下载和安装
# 经典三件套
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
vim /etc/yum.repos.d/elasticsearch.repo
# 复制进去
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
# 执行
sudo yum install --enablerepo=elasticsearch elasticsearch
# 目录结构和默认路径, ES 要特别说明一下
# home -- /usr/share/elasticsearch/ 不多说了
# bin -- /usr/share/elasticsearch/bin/ 启动文件都在这里边 其实在 /etc/init.d/ 里面才是常用的
# logs -- /var/log/elasticsearch/ 日志文件目录
# conf -- /etc/elasticsearch/ ES 的配置文件目录
# eviroment conf -- /etc/sysconfig/elasticsearch ES 环境变量的配置文件 JVM 参数等等
# data -- /var/lib/elasticsearch/ 数据
# jdk -- /usr/share/elasticsearch/jdk/ 配置 JDK 的地方,可以在 eviroment conf 里边修改
# plugins -- /usr/share/elasticsearch/plugins/ 插件,可能会用到分词器等插件
https://www.elastic.co/guide/en/elasticsearch/reference/7.16/index.html
配置文件
elasticsearch.yml
# 路径 /etc/elasticsearch/elasticsearch.yml
# 节点名称
node.name: loges1
# 数据目录
path.data: /var/lib/elasticsearch
# 日志目录
path.logs: /var/log/elasticsearch
# 自己的服务器的 IP
network.host: 192.168.5.128
# ES 端口,防火墙记得开
http.port: 9200
# 单次请求最大数据量
http.max_content_length: 50mb
# ES 自带集群,配置一下主节点
cluster.initial_master_nodes: ["loges1"]
log4j2.properties
# 他原本是怎么样的就是怎么样的,我没改。ES 内置的 Java 日志打印的一些配置,改不改意义不大
jvm.options
# ES 启动时 JVM 一些参数,前边是对应 JDK 的版本,后面是一些配置,垃圾回收器,是否打印GC日志什么的,我只是改了一些堆区大小,我应该用不了多大的空间,所以我改了 xms512m Xmx512m
elasticsearch
# 路径 /etc/sysconfig/elasticsearch
# 这个里边就是一些环境变量参数了,我在里边配置了一下 ES_JAVA_HOME 但是好像没啥作用,于是我直接在 /etc/profile 里边去设置了一下,执行 source /etc/profile 就行了
ES_JAVA_HOME=/usr/share/elasticsearch/jdk
ES_PATH_CONF=/etc/elasticsearch
ES_JAVA_OPTS="-xms512m -Xmx512m"
ES_STARTUP_SLEEP_TIME=5
# 其他都是注释掉的,如果后续有发现什么问题会一一纠正并补充上去
注意: ES 不能用 Root 账号直接启动,会报错的,所以最好是新开一个账号,其实 ES 在安装的时候为我们创建了一个叫做 elasticsearch 的账户和一个叫这个名称的组,它用户名太长了,我也就没用自己建了一个加入到这个组下了。别忘了给用户上面一些目录的权限
启动 ES /usr/share/elasticsearch/bin/elasticsearch -d 执行就行了
Kibana
下载和安装
# 复制粘贴
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
vim /etc/yum.repos.d/kibana.repo
# 复制下面内容
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# 执行
sudo yum install kibana
# 开机启动
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
# 启动停止
sudo systemctl start kibana.service
sudo systemctl stop kibana.service
# 目录结构
# home -- /usr/share/kibana
# bin -- /usr/share/kibana/bin
# conf -- /etc/kibana
# data -- /var/lib/kibana
# logs -- /var/log/kibana
# plugins -- /usr/share/kibana/plugins
配置文件
server.port: 5601
server.host: "192.168.5.128"
server.name: "kibana-1"
elasticsearch.hosts: ["http://192.168.5.128:9200"]
# 直接换非 root 用户启动就行了
kibana 没什么好说的,我只是用来写点请求模板,最后真正调用还是 Java 来做,请求参数嵌套一目了然
后续随时间更新,先贴个目录
Logstash 用 filter_plugin 解析日志中的时间并替换 @timestamp
elasticsearch、kibana、logstash 用户名、密码 安全登录
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。