文章目录
缘起
目前大部分公司都是分布式服务,对于生产日志的分析需要构建一个日志收集系统便于开发和运维去分析和监控生产问题。本篇博文采用filebeat+kafka+logstash+elasticsearch+kibana 来构架一个分布式日志收集系统。
本次实践基于 filebeat :6.0.1 logstash: 6.0.1 elasticsearch 6.0.1 kibana 6.0.1 kafak 2.11 所在的日志收集架构,因版本不同配置变动过大 此处建议读者使用笔者该版本搭建。
架构
框架架构
- Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读)
- Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据
- Logstash是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景
- ElasticSearch它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口
- Kibana是ElasticSearch的用户界面
在实际应用场景下,为了满足大数据实时检索的场景,利用Filebeat去监控日志文件,将Kafka作为Filebeat的输出端,Kafka实时接收到Filebeat后以Logstash作为输出端输出,到Logstash的数据也许还不是我们想要的格式化或者特定业务的数据,这时可以通过Logstash的一些过了插件对数据进行过滤最后达到想要的数据格式以ElasticSearch作为输出端输出,数据到ElasticSearch就可以进行丰富的分布式检索了。
1 项目创建
本文使用logback作为日志输出框架,采用springBoot架构,springBoot项目很简单,这里只贴出logback日志配置(配置中的分级和每行日志格式对于后面日志采集和kafka分发很重要)
1.1 logback配置
此处不使用默认logback.xml 自动引入(自动引入没有感觉配置怎么起作用)设置名字为logback-spring.xml手动配置到springboot项目中
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!--属性变量 下面直接使用 后面可以通过${app.name}使用 -->
<property name="LOG_PATH" value="logs" />
<property name="FILE_NAME" value="collector" />
<property name="PATTERN_LAYOUT" value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}] [%level{length=5}] [%thread] [%logger] [%hostName] [%ip] [%applicationName] [%F,%L,%C,%M] %m ## '%ex'%n" />
<!-- 彩色日志 -->
<!-- 配置自定义获取的日志格式参数 比如如下的ip、主机名 应用名 -->
<!--<conversionRule conversionWord="tid" converterClass="com.xiu.distributed.logcollection.config.LogBackIpConfig" />-->
<conversionRule conversionWord="ip" converterClass="com.xiu.distributed.logcollection.config.LogBackIpConfig" />
<conversionRule conversionWord="hostName" converterClass="com.xiu.distributed.logcollection.config.LogBackHostNameConfig" />
<conversionRule conversionWord="applicationName" converterClass="com.xiu.distributed.logcollection.config.LogBackAppNameConfig" />
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-->
<!--这里定义了DEBUG,也就是控制台不会输出比ERROR级别小的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<!--定义控制台输出格式-->
<Pattern>${PATTERN_LAYOUT}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${PATTERN_LAYOUT}</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${LOG_PATH}/log_debug_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class=