logback kafka elasticsearch kibana logstash 构建分布式日志聚合平台

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nimasike/article/details/85162732

需要解决的问题~

在传统开发模式中,将日志信息写入到文件是比较常见的做法,在单节点情况下直接去服务器查看本地文件,通过grep~~进行过滤,或者把文件下载到本地,通过ctrl+f进行查询,非常麻烦,如果是一个分布式系统,出现点问题需要挨个节点去排查日志,而且在日志量比较大的情况,无论是存储日志,查询日志,都非常麻烦,下面将通过整合logback kafka elasticsearch kibana logstash 构建分布式日志聚合系统,解决上述问题,用户可以很方便的通过webUI查询和管理日志。

系统架构图:

系统日志写入到kafka队列,logstash消费日志写入到elasticsearch搜索引擎,kibana可视化工具展示

系统效果图:

1:可以查看所有日志。

2:可以查看日志详细信息。

3:可以按时间段查询,日志内容查询(全文索引),匹配项高亮显示。

如何配置

1:首先配置kafka队列集群(google很多,不介绍)

2:配置elasticsearch搜索引擎(google很多,不介绍)

3:配置kibana可视化工具(google很多,不介绍)

4:配置logback的KafkaAppender生产者

4.1、修改pom.xml

        <dependency>
            <groupId>com.github.danielwegener</groupId>
            <artifactId>logback-kafka-appender</artifactId>
            <version>0.2.0-RC1</version>
        </dependency>
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.0</version>
        </dependency>

4.2、配置logback的KafkaAppender生产者

(<topic>my-log-topic</topic>)配置主题,千万别弄错了。

<appender name="kafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
            <customFields>{"appname":"webdemo"}</customFields>
            <includeMdc>true</includeMdc>
            <includeContext>true</includeContext>
            <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                <maxDepthPerThrowable>30</maxDepthPerThrowable>
                <rootCauseFirst>true</rootCauseFirst>
            </throwableConverter>
        </encoder>
        <topic>my-log-topic</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.HostNameKeyingStrategy" />
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.BlockingDeliveryStrategy" />

        <producerConfig>bootstrap.servers=192.168.80.112:9092,192.168.80.113:9092,192.168.80.114:9092</producerConfig>
        <producerConfig>acks=all</producerConfig>
        <producerConfig>batch.size=16384</producerConfig>
        <producerConfig>delivery.timeout.ms=60000</producerConfig>
        <!--<producerConfig>linger.ms=1</producerConfig>-->
        <producerConfig>buffer.memory=33554432</producerConfig>
    </appender>

    <logger name="Application_ERROR">
        <appender-ref ref="KafkaAppender"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="kafkaAppender"/>
        <appender-ref ref="stdout"/>
        <appender-ref ref="info"/>
        <appender-ref ref="debug"/>
        <appender-ref ref="error"/>
    </root>

4.3:使用方式

如果你将KafkaAppender添加到了root标签下 那么你的INFO极其更严格的基本的日志都将发给kafka,例如你可以这样使用(注意root标签不能使用debug,因为kafka内部也使用logback,debug将会导致死循环)

Logger logger = LoggerFactory.getLogger(this.getClass());
logger.debug("This is a debug message"); 此条日志收日志级别限制 不会同步到kafka
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");

如果你将KafkaAppender添加到了Application_ERROR下 那么你可以这样使用

Logger logger= LoggerFactory.getLogger("Application_ERROR");
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");

5:配置logstash消费者

5.1:在config目录下创建配置文件kafka.conf

input{
     kafka {
        topics => "my-log-topic"
        type => "kafka"
        bootstrap_servers => "192.168.80.112:9092,192.168.80.113:9092,192.168.80.114:9092"
        codec => "json"
     }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "logkafka-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

5.2:启动logstash

./bin/logstash -f config/kafka.conf

QQ群(212320390)

猜你喜欢

转载自blog.csdn.net/nimasike/article/details/85162732