- 😜作 者:是江迪呀
- ✒️本文关键词:
elasticsearch
、kibana
、logstash
、日志收集
、日志可视化
- ☀️每日 一言:
坚持就是胜利啊,哥~
一、前言
面试官:在日常开发工作中你们是如何查看日志的呢?
我:通过控制台查看!
面试官:……
上面显然是个滑稽的回答,那么真正的开发中你们使用什么样的方式来查看日志呢?我先说下我的吧,我是用过最原始的也是最麻烦的方式:将日志从服务器下载下来,然后将日志文件放到记事本中使用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
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,安装命令如下:
sudo apt-get update
sudo apt-get install lrzsz
输入rz
即可上传文件。
rz
3.2 解压
tar -zxvf logstash-8.9.1-linux-x86_64.tar.gz
3.3 配置logstash
进入加压后的config
目录
cd logstash-8.9.1/bin
创建配置文件(你还可以使用Logstash
自带的logstash-sample.conf
文件但是建议自己创建一个):
touch logstash.conf
进入配置文件:
vim logstash.conf
添加的内容如下:
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
目录
cd logstash-8.9.1/bin
启动并指定配置文件
./logstash -f ../config/logstash.conf
四、项目配置
你的项目需要配置下,要保证你项目日志输出的路径和Logstash
收集日志的路径保持一致!
4.1 在项目根目录创建logback-spring.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