【ELK】分布式日志解决方案

直入主题

docker-comose搭建elk

  • 创建相关目录
    总的结构图如下
    【ELK】分布式日志解决方案_第1张图片

  • docker-compose.yml

    version: '2'
    services:
      elasticsearch:
        image: elasticsearch:7.6.2
        container_name: elasticsearch
        privileged: true
        user: root
        environment:
          - cluster.name=elasticsearch 
          #以单一节点模式启动
          - discovery.type=single-node 
          #设置使用jvm内存大小
          - ES_JAVA_OPTS=-Xms512m -Xmx512m 
        volumes:
          - $PWD/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
          - $PWD/elk/elasticsearch/data:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
          - 9300:9300
    
      logstash:
        image: logstash:7.6.2
        container_name: logstash
        ports:
           - 4560:4560
        privileged: true
        environment:
          - TZ=Asia/Shanghai
        volumes:
          #挂载配置文件方便修改
          - $PWD/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf 
        depends_on:
          - elasticsearch 
        links:
          - elasticsearch:es 
        
      kibana:
        image: kibana:7.6.2
        container_name: kibana
        ports:
            - 5601:5601
        privileged: true
        links:
          - elasticsearch:es 
        depends_on:
          - elasticsearch 
        environment:
          - elasticsearch.hosts=http://es:9200 
    
  • logstash.conf
    按照需求自定义,结合项目考虑索引。

    input {
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4560
        codec => json
      }
    }
    output {
      elasticsearch {
        hosts => "es:9200"
        index => "logstash-%{+YYYY.MM.dd}"
      }
    }
    
  • ES下的data文件夹赋予权限,不然启动会报错.

    chmod 777 ./elasticsearch/data
    
  • ik分词器插件下载,注意版本对应。
    【ELK】分布式日志解决方案_第2张图片
    放入ik文件夹下并解压

    unzip ./elasticsearch-analysis-ik-7.6.2.zip
    
  • 启动并查看日志确认无报错,页面可访问

    docker-compose up -d
    

    ES:【ELK】分布式日志解决方案_第3张图片

    Kibana:

    LogSatsh:
    在这里插入图片描述

  • 验证ik分词器

    • standard:默认分词,单词会被拆分,大小会转换为小写
      【ELK】分布式日志解决方案_第4张图片
    • ik_smart:最粗粒度的拆分,适合 适合 Phrase 查询
      【ELK】分布式日志解决方案_第5张图片
    • ik_max_word:最细粒度的拆分,适合 Term Query【ELK】分布式日志解决方案_第6张图片
  • logstash安装json_lines插件

# 进入logstash容器
docker exec -it logstash /bin/bash
# 进入bin目录
cd /bin/
# 安装插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启
docker restart logstash

至此,基础环境搭建完成。

项目集成

添加相关依赖


<dependency>
    <groupId>net.logstash.logbackgroupId>
    <artifactId>logstash-logback-encoderartifactId>
dependency>

配置logback实现
按照自己需求配置,可以配置过滤级别之类的


DOCTYPE configuration>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    
    <property name="APP_NAME" value="elk-test"/>
    <contextName>${APP_NAME}contextName>
    
    
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        
        <destination>192.168.1.110:4560destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="LOGSTASH"/>
    root>
configuration>


添加日志启动并测试:

  • 自定义打印“项目启动成功!“
    【ELK】分布式日志解决方案_第7张图片
    可以看到控制台的十条INFO记录
    【ELK】分布式日志解决方案_第8张图片

  • kibana创建相关索引
    查看相关日志无误,日志条数正确。
    【ELK】分布式日志解决方案_第9张图片

多项目接入

虽然ELK是分布式日志解决方案,但是存在不少企业为了方便统一管理日志,多个单体程序向同一个ELK服务发送日志消息的情况。针对这种情况,本文提供一种较为简单的不成熟解决方案:程序标识

简单来说,就是日志添加相应字段,根据日志中的标识字段进行条件判断,将日志分别发送到不同的索引。

  1. 修改 logstash 的配置文件

    input {
     # 略
    }
    	
    output {
       if [app] == "A" {
        elasticsearch {
          hosts => ["es:9200"]
          index => "a-index-%{+YYYY.MM.dd}"
        }
      } else if [app] == "B" {
        elasticsearch {
          hosts => ["es:9200"]
          index => "b-index-%{+YYYY.MM.dd}"
        }
      }
    }
    
  2. 日志配置xml文件配置 添加标识字段

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        
        <destination>192.168.1.110:4560destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            
            <customFields>{"app":"A"}customFields>
        encoder>
    appender>
    
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        
        <destination>192.168.1.110:4560destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            
            <customFields>{"app":"B"}customFields>
        encoder>
    appender>
    
  3. 启动两个程序并查看成果数据

    • es索引查看
      【ELK】分布式日志解决方案_第10张图片
    • Kinaba索引创建
      【ELK】分布式日志解决方案_第11张图片
    • Kinaba视图查看
      【ELK】分布式日志解决方案_第12张图片
      【ELK】分布式日志解决方案_第13张图片

小结

需要注意logstash.conf的配置要考虑好,可以考虑让它可以分场景收集不同的日志。同样的logback-spring.xml中要有相关体现。

另外补充下logstash各配置模块中index的含义:

  • input模块的index参数:
    在input模块中,index参数用于指定要从哪个索引(index)中获取数据。索引在Elasticsearch中是用于组织和存储数据的逻辑容器。当配置Logstash的输入时,可以指定一个或多个索引作为输入源,以便从中获取数据。例如,可以指定一个索引名称,如index => “my_index”,Logstash将从该索引中读取数据并进行处理。 本文使用tcp模式作为数据源。

  • output模块的index参数:
    在output模块中,index参数用于指定要将数据发送到哪个索引(index)。当配置Logstash的输出时,可以指定要将数据发送到的特定索引。例如,可以使用index => "my_output_index"来指定要将处理后的数据发送到名为"my_output_index"的索引中。

你可能感兴趣的:(实战教程,#,后端,文档整理,elk,分布式,java)