0

在 ELK 堆栈中,我是 logstash 的新手。一个日志文件有不​​同的进程向它记录数据。每个进程以不同的模式写入日志。我想解析这个日志文件。此日志文件中的每个日志都以以下 grok 模式开始,

%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:logsource} %{SYSLOGPROG}: + %{SRCFILE:srcfile}:%{NUMBER:linenumber} 其中 SRCFILE 定义为 [a-zA-Z0-9._-]+

请让我知道如何解析此文件,以便可以解析来自该文件中记录的每个进程的不同类型的日志。

4

1 回答 1

1

由于您正在尝试传递日志文件,因此您可能必须使用文件输入插件才能从给定路径中检索一个文件或 x 个文件。所以一个基本的input可能看起来像这样:

input {

        file {
            path => "/your/path/*"
            exclude => "*.gz"
            start_position => "beginning" 
            ignore_older => 0 
            sincedb_path => "/dev/null"
        }
}

以上只是供您复制的示例。因此,一旦您获得文件并开始逐行处理它们,您就可以使用grok过滤器来匹配日志文件中的关键字。示例过滤器可能如下所示:

grok {
    patterns_dir => ["/pathto/patterns"]
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:logsource} %{SYSLOGPROG}: + %{SRCFILE:srcfile}:%{NUMBER:linenumber} where SRCFILE is defined as [a-zA-Z0-9._-]+" }           
}

如果您在单个文件中打印不同类型的日志,您可能必须使用不同的过滤器,或者,您可以使用逗号分隔值将其放在同一行中。就像是:

grok {
        match => { "message" => [ 
              "TYPE1,%{WORD:a1},%{WORD:a2},%{WORD:a3},%{POSINT:a4}",
              "TYPE2,%{WORD:b1},%{WORD:b2},%{WORD:b3},%{WORD:b4}",
              "TYPE3,%{POSINT:c1},%{WORD:c2},%{POSINT:c3},%{WORD:c4}"  ]
        }
    }

然后也许你可以玩弄message,因为你已经在它里面得到了你需要的所有值。希望能帮助到你!

于 2017-01-27T10:19:57.677 回答