ELKB 日志系统

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

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: ~


数据样例

image-20220105104748013

我这里是把数据 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 输入常用的四种形式:

  1. file: 标准的文件系统,采集数据好比 tail -fn 100
  2. syslog: 系统的日志文件(不是很了解)
  3. redis: 从 redis 里边获取数据(其实可以说是消息中间件)
  4. beats: 直接从 beats 里边获取数据

更多的还有 ES、HTTP、JDBC、Kafka、Log4j、RabbitMQ、WebSocket…

Filters(过滤器)

过滤器是 Logstash 管道里边特有的事件处理设备,根据特定的条件对不同的事件进行过滤处理

  1. grok 官网目前解析数据为 结构化查询 的最佳方式
  2. mutate: 对事件字段进行处理,可以重命名删除修改替换等
  3. drop: 完全删除事件
  4. clone: 克隆一份事件,可以添加删除一些字段

Output(输出)

这是 Logstash 管道最后一个阶段,一个事件可以通过多个不同的输出,一旦所有的输出完毕,事件就完成了

  1. ElasticSearch: 和 ES 直接对接
  2. file: 将数据写到磁盘上
  3. email: 以邮件的形式进行发送
  4. HTTP: 以 HTTP 请求的形式
  5. 消息中间件: Kafka、RabbitMQ、Redis(假装是消息中间件)
  6. WebSocket: 以 socket 的形式发送出去

编解码器(Codecs)

编解码器可以让不同的数据拥有不同的输出形式

  1. JSON: 以 JSON 格式输出
  2. multiline: 多行输出(多个事件合并成一个事件)

配置文件

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/ 插件,可能会用到分词器等插件

ES 更多用法参照官网文档,或者中文社区都行

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 用户名、密码 安全登录

相关文章

TCP/IP套接字登录方法是MySQL在一切服务平台都提供的一种登录...
easy-rule规则引擎最佳落地
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分...
最近壹哥的一个学生,在利用spring-data-elasticsearch访问E...
java 操作elasticsearch详细总结
原文链接:http://www.ruanyifeng.com/blog/2017/08/elastic...