• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

使用ELK管理SpringBoot日志

技术杂谈 勤劳的小蚂蚁 1个月前 (02-05) 86次浏览 已收录 0个评论 扫描二维码

当我们开发一个新项目的时候,一个经常遇到的问题是日志的管理。ELK栈(Elastic,Logstash,Kibana)是一个功能强大且免费的日志管理解决方案。在本文中,将为您展示如何安装、如何设置ELK,如何使用它来管理SpringBoot应用程序中的默认格式的日志。

在本文中,我们设置了一个演示SpringBoot应用程序,并且启用了日志管理,同时使用Logstash配置把日志条目送到了Elasticsearch。

应用程序会把日志存在一个文件中。Logstash将读取并解析日志文件并将日志条目发送给Elasticsearch实例。最后,我们将使用Kibana 4(Elasticsearch Web前端)来搜索和分析日志。

步骤一、安装Elasticsearch

下载Elasticsearch,下载地址:https://www.elastic.co/downloads/elasticsearch
解压缩到一个路径(解压缩)运行Elasticsearch(bin/elasticsearch或bin/elasticsearch.bat在Windows上)
检查它是在使用curl -XGET http://localhost:9200运行

下面是如何操作(下面步骤是为OSX编写的,但其它操作系统大致相同)

现在,Elasticsearch应该已经在运行中了。您可以使用curl命令来验证。在单独的终端窗口中执行Elasticsearch状态页面的GET请求:

如果一切正常,你应该得到以下结果:

步骤二、安装Install Kibana 04
  1. 下载Kibana,下载地址:https://www.elastic.co/downloads/kibana (请注意你的系统属性,下载与你系统相匹配的版本,链接给出的是OSX系统的)
  2. 解压缩文件
  3. 运行Kivana(bin/kibana)
  4. 通过把浏览器指向Kibana’s来检查它是否在运行

下面是具体的做法:

将你的浏览器指向http://localhost:5601(如果页面显示正常,说明我做的很好,我们将在稍后配置它)。

步骤三、安装Logstash

  1. 下载Logstash,下载地址:https://www.elastic.co/downloads/logstash
  2. 提取文件(解压缩)


步骤四、配置Spring Boot的日志文件

为了让Logstash传递文件到Elasticsearch,我们必须先配置Spring Boot来把日志条目存储到一个文件中。我们将建立以下传递路径:Spring Boot App —— 日志文件 —— Logstash —— Elasticsearch。

这里还有其它的方法可以完成同样的事情,比如配置logback来使用TCP附加器把日志发送到一个远程的Logstash,以及其它的有些配置。但我更喜欢文件方法,因为这样更简单、很自然(你可以很容易的把它添加到已存在的系统中),并且当Logstash停止工作或者Elasticearch宕机的时候,不会丢失或者破坏任何文件。

不管如何,让我们来配置Spring Boot的日志文件。最简单的方法是在application.properties中配置日志文件。添加下面一行就足够了:

现在,Spring Boot将会在application.log中记录ERROR,WARN和INFO级别的信息,并且当信息量达到10M的时候更迭。

步骤五、配置Logstash

通过配置Logstash可以了解SpringBoot的日志文件格式。这部分比较棘手。
我们需要创建一个Logstash配置文件。典型的Logstash配置文件包含三个部分:input、filter、output。每个部分包含执行相关部分处理的插件,例如:从文件中读取日志时间的文件输入插件,或者将日志时间发送到Elasticsearch的elasticseatch输出插件。

input部分定义了Logstash从哪里读取输入数据——在我们的例子中它是一个文件,所以我们将使用一个file插件multiline codec。这基本上意味着我们的输入文件可能每个条目有多行。

Input 部分
下面是输入部分的配置:

  1. 我们将会用到file插件。
  2. type被设置为java——这只是额外的元数据,以备将来使用多种类型的日志文件。
  3. path是日志文件的绝对路径。它必须是绝对的——Logstash对这点很严格。
  4. 我们使用multiline codec意味着多个行可能对应着一个日志事件。
  5. 为了检测在逻辑上与前一行分组的行,我们使用检测模式:
pattern => “^%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}.*” →每个新的日志事件都需要以日期开始。
negate => “true” →如果它不以日期开始……
what => “previous” →…然后,它应该与前一行分组。

文件输入插件,就像配置的一样,将会跟踪日志文件(例如:只读取文件末尾的新条目)。所以,测试的时候,为了让Logstash读取某些内容,您需要生成新的日志条目。

Filter 部分
Filter 部分包含对日志时间执行中间处理的插件。在我们的例子中国,事件可以是根据上述规则分组的单个日志行货多行日志事件。在Filter部分,我们会做几件事情:

  1. 如果一个日志事件包含堆栈跟踪,我们会标记它。这将有助于我们在后面寻找我们所期望的信息。
  2. 解析出时间戳,日志等级,pid,线程,类名称(记录器实际)和日志信息。
  3. 指定时间戳的区域和格式——Kibana将会用到它来进行实践的基本搜索。

上面提及的Spring Boot日志格式的过滤器部分看起来是这样的:

  1. filter {
  2.   #If log line contains tab character followed by ‘at’ then we will tag that entry as stacktrace
  3.   if [message] =~ “tat” {
  4. grok {
  5.   match => [“message”, “^(tat)”]
  6.   add_tag => [“stacktrace”]
  7. }
  8.   }

  9.   #Grokking Spring Boot’s default log format
  10.   grok {
  11. match => [ “message”, 
  12.    “(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} — [(?<thread>[A-Za-z0-9-]+)] [A-Za-z0-9.]*.(?<class>[A-Za-z0-9#_]+)s*:s+(?<logmessage>.*)”,
  13.    “message”,
  14.    “(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} — .+? :s+(?<logmessage>.*)”
  15.  ]
  16.   }

  17.   #Parsing out timestamps which are in timestamp field thanks to previous grok section
  18.   date {
  19. match => [ “timestamp” , “yyyy-MM-dd HH:mm:ss.SSS” ]
  20.   }
  21. }

说明
  1. if [message] =~ ” at”→如果消息包含后面跟着at的tab字符(这是ruby语法),那么……
  2. …使用grok插件来标记堆栈踪迹:
  3. match => [“message”, “^( at)”] → 当message匹配行的开头,后面跟着tab,之后跟着at,然后是…add_tag => [“stacktrace”]→…用stacktrace标签标记事件。 

使用grok插件进行常规的Spring Boot日志消息解析:
第一种模式提取时间戳,级别,pid,线程,类名(实际上是记录器名称)和日志消息。

不幸的是,某些日志消息没有类似于类名的记录器名称(例如,Tomcat日志),因此第二个模式将跳过记录器/类字段并解析出时间戳,级别,pid,线程和日志消息。

使用date插件解析并设置事件日期:
match => [ “timestamp” , “yyyy-MM-dd HH:mm:ss.SSS” ]→ timestamp字段(早先grokked)包含指定格式的时间戳

Output 部分
Output部分包含将事件数据发送到特定目标的输出插件。产出是事件管道的最后阶段。我们将把日志事件发送到stdout(控制台输出,用于调试)和Elasticsearch。
与Filter分相比,Output部分非常简单:


  1. filter {
  2.   #If log line contains tab character followed by ‘at’ then we will tag that entry as stacktrace
  3.   if [message] =~ “tat” {
  4. grok {
  5.   match => [“message”, “^(tat)”]
  6.   add_tag => [“stacktrace”]
  7. }
  8.   }

  9.   #Grokking Spring Boot’s default log format
  10.   grok {
  11. match => [ “message”, 
  12.    “(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} — [(?<thread>[A-Za-z0-9-]+)] [A-Za-z0-9.]*.(?<class>[A-Za-z0-9#_]+)s*:s+(?<logmessage>.*)”,
  13.    “message”,
  14.    “(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} — .+? :s+(?<logmessage>.*)”
  15.  ]
  16.   }

  17.   #Parsing out timestamps which are in timestamp field thanks to previous grok section
  18.   date {
  19. match => [ “timestamp” , “yyyy-MM-dd HH:mm:ss.SSS” ]
  20.   }
  21. }

说明:
  1. 我们正在使用多个输出:stdout和elasticsearch。
  2. stdout { … }→ stdout插件将日志事件打印到标准输出(控制台)。
    codec => rubydebug →使用类似JSON格式的漂亮打印事件。
  3. elasticsearch { … }→ elasticsearch插件将日志事件发送到Elasticsearch服务器。
    host => “127.0.0.1” →Elasticsearch所在的主机名 在我们的例子中是localhost。

Update 5/9/2016:在编写此更新时,Logstash的elasticsearch输出插件的最新版本使用hosts配置参数,而不是host上面的示例中所示。新参数将一组主机(例如elasticsearch cluster)作为值。换句话说,如果您正在使用最新的Logstash版本,请按如下所示配置elasticsearch输出插件:


把各个部分放在一起。

最后,三个部分——input,filter和output需要复制粘贴到一起并保存在Logstash.conf配置文件中。一旦配置文件就位,并且Elasticsearch运行,我们可以运行Logstash:

如果一切顺利,Logstash正在传递日志时间到Elasticsearch。

步骤六、配置Kibana

现在是我们再次访问Kibana web UI的时候了,我们已经在第二部中启动了,它应该在http:// localhost:5601上运行。

首先,您需要将Kibana指向您选择的elasticsearch索引。Logstash创建索引的名称模式是:logstash-YYYY.MM.DD。在Kibana设置——索引中配置索引。

  1. 索引包含基于时间的事件(选择此项)
  2. 使用事件时间创建索引名称(选择此项)
  3. 索引模式间隔:日
  4. 索引名称或模式:[logstash-] YYYY.MM.DD
  5. 点击“创建索引”

现在,点击“Discover”标签。在我看来,“Discover”选项卡在Kibana中的确命名不正确 – 它应该被标记为“Search”而不是“Discover”,因为它允许您执行新的搜索并保存/管理它们。日志事件现在应该显示在主窗口中。

如果不是,则再次检查屏幕右上角的时间段过滤器。默认表格默认有2列:Time和_source。为了使列表更有用,我们可以配置显示的列。从左侧的选择菜单中选择级别,类别和日志消息。

好的!您现在已准备好使用ELK堆栈来控制日志,并开始自定义和调整日志管理配置。

您可以从这里下载这篇文章时使用的示例应用程序:
ttps://github.com/knes1/todo。它已被配置为将日志写入文件,并具有上述的Logstash配置(尽管需要调整绝对路径logstash.conf)。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:使用ELK管理SpringBoot日志
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00