本文内容

  • 测试数据
  • 字段属性
  • 按多行解析运行时日志
  • 把多行日志解析到字段
  • 参考资料

在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j。运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思。

本文主要说明,如何用 multiline 出来运行日志。

如果能按多行处理,那么把他们拆分到字段就很容易了。

迁移到:http://www.bdata-cap.com/newsinfo/1712113.html

测试数据


[16-04-12 03:40:01 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.

[16-04-12 03:40:02 DEBUG] impl.JdbcEntityInserter:- from product_category product_category

where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null

order by product_category.ORDERS asc

[16-04-12 03:40:03 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.

[16-04-12 03:40:04 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.

[16-04-12 03:40:05 DEBUG] impl.JdbcEntityInserter:- from product_category product_category

where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null

order by product_category.ORDERS desc

[16-04-12 03:40:06 DEBUG] impl.JdbcEntityInserter:- from product_category product_category

where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null

order by product_category.ORDERS asc

[16-04-12 03:40:07 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.

测试是在7秒内发生的(当然是假数据)。可以看到,第二、五、六秒的日志是多行的,有条SQL语句。其他是单行的。

字段属性


对 multiline 插件来说,有三个设置比较重要:negate、pattern 和 what。

negate

  • 类型是 boolean

  • 默认为 false

否定正则表达式(如果没有匹配的话)。

pattern

  • 必须设置

  • 类型为 string

  • 没有默认值

要匹配的正则表达式。

what

  • 必须设置

  • 可以为 previous 或 next

  • 没有默认值

如果正则表达式匹配了,那么该事件是属于下一个或是前一个事件?

按多行解析运行时日志


示例1:若配置文件如下所示,

input {

        file{

                path=>"/usr/local/elk/logstash/logs/c.out"

                type=>"runtimelog"

                codec=> multiline {

                        pattern => "^\["

                        negate => true

                        what => "previous"

                }

                start_position=>"beginning"

                sincedb_path=>"/usr/local/elk/logstash/sincedb-access"

                ignore_older=>0

        }

}

output{

        stdout{

                codec=>rubydebug

        }

}

说明:匹配以“[”开头的行,如果不是,那肯定是属于前一行的。

解析结果如下所示,能解析出6个JSON:

{

    "@timestamp" => "2016-06-01T04:37:43.147Z",

       "message" => "[16-04-12 03:40:01 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:37:43.152Z",

       "message" => "[16-04-12 03:40:02 DEBUG] impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:37:43.152Z",

       "message" => "[16-04-12 03:40:03 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:37:43.155Z",

       "message" => "[16-04-12 03:40:04 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:37:43.157Z",

       "message" => "[16-04-12 03:40:05 DEBUG] impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS desc",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:37:43.159Z",

       "message" => "[16-04-12 03:40:06 DEBUG] impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

解析时,最后一行日志,不会解析。只有当再追加一条日志时,才会解析最后一条日志。

示例2:若将配置文件修改为,

input {

        file{

                path=>"/usr/local/elk/logstash/logs/c.out"

                type=>"runtimelog"

                codec=>multiline  {

                        pattern => "^\["

                        negate => true

                        what => "next"

                }

                start_position=>"beginning"

                sincedb_path=>"/usr/local/elk/logstash/sincedb-access"

                ignore_older=>0

        }

}

output{

        stdout{

                codec=>rubydebug

        }

}

解析结果为,能解析出7个JSON:

{

    "@timestamp" => "2016-06-01T04:40:43.232Z",

       "message" => "[16-04-12 03:40:01 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:40:43.237Z",

       "message" => "[16-04-12 03:40:02 DEBUG] impl.JdbcEntityInserter:- from product_category product_category",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:40:43.238Z",

       "message" => "where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc\n[16-04-12 03:40:03 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:40:43.239Z",

       "message" => "[16-04-12 03:40:04 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:40:43.244Z",

       "message" => "[16-04-12 03:40:05 DEBUG] impl.JdbcEntityInserter:- from product_category product_category",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:40:43.245Z",

       "message" => "where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS desc\n[16-04-12 03:40:06 DEBUG] impl.JdbcEntityInserter:- from product_category product_category",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T04:40:43.249Z",

       "message" => "where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc\n[16-04-12 03:40:07 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

示例3:若将配置文件修改为,

codec=>multiline  {

        pattern => "^\["

        negate => false

        what => "previous"

}

则解析结果为:

{

    "@timestamp" => "2016-06-01T05:38:50.853Z",

       "message" => "[16-04-12 03:40:01 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.\n[16-04-12 03:40:02 DEBUG] impl.JdbcEntityInserter:- from product_category product_category",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T05:38:50.856Z",

       "message" => "where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T05:38:50.858Z",

       "message" => "order by product_category.ORDERS asc\n[16-04-12 03:40:03 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.\n[16-04-12 03:40:04 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.\n[16-04-12 03:40:05 DEBUG] impl.JdbcEntityInserter:- from product_category product_category",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T05:38:50.860Z",

       "message" => "where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T05:38:50.861Z",

       "message" => "order by product_category.ORDERS desc\n[16-04-12 03:40:06 DEBUG] impl.JdbcEntityInserter:- from product_category product_category",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

{

    "@timestamp" => "2016-06-01T05:38:50.863Z",

       "message" => "where product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog"

}

把多行日志解析到字段


配置文件如下所示:

input {

        file{

                path=>"/usr/local/elk/logstash/logs/c.out"

                type=>"runtimelog"

                codec=>multiline  {

                        pattern => "^\["

                        negate => true

                        what => "previous"

                }

                start_position=>"beginning"

                sincedb_path=>"/usr/local/elk/logstash/sincedb-access"

                ignore_older=>0

        }

}

filter {

        grok {

                match=>["message","\[%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level}\] %{GREEDYDATA:msg}"]

        }

}

output{

        stdout{

                codec=>rubydebug

        }

}

解析后结果:

{

    "@timestamp" => "2016-06-01T06:33:26.426Z",

       "message" => "[16-04-12 03:40:01 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog",

     "timestamp" => "16-04-12 03:40:01",

         "level" => "DEBUG",

           "msg" => "model.MappingNode:- ['/store/shopclass'] matched over."

}

{

    "@timestamp" => "2016-06-01T06:33:26.485Z",

       "message" => "[16-04-12 03:40:02 DEBUG] impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog",

     "timestamp" => "16-04-12 03:40:02",

         "level" => "DEBUG",

           "msg" => "impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc"

}

{

    "@timestamp" => "2016-06-01T06:33:26.491Z",

       "message" => "[16-04-12 03:40:03 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog",

     "timestamp" => "16-04-12 03:40:03",

         "level" => "DEBUG",

           "msg" => "model.MappingNode:- ['/store/shopclass'] matched over."

}

{

    "@timestamp" => "2016-06-01T06:33:26.492Z",

       "message" => "[16-04-12 03:40:04 DEBUG] model.MappingNode:- ['/store/shopclass'] matched over.",

      "@version" => "1",

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog",

     "timestamp" => "16-04-12 03:40:04",

         "level" => "DEBUG",

           "msg" => "model.MappingNode:- ['/store/shopclass'] matched over."

}

{

    "@timestamp" => "2016-06-01T06:33:26.494Z",

       "message" => "[16-04-12 03:40:05 DEBUG] impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS desc",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog",

     "timestamp" => "16-04-12 03:40:05",

         "level" => "DEBUG",

           "msg" => "impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS desc"

}

{

    "@timestamp" => "2016-06-01T06:33:26.495Z",

       "message" => "[16-04-12 03:40:06 DEBUG] impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/usr/local/elk/logstash/logs/c.out",

          "host" => "vcyber",

          "type" => "runtimelog",

     "timestamp" => "16-04-12 03:40:06",

         "level" => "DEBUG",

           "msg" => "impl.JdbcEntityInserter:- from product_category product_category\nwhere product_category.PARENT_ID is null and product_category.STATUS = ? and product_category.DEALER_ID is null\norder by product_category.ORDERS asc"

}

参考资料


Logstash——multiline 插件,匹配多行日志的更多相关文章

  1. logstash之multiline插件,匹配多行日志

    在外理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如log4j.运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思. 在filter中,加 ...

  2. Logstash——multiline 插件,匹配多行日志

    本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...

  3. Logstash-安装logstash-filter-multiline插件(解决logstash匹配多行日志)

    ELK-logstash在搬运日志的时候会出现多行日志,普通的搬运会造成保存到ES中日志一条一条的保存,很丑,而且不方便读取,logstash-filter-multiline可以解决该问题. 接下来 ...

  4. logstash匹配多行日志

    在工作中,遇到一个问题就是日志的处理,首选的方案就是ELFK(filebeat+logstash+es+kibana) 因为之前使用过logstash采集日志的时候,非常的消耗系统的资源,所以这里我选 ...

  5. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  6. Python正则处理多行日志一例(可配置化)

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  7. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...

  8. ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持

    0x00 概述 logstash官方最新文档.假设有几十台服务器,每台服务器要监控系统日志syslog.tomcat日志.nginx日志.mysql日志等等,监控OOM.内存低下进程被kill.ngi ...

  9. logstash 安装插件multiline

    一.安装multiline 在使用elk 传输记录 java 日志时,如下 一个java的报错 在elk中会按每一行 产生多条记录,不方便查阅 这里修改配置文件 使用  multiline   插件 ...

随机推荐

  1. Asp.Net 基础理论

    WebForm是微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率. 在学习WebForm时,其知识量比WinForm要多,在实 ...

  2. CSS中父元素高度没有随子元素高度的改变而改变,应该如何解决?

    如果子元素没有设置浮动(float),父元素实际上会根据内容,自动宽高进行适应的. 当子元素增加了浮动后,最简单的处理方法是给父元素添加overflow:hidden属性,此时父元素的高度会随子元素的 ...

  3. 斯坦福第十四课:降维(Dimensionality Reduction)

    14.1  动机一:数据压缩 14.2  动机二:数据可视化 14.3  主成分分析问题 14.4  主成分分析算法 14.5  选择主成分的数量 14.6  重建的压缩表示 14.7  主成分分析法 ...

  4. 12 个 Web 设计师必备的 Bootstrap 工具

    转自:http://www.oschina.net/translate/12-best-bootstrap-tools-for-web-designers Bootstrap是一个非常棒的前端网站开发 ...

  5. C#之玩转反射

    前言 之所以要写这篇关于C#反射的随笔,起因有两个:   第一个是自己开发的网站需要用到   其次就是没看到这方面比较好的文章. 所以下定决心自己写一篇,废话不多说开始进入正题. 前期准备 在VS20 ...

  6. C#设计模式——抽象工厂

    一.引言 我相信看到这段文字的人,都具备了良好的技术功底.但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效 的设计,然后在进行建设.那么这篇文章能够给你一些思路,这里 ...

  7. 用c#开发微信 (17) 微活动 3 投票活动 (文本投票)

    前面介绍了微活动<大转盘> 和 <刮刮卡>,这次介绍下微投票,微投票分二种,一种是文本投票, 一种是图片投票.   下面介绍文本投票的详细步骤: 1. 新建文本投票活动     ...

  8. 编写高质量代码改善C#程序的157个建议读书笔记【11-20】

    章节索引 建议11:区别对待 == 和Equals 建议12:重写Equals也要重写GetHashCode 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dyna ...

  9. [ThingWorx] Install Guideline

    环境 硬件 软件 安装过程 PostgreSQL Tomcat ThingWorx

  10. 深入理解 CSS 的 :before 和 :after 选择器(制作select下拉列表美化插件)

    原文链接:http://www.cnblogs.com/LY-leo/p/5765598.html 对于 :before 和 :after 选择器,大家并不陌生,但是很少有人会主动去用它们.先解释下它 ...