ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ELKB 日志系统

2022-01-07 17:34:31  阅读:139  来源: 互联网

标签:ELKB filebeat log -- 系统 etc elasticsearch 日志 ES


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

标签:ELKB,filebeat,log,--,系统,etc,elasticsearch,日志,ES
来源: https://www.cnblogs.com/tplentiful/p/15776059.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有