Logstash编码和解码的方式

发表时间:2017-09-25 15:22:21 浏览量( 18 ) 留言数( 0 )

学习目标:

1、了解Logstash的编解码的使用


学习过程:

所以,这里需要纠正之前的一个概念。Logstash 不只是一个input | filter | output 的数据流,而是一个 input | decode | filter | encode | output 的数据流!codec 就是用来 decode、encode 事件的。

当然编解码也并不是必须的。

简单看看下面的两个例子吧:

监听nginx的日志,使用了json的编码方式

input {

    file {

        path => "/var/log/nginx/access.log_json""

        codec => "json"

    }

}

得到的输出如下:

{

      "@timestamp" => "2014-03-21T18:52:25.000+08:00",

        "@version" => "1",

            "host" => "raochenlindeMacBook-Air.local",

          "client" => "123.125.74.53",

            "size" => 8096,

    "responsetime" => 0.04,

          "domain" => "www.domain.com",

             "url" => "/path/to/file.suffix",

          "status" => "200"

}


有些时候,应用程序调试日志会包含非常丰富的内容,为一个事件打印出很多行内容。这种日志通常都很难通过命令行解析的方式做分析。


而 logstash 正为此准备好了 codec/multiline 插件!


input {

    stdin {

        codec => multiline {

            pattern => "^\["

            negate => true

            what => "previous"

        }

    }

}


输入的内容如下:

[Aug/08/08 14:54:03] hello world

[Aug/08/09 14:54:04] hello logstash

    hello best practice

    hello raochenlin

[Aug/08/10 14:54:05] the end

得到的输出如下:

{

    "@timestamp" => "2014-08-09T13:32:03.368Z",

       "message" => "[Aug/08/08 14:54:03] hello world\n",

      "@version" => "1",

          "host" => "raochenlindeMacBook-Air.local"

}

{

    "@timestamp" => "2014-08-09T13:32:24.359Z",

       "message" => "[Aug/08/09 14:54:04] hello logstash\n\n    hello best practice\n\n    hello raochenlin\n",

      "@version" => "1",

          "tags" => [

        [0] "multiline"

    ],

          "host" => "raochenlindeMacBook-Air.local"

}

其实这个插件的原理很简单,就是把当前行的数据添加到前面一行后面,,直到新进的当前行匹配 ^\[ 正则为止。


大家也知道平时我们的应用程序一旦报出异常通常会吧这个栈的异常都打印出来。会有很多行的,可能大家马上想到上面的处理方法,事实上Logstash也早就有专门处理Log4j的日志了。不需要我们这么麻烦的。

input/log4j。与 codec/multiline 不同,这个插件是直接调用了 org.apache.log4j.spi.LoggingEvent 处理 TCP 端口接收的数据。