项目一系列-第10章 日志管理
本文介绍了日志管理的重要性和具体操作方法。日志管理在系统运维中具有定位故障、监控性能、调试代码等关键作用。在Linux环境下,可以通过docker logs命令查看容器日志,或使用exec进入容器内部查看日志文件,常用tail、grep等命令实时监控和搜索日志内容。此外,还介绍了ELK(Elasticsearch、Logstash、Kibana)日志管理平台的使用方法,包括服务启动、日志收集配置等
第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'
(常用)
- 查询日志文件中包含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检索日志的步骤
- 查看索引文件:项目运行后会产生日志数据,通过访问
http://192.168.100.168:5601/
进入Kibana,导航至“Stack Management” -> “索引管理”,查看按日期区分的日志索引文件。 - 添加索引模式:为了更方便地浏览日志数据,在Kibana中创建一个新的索引模式,并选择时间戳字段作为时间段。
- 检索日志:
- 打开Kibana的Discover功能。
- 根据不同的索引或字段进行精确检索,或者直接在搜索框输入内容进行模糊查询。
- 可以利用通配符(*)、特定时间范围(@timestamp)以及字段名(message)等方式来细化搜索条件,从而找到所需的日志条目。
通过上述步骤,用户可以有效地利用ELK系统对日志进行高效的收集、分析与管理。
更多推荐
所有评论(0)