ELK的搭建和使用

135 阅读3分钟

ELK 的搭建和使用

ELK 介绍

ELK 是什么

E:elasticsearch

L:Logstach

K: Kibana

ELK 能帮我们做些什么

  • 将程序的运行日志输出到 Logstach 中,Logstach 输出至 ES,随后在 Kibana 中检索日志
  • 查看程序在某个时间段运行日志
  • 分析日志,判断程序运行状态

ELK 主要运用于一些长久化的平台, 因为程序 持续集成,持续部署 查看运行日志较为繁琐。 运用 ELK 能更方便的定位程序在运行过程中 程序所打印的日志,在 Kibana 中 可直接搜索某一日志关键词 如:用户id:1221221,或是模糊查询:29900*。

搭建

本文采用docker-compose 搭建 ELK 日志可视化

搭建之前需要有docker 和 docker-compose 的环境

开始搭建

docker-compose

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.8.0
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "ELASTIC_USERNAME=aodi"
      - "ELASTIC_PASSWORD=aodi206"
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms1G -Xmx1G" #设置使用jvm内存大
      - "xpack.security.transport.ssl.enabled=true"
      - "xpack.security.enabled=true" # start es password
      - TZ=Asia/Shanghai
    volumes:
      - ./elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - ./elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.8.0
    container_name: kibana
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://elasticsearch:9200" #设置访问elasticsearch的地址
      - TZ=Asia/Shanghai
    volumes:
      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.8.0
    container_name: logstash
    volumes:
      - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
    environment:
      - TZ=Asia/Shanghai #环境设置时区
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    links:
      - elasticsearch:es #可以用es这个域名访问elasticsearch服务
    ports:
      - 4560:4560

kibana 配置文件

---
## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: xxxxxx

logstash 配置文件

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    user => "elastic"
    password => "xxxxxx"
    index => "ms-%{+YYYY.MM.dd}" 
  }
}

配置及其挂载完成后,docker-compose up -d 启动

image-20220829165947432

在浏览器中输入 IP + 默认端口 5601,访问kibana

注意:

在此过程中,如果你配置了账户和密码,然而在登录的时候却没有让你输入用户名和密码,要从以下方式进行排查

  • 检查 docker 挂载目录是否具有可读可写权限
  • 检查 elasticsearch 是否启动成功
  • 检查 elasticsearch、logstash 端口是否放开

如果以上都正常,那暂时就只有一个办法了。

  • 进入 elasticsearch 容器内 ,docker exec -it 容器名称 /bin/bash
  • 进入 bin 目录,找到 elasticsearch-setup-passwords
  • ./elasticsearch-setup-passwords 执行命令,按照提示设置密码,建议将所有密码都设为同一密码
  • 设置完毕后重启 elasticsearch

配置 Java 程序输出

使用 logback 输出日志 至 logstash

所需 maven 坐标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-core</artifactId>
</dependency>

<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-access</artifactId>
</dependency>

<dependency>
     <groupId>net.logstash.logback</groupId>
     <artifactId>logstash-logback-encoder</artifactId>
     <version>6.4</version>
</dependency>

logback 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty name="springApplicationName" source="spring.application.name" defaultValue="aodi"/>
    <springProperty name="FILENAME" source="management.endpoint.logfile.external-file" defaultValue="/tmp/iot/info.log"/>
    <springProperty name="LOGSTASHHOST" source="management.endpoint.logstash-host" defaultValue="IP地址"/>
    <springProperty name="FILEMAXHISTORY" source="logging.file.max-history" defaultValue="7"/>
    <springProperty name="PATTERNFILE" source="logging.pattern.file" defaultValue="%-12(%d{HH:mm:ss}) %c{0}[%L] %msg%n"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${PATTERNFILE}</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${FILENAME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILENAME}.%d{yyyy-MM-dd}</fileNamePattern>
            <MaxHistory>${FILEMAXHISTORY}</MaxHistory>
        </rollingPolicy>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${PATTERNFILE}</pattern>
        </layout>
    </appender>

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${LOGSTASHHOST}:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <includeContext>false</includeContext>
            <customFields>{"appname": "${springApplicationName}"}</customFields>
        </encoder>
    </appender>

    <!-- 本地环境 -->
    <springProfile name="local">
        <logger name="com.aodi" level="debug" />
        <logger name="org.springframework.cloud.netflix.zuul" level="debug" />
        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug" />

        <root level="info">
            <root level="info">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="FILE" />
                <appender-ref ref="LOGSTASH" />
            </root>
        </root>
    </springProfile>

    <!-- 开发测试环境 -->
    <springProfile name="dev">

        <logger name="com.aodi" level="debug" />
        <logger name="org.springframework.cloud.netflix.zuul" level="debug" />
        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug" />

        <root level="info">
<!--            <appender-ref ref="LOGSTASH" />-->
<!--            <appender-ref ref="CONSOLE" />-->
<!--            <appender-ref ref="FILE" />-->
            
        </root>

    </springProfile>

    <!-- 生产环境 -->
    <springProfile name="prod">

        <logger name="com.aodi" level="info" />

        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE" />
            <appender-ref ref="LOGSTASH" />
        </root>
    </springProfile>
</configuration>

使用

启动服务,将日志输出到 logback 中,登录 kibana

image-20220829181623808

随后创建索引 一定要在有日志的情况下才能创建索引,在 discover 页面中,选择上方 open 打开 Manage searches

image-20220829222624594

按需创建自己的索引,根据数据创建

image-20220829222724985

随后切换到,discover 就可以选择索引搜索了

在左侧菜单的 management中可选择, Dev Tools 这个菜单可使用 KQL 进行搜索

image-20220829223154393

那么好,本期就到这里,真的不是我水文章哦,有不懂的地方,欢迎给我留言。写的不好的地方欢迎批评指正