常见日志集中化的实现方式
有许多现成的可用于实现集中式日志记录的解决方案,它们使用不同的方法、体系结构和技术。理解所需的功能并选择满足需求的正确解决方案非常重要。
日志托运
有一些日志托运组件可以与其他工具结合起来建立一个端到端的日志管理解决方案。不同日志托运工具的功能不同。
· Logstash:是一个功能强大的数据管道工具,可用于收集和发送日志文件。它充当经纪人,提供了一种机制来接受来自不同来源的流数据,并将其汇集到不同的目的地。Log4j和Logbackappender也可以用来直接从Spring Boot微服务发送日志消息到Logstash。Logstash的另一端将连接到Elasticsearch、HDFS或任何其他数据库。
·Fluentd:是一个与Logstash非常相似的工具。Logspout是Logstash的另一个日志管理工具,但是在Docker基于容器的环境中它更合适。
日志存储
实时日志消息通常存储在Elasticsearch中,它允许客户端根据基于文本的索引进行查询。除了Elasticsearch外,HDFS还常用于存储归档的日志消息。MongoDB或Cassandra用于存储汇总数据,
如每月汇总的交易次数。
脱机日志处理可以使用Hadoop 的map reduce程序完成。
日志流处理器
日志流处理器可用于处理日志流。例如,如果连续收到404错误作为对特定服务调用的响应,则意味着该服务出现问题。这种情况必须尽快处理。流处理器在这种情况下非常方便,因为与传统的反应分析相比,流处理器能够对某些事件流做出及时响应。
日志流处理器的典型架构是将Flume和Kafka结合在一起,并与Storm或Spark Streaming结合使用。Log4j有Flume appender,可以用于收集日志消息。这些消息将被推送到分布式Kafka消息队列中。流处理器从Kafka收集数据,并在发送给Elasticsearch和其他日志存储之前进行处理。
Spring Cloud Stream和Spring Cloud Data Flow也可用于构建日志流处理器。
日志仪表板
日志分析最常用的仪表板是使用Elasticsearch数据存储的Kibana。
Graphite和 Grafana也被用来显示日志分析报告。
Elastic Stack 实现日志集中化
本节将基于Elastic Stack 6.0来实现日志的集中化管理。Elastic Stack原来称为“ELK”。“ELK”是3个开源项目(Elasticsearch、Logstash和Kibana)的首字母缩写。
有关ELK Stack 与 Elastic Stack 的异同点可以参阅笔者的博客(
https:/waylau.com/elk-statck-and-elastic-stack/ )。
Elasticsearch的安装和使用
( 1)下载Elasticsearch,网址为
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.zipo
(2)解压。解压安装包为elasticsearch-6.0.0.zip。
( 3)运行。执行:.lbinlelasticsearch。
(4)访问。网址为http://localhost:9200/,能看到如下界面显示。
"name":"DwV60B2",
"cluster name":"elasticsearch",
"cluster uuid":"FOIG6cxCSlesYal7jdAxqg",
"version":{
"number":"6.0.0",
"build_hash" :"8f0685b",
"build date":"2017-11-10T18:41:22.859z",
"build_snapshot" :false,
"lucene_version":"7.0.1",
"minimum_ wire_compatibility_version" :"5.6.0",
"minimumindex compatibility version":"5.0.0"}
"tagline":"You Know, for Search"
}
Kibana的安装和使用
(1)下载Kibana,网址为
https://artifacts.elastic.co/downloads/kibana/kibana-6.0.O-windows-x86_64.zipo.
(2)解压。解压安装包为
kibana-6.0.0-windows-x86_64.zip。
(3)运行。执行: .lbinlkibana。
(4)访问。网址为http://localhost:5601/,能看到Kibana的管理界面。
Logstash的安装和使用
(1)下载Logstash,网址为
https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.zip。
( 2)解压。解压安装包为logstash-6.0.0.zip。
( 3)运行。执行:.1bin\logstash。
综合示例演示
1.创建hello-world-log
在本节hello-world 应用的基础上,创建一个hello-world-log应用作为示例。
其中,须改写HelloController.java。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.slf4j-Logger;
import org.slf4j.LoggerFactory;
/**
*Hello controller.
*
*@since 1.0.0 2017年12月24日
* @author <a href="https://waylau.com">Way Lau</a>
*/
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(Hello
Controller.class);
@RequestMapping("/hello")
public String hello()
logger.info("hello world");
return "Hello World! welcome to visit waylau.com!";
}
}
主要修改项在于添加了一行日志。日志非常简单,记录了一条“hello world”日志。
⒉.添加Logback JSON编码器
Logback JSON编码器用于创建与Logstash一起使用的JSON格式的日志。
dependencies {
//...
//添加Logback JSON编码器
compile('net.logstash.logback:logstash-logback-encoder:4.11')
//...
}
3.添加logback.xml
在应用的src/main/resources目录下,创建logback.xml文件。
<?xml version="1.0"encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/
defaults.xml"/>
<include
resource="org/springframework/boot/logging/logback/console-
appender . xml"/>
<appender name="stash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender"
<destination>localhost:4560</destination>
<!--编码器-->
<encoder class="net.logstash.logback.encoder.LogstashEncoder"
/>
</appender>
<root level="工NFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="stash"/>
</root>
</configuration>
该文件会覆盖Spring Boot中默认的配置项。
4.创建logstash.conf
在Logstash的bin目录下,创建logstash.conf文件,用于配置Logstash。
input {
tcp {
port=>4560
host=>localhost
}
output {
elasticsearch hosts => ["localhost: 9200"]}
stdout codec =>rubydebug }
)
5.启动Elastic Stack
按以下顺序执行命令行来启动Elastic Stack。
.binllasticsearch
.bin\kibana
.\binllogstash -f logstash.conf
其中“-f”用于指定Logstash配置文件。
6.启动hello-world-log
启动成功之后,在浏览器访问
http:/localhost:8080/hello,就能触发程序来记录日志。
此时,能在Logstash控制台看到如下信息,说明日志已经被Logstash处理了。
{
"@version"=>"1",
"host" =>"127.0.0.1",
"@timestamp"=>2017-12-24T15:58:09.008z,
"@metdata" ->{
"ip_address" =>"127.0.0.1"
},
"message" =>"{\"@timestamp\":\"2017-12-24T23:58:09.007+08:00\",
"@version\":1,\"message\":\ "hello world\", \"logger_name \ ":\"com.waylau.
spring.cloud.weather.controller.HelloController\",\"thread_name\":
"http-nio-8080-exec-5\",\"level\":\"INFO\",\"level_value\":20000}\r",
"port"=>10512
}
7. Kibana分析日志
在浏览器访问http://localhost:5601,进入Kibana管理界面。初次使用Kibana,会被重定向到如图12-3所示的配置索引界面。
单击“Create”按钮来保存配置,并切换到Discover界面。在该界面就能按照关键字来搜索日志了。
图12-4展示了在Kibana中搜索关键字的界面。
集中式日志管理系统的展望
虽然本节只是挑选了一个最简单的Spring Boot微服务作为例子,但是可以完整地呈现如何使用Elastic Stack技术来搭建一个完整的集中式日志管理系统的整个过程。读者可以举一反三,将天气预报系统中的其他微服务实例做相应的操作,实现天气预报系统的集中化日志管理改造。为节约篇幅,就不再对这个改造做详细的描述。
源码
本节示例所涉及的源码见hello-world-log。
本篇文章内容给大家讲解的是常见日志集中化的实现方式和ElasticStack 实现日志集中化
- 下篇文章给大家讲解的是微服务的集中化配置;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!