使用正则表达式和 grok 解析 logstash 日志

logstash log parsing with regex and grok

您好,我有以下日志

12-Apr-2021 16:11:41.078 WARNING [https-jsse-nio2-8443-exec-3] org.apache.catalina.realm.LockOutRealm.filterLockedAccounts An attempt was made to authenticate the locked user [uv19nb]
12-Apr-2021 16:01:01.505 FINE [https-jsse-nio2-8443-exec-8] org.apache.catalina.realm.CombinedRealm.authenticate Failed to authenticate user [uv19nb] with realm [org.apache.catalina.realm.JNDIRealm]
12-Apr-2021 17:12:45.289 FINE [https-jsse-nio2-8443-exec-5] org.apache.catalina.authenticator.FormAuthenticator.doAuthenticate Authentication of 'uv19nb' was successful

我正在尝试为 logstash 构建这些模式。

我有关注

%{MY_DATE_PATTERN:timestamp}\s%{WORD:severity}\s\[%{DATA:thread}\]\s%{NOTSPACE:type_log}

下面解析

{
  "timestamp": [
    "12-Apr-2021 16:01:01.505"
  ],
  "severity": [
    "FINE"
  ],
  "thread": [
    "https-jsse-nio2-8443-exec-8"
  ],
  "type_log": [
    "org.apache.catalina.realm.CombinedRealm.authenticate"
  ]
}

我想将日志解析为粗体部分和用户名两部分,请问您有什么建议?

已尝试对锁定的用户进行身份验证 [uv19nb]

无法通过领域 [org.apache.catalina.realm.JNDIRealm]

验证用户 [uv19nb]

'uv19nb'认证成功

我尝试过使用 (?<action>[^\[]*)(?<action>[^']*),但它们仅在下一个字符是 [' 时才捕获。

我需要一些 regex/grok 模式来捕捉所有句子,直到我相信任何特殊字符,对于用户名,我需要从 []'' 中提取数字和字母。

如果 MY_DATE_PATTERN 适合您,您可以使用

%{MY_DATE_PATTERN:timestamp}\s+%{WORD:severity}\s+\[%{DATA:thread}\]\s+%{NOTSPACE:type_log}\s+(?<action>\w(?:[\w\s]*\w)?)

我添加了\s+(?<action>\w(?:[\w\s]*\w)?):

  • \s+ - 一个或多个空格
  • (?<action>\w(?:[\w\s]*\w)?) - 组“动作”:
    • \w - 一个单词 char 后跟
    • (?:[\w\s]*\w)? - 零个或多个单词和空白字符的可选出现,然后是强制性单词字符。