基于docker 进行安装ELK 进行日志分析

ELK基本知识点
ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。后文的四种基本架构中将逐一介绍应用到的其它套件。

♦ Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
♦ Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
♦ Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
♦ Filebeat隶属于Beats。目前Beats包含四种工具:
    • Packetbeat(搜集网络流量数据);
    • Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);
    • Filebeat(搜集文件数据);
    • Winlogbeat(搜集 Windows 事件日志数据);

首先保证docker可以正常使用哟
注意kibana,logstash,elasticsearch 版本保持一致

特别注意:这里面在内网服务器搭建时候突然发现这个问题,补充一下:

就是kibana按照下面的进行安装发现页面打不开 可能就是elasticsearch.hosts: [ "http://ip:9200" ] 这个地方ip错误了 可以运行下面的这个话来看一下elasticsearch的ip。特别注意这里面的elasticsearch 名字是根据你docker 启动elasticsearch 设置的name的名字哦
docker inspect elasticsearch | grep IPAddress

下面是最简单的ELK 架构进行的部署

ELK 架构
第一种ELK架构,是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。建议供学习者和小规模集群使用。此架构首先由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web Portal方便的对日志查询,并根据数据生成报表。
参考链接:https://www.jianshu.com/p/c66c9b5b4ec2

一.docker部署elasticsearch

1. 从docker hub中拉取官方镜像

# 此处使用的elasticsearch版本为7.6.0,后续的kibana和logstash也会使用该版本
docker pull elasticsearch:7.6.0

2.为elasticsearch创建网络(创建的目的是kibana,logstash后续都会用到此网络)

# 启动镜像的时候指定网段,再该网段下的容器能够通过容器名称进行互通
docker network create elastic

3.启动镜像

docker run -d \
--name elasticsearch \
--network elastic \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
elasticsearch:7.6.0

4.验证启动状态,若出现如下的返回信息,则说明elasticsearch已经部署ok
命令行验证:curl ip:端口号
在这里插入图片描述
5.进入elasticsearch 容器
docker exec -it elasticsearch /bin/bash
6.修改elasticsearch.yml
vi /usr/share/elasticsearch/config/elasticsearch.yml
7.内容如下:

cluster.name: elasticsearch
network.host: 0.0.0.0
http.port: 9200

在这里插入图片描述
8.重新docker restart elasticsearch 完成了

二.docker部署kibana
1. 从docker hub中拉取官方镜像

# 该命令可执行也可不执行,docker run的时候若没有镜像会自动pull镜像
docker pull kibana:7.6.0

2.创建网络

# 如果已经创建了网络,则省略该步骤
docker network create elastic

3.启动容器

# 以配置文件的方式启动

# 1.创建目录
sudo mkdir -p /docker/kibana/config/

# 2.添加配置文件(第二点直接复制执行)
sudo tee /docker/kibana/config/kibana.yml <<-'EOF'
server.name: kibana
server.host: "0"
# elasticsearch的服务器地址, elasticsearch表示容器名
elasticsearch.hosts: [ "http://ip:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
# 汉化操作界面
i18n.locale: zh-CN
EOF

# 3.启动kibana
docker run -d \
--name kibana \
--network elastic \
--privileged=true \
-v /docker/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
-p:5601:5601 \
kibana:7.6.0

访问kibana界面: http://服务器地址:5601

三.docker部署logstash
1. 从docker hub中拉取官方镜像

# 该命令可执行也可不执行,docker run的时候若没有镜像会自动pull镜像
docker pull logstash:7.6.0

2.创建网络

# 如果已经创建了网络,则省略该步骤
docker network create elastic

3.启动容器

# 1.创建存放配置文件的文件夹
 sudo mkdir -p /docker/logstash/config/

# 2.创建配置文件(复制以下全部内容至命令行中)
sudo tee /docker/logstash/config/logstash.yml <<-'EOF'
# 输入端
input {
  #输入logstash时控制台打印  
  stdin { } 
  #为logstash增加tcp输入口,方便springboot接入
  #5044端口预留给filebeat输入logstah,此处开放5043端口,程序直接输入logstash
  tcp {
      mode => "server"
      host => "0.0.0.0"
      #从5043端口取日志
      port => 5043
      #需要安装logstash-codec-json_lines插件
      codec => json_lines
  }
}

#输出端
output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    #hosts中的地址应该写同一network下的容器名称
    hosts => ["http://ip:9200"]
    # 输出至elasticsearch中的自定义index名称
    index => "flow-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}
EOF

# 3.启动容器
docker run -d --name logstash \
-p 5043:5043 -p 5044:5044 \
--network elastic \
--privileged=true \
-v /docker/logstash/config/:/usr/share/logstash/pipeline/ \
logstash:7.6.0

# 4.待容器启动完成,进入容器中
docker exec -it logstash /bin/bash

# 5.为logstash安装json_lines插件
/usr/share/logstash/bin/logstash-plugin install logstash-codec-json_lines

# 6. 成功安装插件之后,退出容器
exit

# 7.重启容器
docker restart logstash

至此部署上已经全部完成了

springboot整合elk

1.springboot项目首先整合logback日志是正确的
2.引入依赖

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

3.日志配置文件 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 应用名称-->
    <property name="appName" value="geom-service"/>
    <!-- 日志的存放目录-->
    <!-- debug-->
    <property name="DEBUG_LOG_FILE_NAME_PATTERN" value="logs/${appName}-debug.%d{yyyy-MM-dd}.%i.log"/>
    <property name="INFO_LOG_FILE_NAME_PATTERN" value="logs/${appName}-info.%d{yyyy-MM-dd}.%i.log"/>
    <property name="WARN_LOG_FILE_NAME_PATTERN" value="logs/${appName}-warn.%d{yyyy-MM-dd}.%i.log"/>
    <property name="ERROR_LOG_FILE_NAME_PATTERN" value="logs/${appName}-error.%d{yyyy-MM-dd}.%i.log"/>
    <!-- 日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%c){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <property name="FILE_LOG_PATTERN"
              value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %c : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--输出到DEBUG文件-->
    <appender name="debug_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${DEBUG_LOG_FILE_NAME_PATTERN}</fileNamePattern>
            <!-- 日志保留天数 -->
            <maxHistory>30</maxHistory>
            <!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
            <totalSizeCap>100MB</totalSizeCap>
            <!-- 每个日志文件的最大值 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 此日志文件只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--输出到INFO文件-->
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${INFO_LOG_FILE_NAME_PATTERN}</fileNamePattern>
            <!-- 日志保留天数 -->
            <maxHistory>30</maxHistory>
            <!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
            <totalSizeCap>100MB</totalSizeCap>
            <!-- 每个日志文件的最大值 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--输出到WARN文件-->
    <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${WARN_LOG_FILE_NAME_PATTERN}</fileNamePattern>
            <!-- 日志保留天数 -->
            <maxHistory>30</maxHistory>
            <!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
            <totalSizeCap>100MB</totalSizeCap>
            <!-- 每个日志文件的最大值 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--输出到ERROR文件-->
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ERROR_LOG_FILE_NAME_PATTERN}</fileNamePattern>
            <!-- 日志保留天数 -->
            <maxHistory>30</maxHistory>
            <!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
            <totalSizeCap>100MB</totalSizeCap>
            <!-- 每个日志文件的最大值 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- 此日志文件只记录error级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- region 根据不同的环境设置不同的日志输出级别 -->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="console"/>
        </root>
    </springProfile>

    <springProfile name="prod,test">
        <root level="info">
            <appender-ref ref="debug_file"/>
            <appender-ref ref="info_file"/>
            <appender-ref ref="warn_file"/>
            <appender-ref ref="error_file"/>
        </root>
    </springProfile>
    <!--获取springboot的yml配置信息-->
    <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
    <!--  日志发送至logstash  -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- logstash的服务器地址和通信端口 -->
        <destination>110.40.139.31:5043</destination>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- 在elasticsearch的index中追加applicationName字段  -->
            <customFields>{"applicationName":"${applicationName}"}</customFields>
        </encoder>
    </appender>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="logstash"/>
        <appender-ref ref="console"/>
    </root>
</configuration>

如上 应用名称/日志输出级别/获取springboot的yml配置信息/日志发送至logstash 重要 如下图

  <!-- 应用名称-->
    <property name="appName" value="geom-service"/>
<!--获取springboot的yml配置信息-->
    <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
    <!--  日志发送至logstash  -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- logstash的服务器地址和通信端口 -->
        <destination>110.40.139.31:5043</destination>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- 在elasticsearch的index中追加applicationName字段  -->
            <customFields>{"applicationName":"${applicationName}"}</customFields>
        </encoder>
    </appender>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="logstash"/>
        <appender-ref ref="console"/>
    </root>

applicationName 这个就很好 可以很好解决在微服务这块区分各服务部分筛选

4.配置一下kibana的索引模式
配置过程:

在这里插入图片描述
在这里插入图片描述
补充
安装elasticsearch head插件监控管理

docker run -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5

在浏览器中打开elasticsearch-head页面,填入ElasticSearch地址

在这里可能会出现跨域拒绝访问问题:
解决方式1:
进入elasticsearch容器内部,修改配置文件elasticsearch.yml
docker ps -a #拿到运行容器elasticsearch 的 id
docker exec -it *****(容器id) /bin/bash
cd ./config
vim elasticsearch.yml
在elasticsearch.yml中添加:
http.cors.enabled: true
http.cors.allow-origin: "
"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值