Logstash输出到Elasticsearch

发表时间:2017-10-15 14:08:02 浏览量( 43 ) 留言数( 0 )

学习目标:

1、了解Logstash的把文件输出到ElasticSearch中


学习过程:

一、先测试使用ElasticSearch

(1)新建一个配置文件

input {

   stdin { }

}

output

{

   elasticsearch {

    action => "index"          #The operation on ES

    hosts  => "192.168.137.10:9200"   #ElasticSearch host, can be array.

    index  => "applog"         #The index to write data to.

  }

  #test

   stdout {

     codec=> rubydebug

   }

}


(2)测试启动

./bin/logstash etc/testelastic.conf

稍等一会,顺便输入一些东西

可以登陆上去看看,或者使用这个命令看一下是否能够提交到ElashSearch中

curl http://localhost:9200/_search?pretty

当然也可以使用对应的插件进行查询


二、完整的示例

下面我们做一个完整的示例

首先你需要现在你的项目中定义一个日志的输出格式,因为Logstash需要多行合并成为一行的处理。

比如我们的log4j的日志格式输出如下:

[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-4relative] [%thread] [%-5level] [%logger] - [%msg]%n

以中括号作为每一行的输出的开头。开头匹配的是 [20 作为行的开头

你也可以自定义自己的过滤器的正则表达式

进入目录:

cd vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.2/patterns

vim mylog

内容如下:

MYDATE %{YEAR}[/-]%{MONTHNUM}[/-]%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}[/.]%{INT}

这样你就可以使用MYDATE了。


新建一个配置文件如下:

注意两个地方,要给事多行的处理,一个grok的match的匹配规则的写法

input {

        file{

                path=>["/opt/logs/*.log"]

                codec=>multiline  {

                        pattern => "^\[20"

                        negate => true

                        what => "previous"

                }

                type=>"runtimelog"

                start_position=>"beginning"

        }

}

filter {

        date {

                match => [ "timestamp", "yyyy-MM-dd-HH:mm:ss" ]

                locale => "cn"

        }

        grok {

              match=>{

                 "message" => "\[%{MYDATE:readtime}\] \[%{NUMBER:relative}\] \[%{USERNAME:thread}\] \[%{GREEDYDATA:level}\] \[%{GREEDYDATA:logger}\] - \[%{GREEDYDATA:msg}\]"

              }

        }

}

output{

       elasticsearch {

          action => "index"          #The operation on ES

          hosts  => "192.168.137.10:9200"   #ElasticSearch host, can be array.

          index  => "logstash-applog"         #The index to write data to.

       }

        stdout{

                codec=>rubydebug

        }

}


运行,在文件中模拟日志,记得模拟一下换行的。

[2017-10-16 09:58:28.303] [612929] [qtp2110121908-15] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconfig]

[2017-10-16 09:56:50.193] [514819] [qtp2110121908-19] [INFO ] [com.liubao.backapplication.service.course.impl.CourseServiceImpl] - [查询全部的查询用户等级]

[2017-10-16 09:56:50.509] [515135] [qtp2110121908-16] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconfig]

[2017-10-16 09:56:50.509] [515135] [qtp2110121908-16] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconfig]

[2017-10-16 09:56:50.509] [515135] [qtp2110121908-16] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconfig]

[2017-10-16 09:56:50.509] [515135] [qtp2110121908-16] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconf

sdf

sdf

sdfs

dfs

dfsd

fsdf

sdf

sdf撒打发

撒旦发生

撒打发ig]

[2017-10-16 09:56:50.509] [515135] [qtp2110121908-16] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconfig]



然后查看是否正常插入了:

查看界面的输出

{

           "msg" => "toContorllerconf\nsdf\nsdf\nsdfs\ndfs\ndfsd\nfsdf\nsdf\nsdf撒打发\n撒旦发生\n撒打发ig",

         "level" => "INFO ",

        "logger" => "com.liubao.javaand.backview.control.common.UdeitorControl",

        "thread" => "qtp2110121908-16",

       "message" => "[2017-10-16 09:56:50.509] [515135] [qtp2110121908-16] [INFO ] [com.liubao.javaand.backview.control.common.UdeitorControl] - [toContorllerconf\nsdf\nsdf\nsdfs\ndfs\ndfsd\nfsdf\nsdf\nsdf撒打发\n撒旦发生\n撒打发ig]",

          "type" => "runtimelog",

          "tags" => [

        [0] "multiline"

    ],

          "path" => "/opt/logs/hello.log",

    "@timestamp" => 2017-10-16T04:25:34.359Z,

      "@version" => "1",

          "host" => "newrun1.com",

      "readtime" => "2017-10-16 09:56:50.509",

      "relative" => "515135"

}

查看ElasticSearch的输出:

curl http://localhost:9200/search?pretty


再复习一下multiline多行的处理吧

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

negate

类型是 boolean

默认为 false

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


pattern

必须设置

类型为 string

要匹配的正则表达式。


what

必须设置

可以为 previous 或 next



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