Docker syslog驱动程序,在logstash中进行多行解析

Docker syslog驱动程序,在logstash中进行多行解析,docker,logstash,multiline,logstash-configuration,Docker,Logstash,Multiline,Logstash Configuration,我正在通过syslog驱动程序将docker日志转发到logstash。这对于普通的日志行非常有效,但在多行方面存在问题。我遇到的问题是docker日志转发将syslog消息格式添加到每个日志行。如果我使用logstash过滤器多行(logstash不推荐使用),我可以成功地组合多行并删除附加行上的syslog消息……但是,这不是线程安全的。我无法通过logstash推荐的输入编解码器使逻辑工作 例如: Docker命令: docker run --rm -it \ --log-dr

我正在通过syslog驱动程序将docker日志转发到logstash。这对于普通的日志行非常有效,但在多行方面存在问题。我遇到的问题是docker日志转发将syslog消息格式添加到每个日志行。如果我使用logstash过滤器多行(logstash不推荐使用),我可以成功地组合多行并删除附加行上的syslog消息……但是,这不是线程安全的。我无法通过logstash推荐的输入编解码器使逻辑工作

例如:

Docker命令:

docker run --rm -it \
      --log-driver syslog \
      --log-opt syslog-address=tcp://localhost:15008 \
      helloWorld:latest
记录在docker容器中

Log message A
<<ML>> Log message B
  more B1
  more B2
  more B3
Log message C
记录消息A
日志消息B
更多B1
更多B2
更多B3
日志消息C
将收到的日志记录到日志存储中

<30>Jul 13 16:04:36 [1290]: Log message A
<30>Jul 13 16:04:37 [1290]: <<ML>> Log message B
<30>Jul 13 16:04:38 [1290]:  more B1
<30>Jul 13 16:04:39 [1290]:  more B2
<30>Jul 13 16:04:40 [1290]:  more B3
<30>Jul 13 16:04:41 [1290]:Log message C
Jul 13 16:04:36[1290]:记录消息A
7月13日16:04:37[1290]:记录消息B
七月十三日16:04:38[1290]:更多B1
7月13日16:04:39[1290]:更多B2
7月13日16:04:40[1290]:更多B3
7月13日16:04:41[1290]:记录消息C
现在,我可以使用以下过滤器按需解析所有内容:

日志存储过滤器多行

input { 
  tcp {
   port => 15008
   type => "multiline"
 }
}

filter {
  if ( [type] == "multiline") {
    grok {
      match => { "message" => [
        "^<(?<ignore>\d*)>(?<syslogDateTime>[\S]*)\s\[(?<pid>\d*)\]:.(?<newMessage>[\s\S]*)"
      ]}
    }

    multiline {
      pattern => "^[\s\S]*\<\<[M][L]\>\>"
      negate => true
      what => "previous"
      source => "newMessage"
      stream_identity => "%{host}.%{pid}"
    }
}
 input { 
      tcp {
       port => 15008
       type => "multiline"
       codec => multiline {
         pattern => "^[\s\S]*\<\<[M][L]\>\>"
         negate => true
         what => "previous"
       }
     }
    }

    filter {
      if ( [type] == "multiline") {
        grok {
          match => { "message" => [
            "^<(?<ignore>\d*)>(?<syslogDateTime>[\S]*)\s\[(?<pid>\d*)\]:.(?<newMessage>[\s\S]*)"
          ]}
        }
    }
输入{
tcp{
端口=>15008
类型=>“多行”
}
}
滤器{
如果([类型]=“多行”){
格罗克{
匹配=>{“消息”=>[
“^(?[\S]*)\S\[(?\d*)\]:.(?[\S\S]*)”
]}
}
多行{
模式=>“^[\s\s]*\”
否定=>true
什么=>“以前的”
source=>“newMessage”
stream_identity=>“%{host}.%{pid}”
}
}
这正是我想要的日志信息

输出

message: Log message A
message: <<ML>> Log message B more B1 more B2 more B3
message: Log message C
message: Log message A
message: <<ML>> Log message B <30>Jul 13 16:04:38 [1290]: more B1 <30>Jul 13 16:04:39 [1290]: more B2 <30>Jul 13 16:04:40 [1290]: more B3
message: Log message C
消息:记录消息A
消息:记录消息B更多B1更多B2更多B3
消息:日志消息C
但是,它会运行几分钟…然后挂起并停止处理

尝试通过多行编解码器使其工作,这是logstash建议

日志存储编解码器多行

input { 
  tcp {
   port => 15008
   type => "multiline"
 }
}

filter {
  if ( [type] == "multiline") {
    grok {
      match => { "message" => [
        "^<(?<ignore>\d*)>(?<syslogDateTime>[\S]*)\s\[(?<pid>\d*)\]:.(?<newMessage>[\s\S]*)"
      ]}
    }

    multiline {
      pattern => "^[\s\S]*\<\<[M][L]\>\>"
      negate => true
      what => "previous"
      source => "newMessage"
      stream_identity => "%{host}.%{pid}"
    }
}
 input { 
      tcp {
       port => 15008
       type => "multiline"
       codec => multiline {
         pattern => "^[\s\S]*\<\<[M][L]\>\>"
         negate => true
         what => "previous"
       }
     }
    }

    filter {
      if ( [type] == "multiline") {
        grok {
          match => { "message" => [
            "^<(?<ignore>\d*)>(?<syslogDateTime>[\S]*)\s\[(?<pid>\d*)\]:.(?<newMessage>[\s\S]*)"
          ]}
        }
    }
输入{
tcp{
端口=>15008
类型=>“多行”
编解码器=>多行{
模式=>“^[\s\s]*\”
否定=>true
什么=>“以前的”
}
}
}
滤器{
如果([类型]=“多行”){
格罗克{
匹配=>{“消息”=>[
“^(?[\S]*)\S\[(?\d*)\]:.(?[\S\S]*)”
]}
}
}
它正确地组合了多行,但我现在将这些系统日志消息混合到多行消息中

输出

message: Log message A
message: <<ML>> Log message B more B1 more B2 more B3
message: Log message C
message: Log message A
message: <<ML>> Log message B <30>Jul 13 16:04:38 [1290]: more B1 <30>Jul 13 16:04:39 [1290]: more B2 <30>Jul 13 16:04:40 [1290]: more B3
message: Log message C
消息:记录消息A
消息:日志消息B Jul 13 16:04:38[1290]:更多B1 Jul 13 16:04:39[1290]:更多B2 Jul 13 16:04:40[1290]:更多B3
消息:日志消息C

如何使编解码器处理像过滤器一样输出?

好的,我通过使用logstash编解码器多行并在grok匹配后添加另一个过滤器来实现这一点

    mutate {
      gsub => [
        "message", "<\d*>[\s\S]*?\[\d*\]:.", " "
      ]
    }
变异{
gsub=>[
“消息”、“[\s\s]*?\[\d*\]:”、“
]
}

能否请您进一步解释一下
这些系统日志消息
?您能否发布一个示例,说明它在哪里混合显示混合的输出日志?您能否添加一些解释,说明为什么会这样做以及问题出在哪里?