ELK + Kibana + Logstash实现可视化日志

  • 😜 是江迪呀
  • ✒️本文关键词elasticsearchkibanalogstash日志收集日志可视化
  • ☀️每日 一言坚持就是胜利啊,哥~

一、前言

面试官:在日常开发工作中你们是如何查看日志的呢?

我:通过控制台查看!

面试官:......

上面显然是个滑稽的回答,那么真正的开发中你们使用什么样的方式来查看日志呢?我先说下我的吧,我是用过最原始的也是最麻烦的方式:将日志从服务器下载下来,然后将日志文件放到记事本中使用crtl + F搜索我想要的日志文件。这种方式让我记忆犹新,因为太过于繁琐了,查询效率太低。当然我也使用过很方便的:通过kibana 查询日志,这种方式也让我难忘,因为它太好用了,效率太高。今天我们就介绍下,如何使用 ELK + Logstash实现日志可视化

二、ELK、Kibana、Logstash之间的关系

有些时候一张图胜过千言万语:

还是要说明下,有的同学可能晕图,再说我画的也不一定到位(其实是了凑篇幅)。

2.1 Logstash

Logstash是一个用于处理和管理日志数据的开源工具,它可以帮助你从不同的数据源(如日志文件、数据库、消息队列等)中采集、转换和传输数据,并将其存储到目标位置(如 Elasticsearch数据库文件等)中。

2.2 Elaticsearch

Elasticsearch是一个开源的分布式搜索和分析引擎,主要用于处理和存储大规模的实时数据。可以提供全文搜索实时数据分析数据聚合和可视化功能。

2.3 Kibana

Kibana 是一个开源的数据可视化工具,专为 Elasticsearch 设计,用于展示 Elasticsearch 中的数据和分析结果。它提供了一个用户友好的 Web 界面,使用户能够轻松地创建、定制和共享各种类型的图表、图形和仪表盘,以便更好地理解和分析存储在 Elasticsearch 中的数据。

三、Logstash的安装

我们选择在Linux上面安装Logstash,安装步骤如下:

3.1 下载 Logstash

rust 复制代码
curl -O https://artifacts.elastic.co/downloads/logstash/logstash-7.10.1.tar.gz

如果上面的方式不可行,你可以直接去官方下载:Logstash-8.9.1下载

如果你的网不行,你可以直接通过网盘:Logstash-8.9.1网盘下载

提取码:bj57

3.2 上传Logstash到服务器

你可以通过xftp,如果没有的话,你可以使用rz命令,在使用这个命令之前你必须确保linux已经安装了lrzsz,安装命令如下:

rust 复制代码
sudo apt-get update
sudo apt-get install lrzsz

输入rz即可上传文件。

rust 复制代码
rz

3.2 解压

rust 复制代码
tar -zxvf logstash-8.9.1-linux-x86_64.tar.gz

3.3 配置logstash

进入加压后的config目录

rust 复制代码
cd logstash-8.9.1/bin

创建配置文件(你还可以使用Logstash自带的logstash-sample.conf文件但是建议自己创建一个):

yaml 复制代码
touch logstash.conf

进入配置文件:

yaml 复制代码
vim logstash.conf

添加的内容如下:

yaml 复制代码
input {
  #日志打印的地址,path地址就是你在项目中指定日志输出的目录。
  file{
     path=>"/usr/project-prod/logs/*.log"
     start_position=>"beginning"
  }
}
#过滤 不重要不用写
filter {

}
#日志输出到elasticsearch 
output {
    elasticsearch {
      hosts => ["服务器地址:elasticsearch的端口号"]
      #这是输出的数据在 Elasticsearch 中的索引名称。logs-%{+YYYY.MM.dd} 是一个动态的索引名称,其中 %{+YYYY.MM.dd} 是 Logstash 的时间戳格式化指令,用来在索引名称中添加当前日期,比如 "logs-2023.07.25"。
      index => "logs-%{+YYYY.MM.dd}"
    }
}

3.4 启动Logstash

进入bin目录

yaml 复制代码
cd logstash-8.9.1/bin

启动并指定配置文件

yaml 复制代码
./logstash -f ../config/logstash.conf

四、项目配置

你的项目需要配置下,要保证你项目日志输出的路径和Logstash收集日志的路径保持一致!

4.1 在项目根目录创建logback-spring.xml文件

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>

    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使"${}"来使用变量。 -->
    <property name="log.path" value="/usr/project-prod/logs/xxx-logs"/>

    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!--1. 输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--2. 输出到文档-->
    <!-- level为 DEBUG 日志,时间滚动输出  -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/xxx.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- level为 INFO 日志,时间滚动输出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/info.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/error.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--开发分支-->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="DEBUG_FILE"/>
            <appender-ref ref="INFO_FILE"/>
        </root>
    </springProfile>、
    <!--测试分支-->
    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="DEBUG_FILE"/>
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>
    <!--生产分支-->
    <springProfile name="prod">
        <root level="DEBUG">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="DEBUG_FILE"/>
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>
</configuration>

这个xml文件就是记录日志的一些规则,你不需要细看,只需要注意:
<property name="log.path" value="/usr/project-prod/logs/xxx-logs"/>

这个配置就是指定日志输出的路径的,按照自己的修改下即可。日志输出级别,以及不同的环境如何输出日志,自定义一下即可。

五、ELK + Kibana安装配置

全在这里了:在Linux环境下配置lasticsearch+Kibana

相关推荐
Elastic 中国社区官方博客1 小时前
为 Elastic Cloud Serverless 和 Elasticsearch 引入统一的 API 密钥
大数据·运维·elasticsearch·搜索引擎·云原生·serverless
vastsmile3 小时前
(R)26.04.23 hermes agent执行本地命令超级慢的原因
开发语言·elasticsearch·r语言
m0_737539377 小时前
ELK企业日志分析系统
elk
OtIo TALL8 小时前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
LSL666_10 小时前
快速Spring Cloud+ELK+AOP搭建一个简单的项目
spring·elk·spring cloud
Elastic 中国社区官方博客12 小时前
Jina embeddings v3 现已在 Gemini Enterprise Agent Platform Model Garden 上可用
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·jina
前端若水13 小时前
Git 撤销与恢复完全指南(超级详细版)
大数据·git·elasticsearch
tonydf13 小时前
日志模块该如何设计
后端·elasticsearch
前端若水13 小时前
Git 可以做的所有操作(完整分类)
大数据·git·elasticsearch
Elasticsearch13 小时前
我们如何构建 Elasticsearch simdvec,使向量搜索成为世界上最快之一
elasticsearch