前言
在软件项目开发中,为了便于查找问题,快速定位问题,解决问题,我们会使用日志的方式记录程序的某些执行过程或者程序执行过程中发生的错误或者异常的信息。在本文中我们以springboot应用项目为例,通过logback的方式分别实现打印控制台日志、文本日志记录和ELK方式的日志。具体的日志配置信息在我的开源项目atp应用测试平台(atp: 应用测试平台)中有详细的配置,可以供大家参考使用。本文的重点在于通过docker容器搭建一个elk单服务的日志管理平台,并通过我们的atp项目写入一些日志到elk收集系统中,实现springboot项目的日志高效收集与检索。
正文
elasticsearch安装
拉取镜像
命令:docker pull elasticsearch:7.11.1
- 启动elasticsearch
命令:docker run --name elk-elasticsearch -p 19200:9200 -p 19300:9300 -e "discovery.type=single-node" -d elasticsearch:7.11.1
- 访问elasticsearch
到这里,我们的elasticsearch就安装好了。
kibana安装
- 拉取镜像
命令:docker pull kibana:7.11.1
- 启动kibana
命令:docker run --name elk-kibana -p 15601:5601 -d kibana:7.11.1
- 修改kibana配置,连接elasticsearch服务器
- 重启kibana服务器
- 访问kibana服务
到这里,我们的kibana服务就安装好了。
logstash安装
- 拉取镜像
命令:docker pull logstash:7.11.1
- 启动logstash
命令:docker run --name elk-logstash -p 5066:5066 -d logstash:7.11.1
- 修改logstash配置,连接elasticsearch
- 修改logstash日志配置,接收springboot应用项目日志
此处hosts配置为我们elasticsearch服务的地址,index为该应用的索引配置,app为应用的名字,这里是动态赋值。
- 重启logstash服务
到这里我们单机版的elk日志收集系统就搭建完成了。
测试
- 这里我们使用一下我们前文提到的atp应用测试平台写一些日志到elk平台中,并验证平台是否可以实现应用项目的日志收集。ATP应用测试平台地址(atp: 应用测试平台),欢迎fork,欢迎下载。具体的日志文件(logback.xml)配置如下,该配置文件包含了控制台日志打印、文件日志与elk的日志。
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--设置存储路径变量--> <property name="LOG_HOME" value="atp"/> <!--控制台输出appender--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--设置输出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!--设置编码--> <charset>UTF-8</charset> </encoder> </appender> <!--文件输出,时间窗口滚动--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日志名,指定最新的文件名,其他文件名使用FileNamePattern --> <File>${LOG_HOME}/atp.log</File> <!--文件滚动模式--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩--> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}_%i.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> <!--按大小分割同一天的--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>20MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!--输出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!--设置编码--> <charset>UTF-8</charset> </encoder> </appender> <!--logstash 日志配置--> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!-- 此处配置logstash的ip和端口 --> <destination>192.168.23.134:5044</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <!-- 此处配置logstash的索引名称,在logstash.conf中配置了使用app作为索引名称的一部分 --> <customFields>{"app":"atp"}</customFields> </encoder> </appender> <!--指定基础的日志输出级别--> <root level="INFO"> <!--appender将会添加到这个loger--> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> <appender-ref ref="LOGSTASH"/> </root> </configuration>
- elk日志的集成,我们需要net.logstash.logback.appender.LogstashTcpSocketAppender收集器,所以在我们的pom文件中加入elk日志收集的依赖。
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>6.3</version> </dependency>
- 一切准备就绪,启动我们的应用,验证是否可以写入日志到elk中。
结语
好了,又到了说再见的时候了,本期的ekl单机版日志系统的搭建就到这里了,后续我还会推出集群版本的elk日志系统搭建。我们下期见。