ELK+filebeat 收集和处理springboot 日志

      ELK+filebeat 收集和处理springboot 日志无评论

使用ELK来收集系统和应用的日志,逐渐成为复杂系统的标配,通过把各个系统和应用的日志进行收集和处理,从而提高系统运维的效率。但是logstash是使用ruby来写的,ruby读取文件和内存使用都非常高,现在采用beat这个轻量级的工具来采集,然后把日志通过logstash 输出给elasticsearch进行汇总和检索,最后通过kibana进行分析和展示。大致流程如下:

本文各个组件的安装如下:

  1. ELK 使用docker image;  docker pull sebp/elk:latest 这个包含了elasticsearch, logstash and kibana
  2. filebeat ,使用brew的安装方式, brew install elastic/tap/filebeat-full
  3. springboot application, 项目添加logback-spring.xml, 里边包含log文件的路径。

下边详细介绍下,具体的配置内容。

  1. ELK的环境配置

如果有了elk的docker image,直接通过docker run命令就可以创建对应的container,  需要注意的是需要把这几个端口暴露出来:

  • 9200:9200, elasticsearch的端口
  • 5044:5044,logstash接口filebeat的端口
  • 5601:5601, Kibana的UI端口

另外这个启动会比较慢,需要等一段时间,如果可以打开http://localhost:5601页面,就表示这个三个应用都启动就绪了。

2. springboot的配置

在resources目录添加logback-spring.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--该日志将日志级别不同的log信息保存到不同的文件中 -->
<configuration scan="true" scanPeriod="60 seconds">
<includeresource="org/springframework/boot/logging/logback/defaults.xml"/>
<propertyname="service_Name"value="location-service"/>
<springPropertyscope="context"name="springAppName"source="spring.application.name"/>
<!-- 控制台的日志输出样式 -->
<propertyname="CONSOLE_LOG_PATTERN"value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }) %clr(${springAppName}){magenta} %clr(---){faint} %logger %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appendername="console"class="ch.qos.logback.core.ConsoleAppender">
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!-- 日志输出编码 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成INFO日志文件 -->
<appendername="INFO_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>logs/${service_Name}-info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 单个日志文件最多100MB, 30天的日志周期,最大不能超过20GB -->
<maxFileSize>100MB</maxFileSize>
<MaxHistory>30</MaxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<!-- 日志输出编码 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成ERROR日志文件 -->
<appendername="ERROR_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>logs/${service_Name}-error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 单个日志文件最多100MB, 30天的日志周期,最大不能超过20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<!-- 日志输出编码 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 日志输出级别 -->
<rootlevel="INFO">
<appender-refref="console"/>
<appender-refref="INFO_FILE"/>
<appender-refref="ERROR_FILE"/>
</root>
</configuration>

 

获取项目的日志文件路径{springboot-info.log}

然后在代码里边添加log的输出,例如logger.info(“xxxxxxx”)

3. 配置filebeat

mac filebeat的配置目录一般在/usr/local/Cellar/etc/filebeat

里边有个filebeat.yml文件,需要修改里边output.elasticsearch的host为{your ip address}:{9200}

filebeat包含很多module可以收集各个module的日志,所以如果使用logstash来收集日志,就需要打开这个module,

filebeat modules enable logstash

通过这个命令可以把这个module启用,默认里边的module都是disable,可以使用filebeat modules list查看各个module的启用情况。

启用了logstash并不代表可以收集日志,需要修改modules/logstash.yml文件添加对应的配置,比如添加springboot的日志文件路径,var.paths: [“/xxxxxx/springboot*.log”]

然后通过命令运行filebeat setup && filebeat -e

filebeat setup 会在kibana的management > index management里边创建个filebeat的索引,如下图所示

在命令行输出中可以看到是否把logstash.yml的config的path加载进去.  log/input.go   Configured paths: [xxxxx.log]

查看是否连接上elasticsearch  pipeline/output.go  Connection to backoff(elasticsearch(http://xxxxxxxx:9200)) established

4. 如果以上配置正常的话,可以刷新springboot的日志,然后在kibana的页面看到对应logs

Kibana的management有两个索引匹配,如果使用elasticsearch的index management, 可以修改filebeat-{version}的配置,添加自己的索引条件,然后通过/app/infra#/logs页面查看结果

如果使用kibana的index pattern, 需要配置filebeat-*的索引和设置自己的显示条件。这个需要通过discover页面查看显示。

 

最后,通过以上的配置,基本可以把springboot的日志输出到ELK来分析和处理。但是ELK的强大不止在这些简单的配置,还有很多优秀的功能我们还没用到,比如如何配置自己的索引,然后过滤掉无用的信息,如何在springboot里边配置elasticsearch的直接收集方式等等。而且为了能高效的使用ELK,springboot的日志该如何规范等等都是我们需要在项目使用过程中考虑的。

 

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html

沟通交流合作请加微信!