第10章 日志管理

概述

日志管理:

作用:

  • 在项目上线后,定位系统故障点。
  • 监控程序性能,识别性能瓶颈和资源消耗异常。
  • 在项目开发中,有助于调试代码和定位Bug。

在Linux中查看日志

当前生成的日志文件说明:

  • 目前有三类文件,分别是sys-error.log、sys-info.log、sys-user.log文件
  • 文件中不带日期记录的当天的日志
  • sys-info.log记录的是系统日志,包含了运行日志和错误日志(较全)
  • sys-error.log记录的是错误日志,排查错误一般看这个文件
  • sys-user.log记录的是用户登录相关的日志数据

作为程序员要具备查看日志的能力,当发生错误之后,咱们可以通过查看日志中的错误来解决问题。

目前咱们的线上服务都是使用docker启动容器来部署,咱们主要讲解docker结合linux的命令来方便查找错误

docker logs 命令

  • 基本用法:docker logs [OPTIONS] <mycontainer>,其中CONTAINER是容器的名称或ID,OPTIONS是可选参数。
  • 实时查看日志:使用-f--follow参数,可以实时跟踪容器的日志输出。

​ 例如,docker logs -f <mycontainer>

  • 查看日志尾部内容:使用--tail参数,可以仅显示日志的最后几行。
    • 例如,docker logs --tail=100 mycontainer

进入容器内部查看(普通的linux命令来查看日志)

如果容器的日志被写入到文件系统中,可以通过docker exec命令进入容器内部查看日志文件。

  • 进入容器:docker exec -it <mycontainer> /bin/bash(或/bin/sh,取决于容器内的shell)。
  • 查看日志的所有内容:(cat | more | less) sys-info.2024-08-01.log
  • 实时监控日志的变化
    • 实时监控日志变化:tail -f sys-info.log
    • 实时监控日志部100行日志:tail -n 100 f sys-info.log (常用)
    • 实时监控日志部100行日志:head -n 100 f sys-info.log
  • 按照关键字找日志的信息
    • 查询日志文件中包含exception的日志: cat -n <mylogfile> | grep -i -A5 -B5 'exception'(常用)

ELK日志管理

ELK简介

ELK是一个开源的日志管理平台,专为收集、处理、存储和分析日志数据而设计。它由三个核心组件组成:

  • Elasticsearch:基于Lucene的搜索引擎,用于高效地存储和搜索大规模的日志数据。
  • Logstash:一个强大的日志收集和处理工具,能够从各种来源中提取数据,并进行转换和增强。
  • Kibana:提供了一个直观的Web界面,用于可视化和探索存储在Elasticsearch中的日志数据。

这三个组件共同协作,形成了一套完整的解决方案,使得日志管理和分析变得更加简单和高效。

获取ELK服务步骤

1)启动服务:在已安装了ELK的虚拟机环境中,使用以下命令启动各个组件:

docker start es  # 启动Elasticsearch
docker start kibana  # 启动Kibana
docker start logstash  # 启动Logstash

注意:由于这些服务占用内存较大,在开发阶段不使用时可以关闭它们以节省资源。

2)配置logback.xml:对于zzyl-admin模块,需要引入logstash-logback-encoder依赖,并创建logback-logstash.xml文件来配置日志输出格式及目的地等信息。

2.1)引入logstash-logback-encoder依赖

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

2.2)创建logback-logstash.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
    <property name="log.path" value="/home/ruoyi/logs" />
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
       <encoder>
          <pattern>${log.pattern}</pattern>
       </encoder>
    </appender>

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--logstash的服务地址和端口,可以实际情况设置-->
        <destination>192.168.100.168:5044</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        <!--应用名称 -->
                        "app": "ruoyi-admin",
                        <!--打印时间 -->
                        "timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                        <!--线程名称 -->
                        "thread": "%thread",
                        <!--日志级别 -->
                        "level": "%level",
                        <!--日志名称 -->
                        "logger_name": "%logger",
                        <!--日志信息 -->
                        "message": "%msg",
                        <!--日志堆栈 -->
                        "stack_trace": "%exception"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
          <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
          <!-- 日志最大的历史 60天 -->
          <maxHistory>60</maxHistory>
       </rollingPolicy>
       <encoder>
          <pattern>${log.pattern}</pattern>
       </encoder>
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>DEBUG</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
          <!-- 日志最大的历史 60天 -->
          <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
          <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
          <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 用户访问日志输出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    
    <!-- 系统模块日志级别控制  -->
    <logger name="com.ruoyi" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />

    <root level="info">
       <appender-ref ref="console" />
    </root>
    
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="logstash" />
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
    
    <!--系统用户操作日志-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
</configuration> 

3)修改应用配置:在生产环境下的application-prod.yml文件中指定新的日志配置文件路径,以便集成Logstash,方便监控日志。

内容如下:

logging:
  config: classpath:logback-logstash.xml
  level:
    com.zzyl: debug
    org.springframework: warn

使用ELK检索日志的步骤

  1. 查看索引文件:项目运行后会产生日志数据,通过访问http://192.168.100.168:5601/进入Kibana,导航至“Stack Management” -> “索引管理”,查看按日期区分的日志索引文件。
  2. 添加索引模式:为了更方便地浏览日志数据,在Kibana中创建一个新的索引模式,并选择时间戳字段作为时间段。
  3. 检索日志
    • 打开Kibana的Discover功能。
    • 根据不同的索引或字段进行精确检索,或者直接在搜索框输入内容进行模糊查询。
    • 可以利用通配符(*)、特定时间范围(@timestamp)以及字段名(message)等方式来细化搜索条件,从而找到所需的日志条目。

通过上述步骤,用户可以有效地利用ELK系统对日志进行高效的收集、分析与管理。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐