【问题标题】:Logstash filter for spring boot logs to capture loglevel,class name用于 Spring Boot 日志的 Logstash 过滤器以捕获日志级别、类名
【发布时间】:2020-01-26 10:01:19
【问题描述】:

我正在尝试使用过滤器块中的以下配置使用 logstash 过滤 Spring Boot 应用程序日志

filter {

 grok {
    match => [ "message",
               "(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} --- \[(?<thread>[A-Za-z0-9-]+)\] [A-Za-z0-9.]*\.(?<class>[A-Za-z0-9#_]+)\s*:\s+(?<logmessage>.*)",
               "message",
               "(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} --- .+? :\s+(?<logmessage>.*)"
             ]
  }


  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
  }
}

但它没有在 KIbana 中显示级别、pid、类名。

日志文件中的几行

2020-01-23 12:08:51.468 ERROR 13216 --- [http-nio-8085-exec-1] com.poc.SampleLog.DemoController         : java.lang.NullPointerException

java.lang.NullPointerException: null
    at com.poc.SampleLog.DemoController.exception2(DemoController.java:36) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]

我应该在 grok 过滤器中更改什么来捕获日志级别、类名等。 提前致谢。

【问题讨论】:

  • 能否添加一些示例日志行?
  • 也许尝试在 Kibana 中重新加载您的索引模式
  • @IsharaMadhawa :我添加了示例日志行
  • @baudsp : 我试过新的索引模式也没有帮助

标签: logstash logstash-grok logstash-configuration


【解决方案1】:

试试这个:

输入:

2020-01-23 12:08:51.468 ERROR 13216 --- [http-nio-8085-exec-1] com.poc.SampleLog.DemoController         : java.lang.NullPointerException

java.lang.NullPointerException: null
    at com.poc.SampleLog.DemoController.exception2(DemoController.java:36) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]

GROK 模式:

(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}) %{LOGLEVEL:level} %{NUMBER:pid} --- \[%{GREEDYDATA:thread}\] %{GREEDYDATA:class}: %{GREEDYDATA:exception}%{SPACE}(?<stacktrace>(.|\r|\n)*)

输出:

{
  "timestamp": [
    [
      "2020-01-23 12:08:51.468"
    ]
  ],
  "YEAR": [
    [
      "2020"
    ]
  ],
  "MONTHNUM": [
    [
      "01"
    ]
  ],
  "MONTHDAY": [
    [
      "23"
    ]
  ],
  "TIME": [
    [
      "12:08:51.468"
    ]
  ],
  "HOUR": [
    [
      "12"
    ]
  ],
  "MINUTE": [
    [
      "08"
    ]
  ],
  "SECOND": [
    [
      "51.468"
    ]
  ],
  "level": [
    [
      "ERROR"
    ]
  ],
  "pid": [
    [
      "13216"
    ]
  ],
  "BASE10NUM": [
    [
      "13216"
    ]
  ],
  "thread": [
    [
      "http-nio-8085-exec-1"
    ]
  ],
  "class": [
    [
      "com.poc.SampleLog.DemoController         "
    ]
  ],
  "exception": [
    [
      "java.lang.NullPointerException"
    ]
  ],
  "SPACE": [
    [
      "\n\n"
    ]
  ],
  "stacktrace": [
    [
      "java.lang.NullPointerException: null\n    at com.poc.SampleLog.DemoController.exception2(DemoController.java:36) ~[classes/:na]\n    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]\n    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]\n    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]\n    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]"
    ]
  ]
}

【讨论】:

  • 感谢您的回答。现在它正在捕获日志级别但不能正确分类。它显示如下 com.poc.SampleLog.DemoController 类:java.lang.ArithmeticException:/零 java.lang.ArithmeticException 异常/在 com.poc.SampleLog.DemoController.exception1(DemoController.java:28) 处为零~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(N...
【解决方案2】:

由于您的消息跨越多行(就像堆栈跟踪通常那样),您需要在您的 regex/grok-pattern 中添加多行标志 m (例如,请参阅tutorial) .

解析堆栈跟踪不是一件容易的事。所以我不希望通过添加多行标志它会自动工作。我猜你需要经常调试它。

但在我看来,您绝对需要使用多行标志。

【讨论】:

    【解决方案3】:

    这种模式适用于默认的 spring.log 文件

    filter {
        grok {
          match => { "message" => "%{TIMESTAMP_ISO8601:time}\s+%{LOGLEVEL:log_level}\s+\[%{DATA:appName},%{DATA:traceId},%{DATA:spanId},%{DATA:exportable}\]\s+%{DATA:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:messageTmp}" }
    #      remove_field => "message"
        }
    
        date {
          match => ["time", "YYYY-MM-dd HH:mm:ss.SSS"]
          target => "@timestamp"
          remove_field => "time"
        }
    
        mutate {
          add_field => {"serviceName" => "back"}
          rename => {"messageTmp" => "message"}
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多