logstash 同时支持多个管道_ELK logstash 处理多行事件(25th)

有些日志是分多行输出的,为了能正确的处理这些多行的事件,logstash必须哪些行是单一事件的一部分。多行事件处理是比较复杂的,需依赖正确的事件顺序。最佳方法是尽早的在管道中处理以保证日志有序。这就是本文要说到的logstash管道multiline codec,专门来处理合并多行事件的。

multiline插件最重要的方面:

pattern 选项指定一个正则表达式。 事件匹配指定的正则表达式来确定是前一个事件的内容还是新的事件的内容。可以使用grok正则表达式的模板来配置该选项。

what 选项有两个选择值:previous 或者 next。previous 值指定行匹配pattern选项的内容是上一行的一部分。 next 指定行匹配pattern选项的内容是下一行的一部分。* negate选项适用于 multiline codec 行不匹配pattern选项指定的正则表达式。

了解更多还需要看看multiline codec 和 multiline filter 插件的配置项。

下面介绍三个例子:

java 堆栈跟踪单个事件

C-style 线连续成单个事件

从时间标记事件

java stack traces

Java stack traces  包含多行内容,后面几行与初始行缩进,如下所示:

Exception in thread "main" java.lang.NullPointerException

at com.example.myproject.Book.getTitle(Book.java:16)

at com.example.myproject.Author.getBookTitles(Author.java:25)

at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

1

2

3

4

Exceptioninthread"main"java.lang.NullPointerException

atcom.example.myproject.Book.getTitle(Book.java:16)

atcom.example.myproject.Author.getBookTitles(Author.java:25)

atcom.example.myproject.Bootstrap.main(Bootstrap.java:14)

logstash配置如下:

input {

stdin {

codec => multiline {

pattern => "^\s"

what => "previous"

}

}

}

1

2

3

4

5

6

7

8

input{

stdin{

codec=>multiline{

pattern=>"^\s"

what=>"previous"

}

}

}

该配置将任何以空白开始的行与上一行合并。

输出的结果如下:

{

"@timestamp" => "2015-12-11T07:32:20.872Z",

"message" => "Exception in thread \"main\" java.lang.NullPointerException\n at com.example.myproject.Book.getTitle(Book.java:16)\n at com.example.myproject.Author.getBookTitles(Author.java:25)\n at com.example.myproject.Bootstrap.main(Bootstrap.java:14)Settings: Default filter workers: 4",

"@version" => "1",

"tags" => [

[0] "multiline"

],

"host" => "localhost"

}

1

2

3

4

5

6

7

8

9

{

"@timestamp"=>"2015-12-11T07:32:20.872Z",

"message"=>"Exception in thread \"main\" java.lang.NullPointerException\n        at com.example.myproject.Book.getTitle(Book.java:16)\n        at com.example.myproject.Author.getBookTitles(Author.java:25)\n        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)Settings: Default filter workers: 4",

"@version"=>"1",

"tags"=>[

[0]"multiline"

],

"host"=>"localhost"

}

line continuations

多种编程语言使用\字符在一行末尾表示该行继续,如:

printf ("%10.10ld \t %10.10ld \t %s\

%f", w, x, y, z );

1

2

printf("%10.10ld  \t %10.10ld \t %s\

%f",w,x,y,z);

logstash配置如下:

input {

stdin {

codec => multiline {

pattern => "\\$"

what => "next"

}

}

}

1

2

3

4

5

6

7

8

input{

stdin{

codec=>multiline{

pattern=>"\\$"

what=>"next"

}

}

}

该配置将以\字符结尾的任何行合并到下一行。

输出的结果如下:

{

"@timestamp" => "2015-12-11T07:46:02.116Z",

"message" => "printf (\"%10.10ld \\t %10.10ld \\t %s\\\n %f\", w, x, y, z );",

"@version" => "1",

"tags" => [

[0] "multiline"

],

"host" => "localhost"

}

1

2

3

4

5

6

7

8

9

{

"@timestamp"=>"2015-12-11T07:46:02.116Z",

"message"=>"printf (\"%10.10ld  \\t %10.10ld \\t %s\\\n  %f\", w, x, y, z );",

"@version"=>"1",

"tags"=>[

[0]"multiline"

],

"host"=>"localhost"

}

timestamps

有些日志是以时间戳开始的,如:

[2015-08-24 11:49:14,389][INFO ][env ] [Letha] using [1] data paths, mounts [[/

(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]

1

2

[2015-08-2411:49:14,389][INFO][env][Letha]using[1]datapaths,mounts[[/

(/dev/disk1)]],netusable_space[34.5gb],nettotal_space[118.9gb],types[hfs]

logstash配置如下:

input {

stdin {

codec => multiline {

pattern => "^%{TIMESTAMP_ISO8601} "

negate => true

what => previous

}

}

}

1

2

3

4

5

6

7

8

9

input{

stdin{

codec=>multiline{

pattern=>"^%{TIMESTAMP_ISO8601} "

negate=>true

what=>previous

}

}

}

该配置使用negate => true 选项来指定任何不是以时间戳开始的行属于前行。也就是不匹配pattern的行都属于前行的内容的一部分。

输出的结果如下:

{

"@timestamp" => "2015-12-11T08:08:37.013Z",

"message" => "[2015-08-24 11:49:14,389][INFO ][env ] [Letha] using [1] data paths, mounts [[/\n(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]",

"@version" => "1",

"tags" => [

[0] "multiline"

],

"host" => "localhost"

}

1

2

3

4

5

6

7

8

9

{

"@timestamp"=>"2015-12-11T08:08:37.013Z",

"message"=>"[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/\n(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]",

"@version"=>"1",

"tags"=>[

[0]"multiline"

],

"host"=>"localhost"

}

后面看应用处理mysql慢查询日志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值