代码之家  ›  专栏  ›  技术社区  ›  user84592

如果日志包含特定单词,则忽略并移动到下一个模式

  •  1
  • user84592  · 技术社区  · 6 年前

    我有一个来自spring日志文件的日志文件。日志文件有三种格式。前两种格式中的每一种都是单行,如果在它们之间有关键字app info,则是由自己的开发人员打印的消息。如果没有,则由spring framework打印。我们可能对待开发人员的消息不同于spring框架消息。第三种格式是多行堆栈跟踪。

    例如,我们有一个自己格式的示例

    2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  - app-info - injectip ip 192.168.16.89
    

    上述行具有 app-info 关键的工作,所以这是我们自己的开发人员。

    2018-04-27 10:42:23 [RMI TCP Connection(10)-127.0.0.1] - INFO  - org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'
    

    以上行没有 应用程序信息 关键字,所以它是由spring framework打印的。

    在我的Grok过滤器中,第一种模式用于从spring框架打印的消息,第二种用于开发人员的消息,第三种格式用于多行stacktrace。我想首先明确指出,spring框架模式没有关键字app info,因此它可以获得PaseException并遵循第二种模式,即开发人员自己的格式。所以我有以下格式 regex tool ,但我得到了编译错误。我的正则表达式如下:

    (?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^((?app-info).)*\s\.\w\-\'\:\d\[\]\/]+)
    

    由于在Grok筛选器中,我使用 this link

    filter {
       grok {
         match => [ "message", "PATTERN1", "PATTERN2" , "PATTERN3" ]
        }
    }
    

    我当前在logstash中的配置如下,在模式中没有明确提及应用程序信息:

    filter {
      grok {
        match => [
          "message",
            '(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[\s\.\w\-\'\:\d\[\]\/^[app-info]]+)',
            '(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s(?<appinfo>app-info)\s-\s(?<systemmsg>[\w\d\:\{\}\,\-\(\)\s\"]+)',
            '(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\w\-\d]+)\]\s-\s(?<loglevel>[\w]+)\s\-\s(?<appinfo>app-info)\s-\s(?<params>params):(?<jsonstr>[\"\w\d\,\:\.\{\}]+)\s(?<exceptionname>[\w\d\.]+Exception):\s(?<exceptiondetail>[\w\d\.]+)\n\t(?<extralines>at[\s\w\.\d\~\?\n\t\(\)\_\[\]\/\:\-]+)\n\d'
          
        ]      
      }
    
    }
    

    使用上述logstash配置中的格式

    2018-04-27 10:42:49[http-nio-8088-exec-1]-信息-应用信息-注入ip 192.168.16.89
    

    第一个模式(spring框架模式)已经可以工作了,所以它不属于第二个模式,这是我们自己的开发人员格式。解析器已成功解析,如下所示:

      {
      "timestamp": [
        [
          "2018-04-27 10:42:49"
        ]
      ],
      "threadname": [
        [
          "http-nio-8088-exec-1"
        ]
      ],
      "loglevel": [
        [
          "INFO"
        ]
      ],
      "systemmsg": [
        [
          "app-info - injectip ip 192.168.16.89\n\n"
        ]
      ]
    }
    

    我可以让第一个模式明确指出systemmsg不应包含关键字“app info”吗?

    编辑:

    我的目标是,如果没有关键字app info,我就让模式1来处理日志。如果有关键词app info,我让模式2来处理日志。

    以下日志不包含关键词app info(模式1应适用),

    2018-04-27 10:42:23[RMI TCP连接(10)-127.0.0.1]-信息-组织。阿帕奇。卡特琳娜。果心集装箱基础。[雄猫]。[本地主机]。[/]-初始化Spring FrameworkServlet“dispatcherServlet”
    

    根据你的建议,我得到了与第一种模式不匹配的结果,这不是我的目标。

    (?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^(?:(?!app\-info).)*\s\.\w\-\'\:\d\[\]\/]+)
    

    看见 demo 。我的目标是提取时间戳、线程名称、日志级别和系统消息。但第一种模式并没有给我预期的结果。工具显示没有匹配项。

    如果我删除^(?(?!app info)。)*,然后上面的日志(没有关键字app info)解析器工作。看见 demo 但现在,它也适用于包含关键字app info的日志,这是不需要的,因为现在我想提取timestamp、threadname、loglevel、app info(存在与否)(该字段应被提取或分组),然后是systemmsg。期望第一个解析器返回错误,让第二个解析器处理日志。 demo 可以看到解析器也适用于带有关键字app info的日志。Systemmsg将字段app info放入其值中,该值不是预期值。

    所以我想要模式1,处理没有关键字app info的日志,模式2处理带有关键字app info的日志。所以,当模式1包含关键字app info时,我显然让它抛出解析错误或异常。

    2 回复  |  直到 4 年前
        1
  •  1
  •   Community Egal    4 年前

    我的目标是让模式1处理没有关键字app info的日志。如果 存在应用程序信息,第一个模式将抛出解析错误,以便 第二个解析器可以处理日志。

    您可以使用以下作为第一个模式,

    (?<data>^(?!.*app-info).*)%{LOGLEVEL:log}%{DATA:other_data}%{IP:ip}$
    

    它将做的是,如果存在 app-info 在它的任何位置,并移动到 2nd PATTERN

    实例


    日志中没有 应用程序信息 ,则,

    2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  injectip ip 192.168.16.89
    

    您可以根据需要对其进行筛选。

    输出

    {
      "data": [
        [
          "2018-04-27 10:42:49 [http-nio-8088-exec-1] - "
        ]
      ],
      "log": [
        [
          "INFO"
        ]
      ],
      "other_data": [
        [
          "  injectip ip "
        ]
      ],
      "ip": [
        [
          "192.168.16.89"
        ]
      ]
    }
    

    现在使用登录 应用程序信息 ,则,

    2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO app-info  injectip ip 192.168.16.89
    

    输出

    No Matches
    

    test it here

    编辑2:

    如果你 PATTERN1 等于 (?<data>^(?!.*app-info).*)

    你会得到,

    {
      "data": [
        [
          "2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO  injectip ip 192.168.16.89"
        ]
      ]
    }
    

    然后,您可以为 data 字段如下所示,

    grok {
      match => {"data" => "DEFINE PATTERN HERE"}
    }
    
        2
  •  0
  •   xs2rashid    2 年前

    我使用了GREEDYDATA,假设您有下面的日志行

    重定向控制器:成功重定向单击数据:{a:123,b:345}

    您希望捕获到“数据”,然后使用GREEDYDATA,如下所示

    %{GREEDYDATA}数据:%{空间}%{模式的其余部分}