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

直入主题

docker-comose搭建elk

  • 创建相关目录
    总的结构图如下
    在这里插入图片描述

  • 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分词器插件下载,注意版本对应。
    在这里插入图片描述
    放入ik文件夹下并解压

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

    docker-compose up -d
    

    ES:在这里插入图片描述

    Kibana:
    在这里插入图片描述

    LogSatsh:
    在这里插入图片描述

  • 验证ik分词器

    • standard:默认分词,单词会被拆分,大小会转换为小写
      在这里插入图片描述
    • ik_smart:最粗粒度的拆分,适合 适合 Phrase 查询
      在这里插入图片描述
    • ik_max_word:最细粒度的拆分,适合 Term Query在这里插入图片描述
  • logstash安装json_lines插件

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

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

项目集成

添加相关依赖

<!--集成logstash-->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
</dependency>

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

<?xml version="1.0" encoding="UTF-8"?>
<!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>
    
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>192.168.1.110:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

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


添加日志启动并测试:

  • 自定义打印“项目启动成功!“
    在这里插入图片描述
    可以看到控制台的十条INFO记录
    在这里插入图片描述

  • kibana创建相关索引
    查看相关日志无误,日志条数正确。
    在这里插入图片描述

多项目接入

虽然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文件配置<customFields> 添加标识字段

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>192.168.1.110:4560</destination>
        <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">
        <!--可以访问的logstash日志收集端口-->
        <destination>192.168.1.110:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <!--    自定义程序标识        -->
            <customFields>{"app":"B"}</customFields>
        </encoder>
    </appender>
    
  3. 启动两个程序并查看成果数据

    • es索引查看
      在这里插入图片描述
    • Kinaba索引创建
      在这里插入图片描述
    • Kinaba视图查看
      在这里插入图片描述
      在这里插入图片描述

小结

需要注意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"的索引中。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总在寒冷清秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值