云计算-前后端对接elk举例

时间:2024-01-21 11:16:54

总结自己在配合研发,对接前后端的ELK日志配置举例

ELK介绍

日志系统ELK(ElasticSearch、Logstash、Kibana)搭建的,其架构是Filebeat收集日志传输到Logstash,Logstash解析日志然后将日志存储到Elasticsearch中,最后通过Kibana查询展示日志

ES(nosql非关数据库):存储功能和索引

Logstash(收集日志):到应用服务器上拿取log,并进行格式转换后输出到es中

通过input功能来收集/采集log

filter过滤器:格式化数据

output输出:日志输出到es数据库内

Kibana(展示工具):将es内的数据在浏览器展示出来,通过UI界面展示(可以根据自己的需求对日志进行处理,方便查阅读取)

1、ElasticSearch:是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在是使用最广的开源搜索引擎之一。

2、Logstash: 简单来说就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端,与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供了很多功能强大的滤网以满足你的各种应用场景。

3、Kibana: 是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图标、表格、地图等,kibana能够很轻易的展示高级数据分析与可视化。

springboot配置ELK

pom.xml依赖

要想将logback与Logstash整合,必须引入logstash-logback-encoder包。

<!-- logback 推送日志文件到logstash -->        
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.0</version>
</dependency>

在resources下新建logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <springProperty scope="context" name="application" source="spring.application.name"/>
   <springProperty scope="context" name="host" source="logstash.host"/>
   <springProperty scope="context" name="port" source="logstash.port"/>
   <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
      <destination>${host}:${port}</destination>
      <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
         <providers>
            <pattern>
               <pattern>
                  <!--输出日志可自定义,可根据自己需要配置-->
                  {
                  <!--es索引名称 -->
                  "indexname":"${application}",
                  <!--应用名称 -->
                  "appname":"${application}",
                  <!--打印时间 -->
                  "timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                  <!--线程名称 -->
                  "thread": "%thread",
                  <!--日志级别 -->
                  "level": "%level",
                  <!--日志名称 -->
                  "logger_name": "%logger",
                  "traceId": "%X{traceId}",
                  <!--日志信息 -->
                  "message": "%msg",
                  <!--日志堆栈 -->
                  "stack_trace": "%exception"
                  }
               </pattern>
            </pattern>
         </providers>
      </encoder>
   </appender>
   <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
         <level>INFO</level>
      </filter>
      <encoder>
         <pattern>%date [%thread]-[%X{traceId}] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
         <charset>UTF-8</charset>
      </encoder>
   </appender>
   <root level="info">
      <appender-ref ref="LOGSTASH"/>
      <appender-ref ref="CONSOLE"/>
      <!--<appender-ref ref="FILE_INFO"/>-->
      <!--<appender-ref ref="FILE_ERROR"/>-->
   </root>
</configuration>

application.yml文件添加配置

#logback对接logstash的日志配置文件
logstash:
  host: 10.136.0.51
  port: 5000

vue挂载nginx日志

前端挂载日志举例

dockerfile

测试环境


# fielbeat收集日志
VOLUME ["/var/log/nginx"]
WORKDIR  /app
ADD https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-linux-x86_64.tar.gz /app

RUN tar -zxvf filebeat-7.15.1-linux-x86_64.tar.gz
RUN rm -rf filebeat-7.15.1-linux-x86_64.tar.gz
COPY filebeat_test.yml /app/filebeat-7.15.1-linux-x86_64
COPY run.sh /app/filebeat-7.15.1-linux-x86_64
WORKDIR  /app/filebeat-7.15.1-linux-x86_64
RUN mv filebeat_test.yml filebeat.yml
RUN chmod -R 777 /app/filebeat-7.15.1-linux-x86_64/run.sh

# 同时运行nginx和filebeat服务
ENTRYPOINT  ["/app/filebeat-7.15.1-linux-x86_64/run.sh"]
生产环境

# fielbeat收集日志
VOLUME ["/var/log/nginx"]
WORKDIR  /app
ADD https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-linux-x86_64.tar.gz /app

RUN tar -zxvf filebeat-7.15.1-linux-x86_64.tar.gz
RUN rm -rf filebeat-7.15.1-linux-x86_64.tar.gz
COPY filebeat_prod.yml /app/filebeat-7.15.1-linux-x86_64
COPY run.sh /app/filebeat-7.15.1-linux-x86_64
WORKDIR  /app/filebeat-7.15.1-linux-x86_64
RUN mv filebeat_prod.yml filebeat.yml
RUN chmod -R 777 /app/filebeat-7.15.1-linux-x86_64/run.sh

# 同时运行nginx和filebeat服务
ENTRYPOINT  ["/app/filebeat-7.15.1-linux-x86_64/run.sh"]

配置参考


FROM swr.cn-north-1.myhuaweicloud.com/iss-tpb-dev-zrpiao/nginx:latest



ENV LANG C.UTF-8
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN mkdir -p /app && mkdir -p /config && chmod -R 777 /app

EXPOSE 8090

#将当前文件夹的dist文件复制到容器的/usr/share/nginx/html目录
COPY ./dist /app/dist
COPY nginx.conf /etc/nginx/nginx.conf
COPY ./test /app/dist

# fielbeat收集日志 开始
VOLUME ["/var/log/nginx"]
WORKDIR  /app
ADD https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-linux-x86_64.tar.gz /app

RUN tar -zxvf filebeat-7.15.1-linux-x86_64.tar.gz
RUN rm -rf filebeat-7.15.1-linux-x86_64.tar.gz
COPY filebeat_test.yml /app/filebeat-7.15.1-linux-x86_64
COPY run.sh /app/filebeat-7.15.1-linux-x86_64
WORKDIR  /app/filebeat-7.15.1-linux-x86_64
RUN mv filebeat_test.yml filebeat.yml
RUN chmod -R 777 /app/filebeat-7.15.1-linux-x86_64/run.sh

# 同时运行nginx和filebeat服务
ENTRYPOINT  ["/app/filebeat-7.15.1-linux-x86_64/run.sh"]

filebeat.yml

测试配置

索引名称修改为具体项目,例如iam-portal-iam-portal-%{+yyyy.MM.dd} 或者archives-portal-iam-portal-%{+yyyy.MM.dd}

filebeat.inputs:
  - type: log
    paths:
      - /var/log/nginx/access.log

setup.ilm.enabled: false
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"

output.elasticsearch:
  hosts: ["10.136.0.51:9200"]
  username: "elastic"
  password: "123456"
  index: "iam-portal-%{+yyyy.MM.dd}" #索引名称
测试配置

索引文件要修改为具体项目,例如iam-portal-iam-portal-%{+yyyy.MM.dd} 或者archives-portal-iam-portal-%{+yyyy.MM.dd}

filebeat.inputs:
  - type: log
    paths:
      - /var/log/nginx/access.log

setup.ilm.enabled: false
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"

output.elasticsearch:
  hosts: ["10.136.1.181:9200"]
  username: "elastic"
  password: "123456"
  index: "iam-portal-%{+yyyy.MM.dd}" #索引名称

启动脚本

run.sh

#!/bin/bash
set -m
nginx -g "daemon off;" &
./filebeat -e -c /app/filebeat-7.15.1-linux-x86_64/filebeat.yml
fg %1

Kibana新建索引

ES可以作为日志系统,要比专门去找对应的日志存档效率要高,直接通过搜索KQL或者Lucene(这里指的是Lucene的语法,实际上直接搜索关键词就可以了)。

但是我们在Kinaba上看到的索引(你也可以理解每一份对应的日志)上没有你想要的,你该如何去建立索引去查找日志,具体操作过程如下:

这里假设你的数据都已经添加进去或者是自动收集的,你要做的就是创建一个索引对应起来,能在discover里面能看到就可以。

只有当你的日志记录已经通过logstash存储在ElasticSearch中时,你在kibana中添加索引才能看到具体的日志记录

添加索引

云计算-前后端对接elk举例_nginx

创建索引模式

云计算-前后端对接elk举例_nginx_02

根据源创建索引

云计算-前后端对接elk举例_spring_03

查询

云计算-前后端对接elk举例_spring_04