ELK日志简化方案

背景

ELK是现在常用的日志方案,有多种组合方式:

ElasticSearch + Kibana + Logstash:由Logstash收集各终端的日志,过滤后发到送ElasticSearch,但Logstatsh比较耗资源,会影响本地应用的性能

ElasticSearch + Kibana + FileBeat:改由轻量的FileBeat收集日志,但FileBeat不支持过滤(注:新版的ignest node可以部分实现),所以又出现了下面的组合

ElasticSearch + Kibana + FileBeat + Logstash:FileBeat采集的日志统一经过Logstash处理后再到ElasticSearch

ElasticSearch + Kibana + Kafka/Redis + Logstash:这种组合也比较常见,使用Kafka/Redis的消息分发功能由Logstash统一收集消息再发到ElasticSearch

缺陷

上面的方案的主要缺陷是引入节点太多,增加了复杂性,降低了可靠性。另外Logstash的Grok配置也是需要啃一番文档的。

改进

做减法,能砍的都砍掉,尽量不要引进第三方组件,对原始代码无侵入。Logstash在里面主要是做收集和过滤,完全可以让终端直接提交Json数据代替这个处理过程。按此目标,我开发了一个Logback下的ElasticSearch Appender简化了ELK方案。任何一个Spring Boot应用只要加一个logback appender配置就能使本地日志提升为基于ElasticSearch的分布式日志系统,不需要增加第三方组件也不需要修改任何代码。

使用指南

下载

https://github.com/johnhuang-cn/logback-elasticsearch-appender,运行mvn install将其安装到本地maven库

依赖

在需要支持ElasticSearch日志的Spring Boot工程增加以下依赖

<dependency>
  <groupId>net.xdevelopgroupId>
  <artifactId>logback-elasticsearch-appenderartifactId>
  <version>1.0.0version>
dependency>

配置resources/logback-spring.xml

增加ElasticSearch Appender,下面是一个示例,可以看到这个Appender的配置是相当简单的,比通常配置Console,File Appender还要简单。要注意的是,需要将ElasticSearch的cluster name和cluster nodes配置在appender里面。因为logback的初始化要更早些,初始化的时候是拿不到Spring Boot的配置信息的。



<configuration>
    <include
        resource="org/springframework/boot/logging/logback/base.xml" />
    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
        encoder>
    appender>

    <appender name="ELASTIC"
        class="net.xdevelop.logback.appender.ElasticAppender">
        <clusterName>docker-clusterclusterName>
        <clusterNodes>192.168.1.21:9300clusterNodes>
        <applicationName>elastic-log-sampleapplicationName>
    appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="ELASTIC" />
    root>
    <logger name="net.xdevelop.elasticlogdemo" level="INFO" />
configuration>

logger输出

运行Spring Boot应用,正常使用logger.info()等输出日志就会直接发送到ElasticSearch服务器。

Kibana配置

为了看到发过来的日志,还需要在Kibana里按下图配置Index pattern:
ELK日志简化方案_第1张图片

然后就可以在Discovery里看到应用发来的日志了:
ELK日志简化方案_第2张图片

项目源码 https://github.com/johnhuang-cn/logback-elasticsearch-appender
喜欢的请加个星

你可能感兴趣的:(JAVA架构)