版权声明:本文为博主原创文章,未经博主允许不得转载。 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)