【问题标题】:How to capture all messages in a log using grok如何使用 grok 捕获日志中的所有消息
【发布时间】:2020-07-30 14:21:37
【问题描述】:

我正在尝试捕获日志中的所有消息。

例如,我们得到这个包含 6 条消息的日志。

"message":["18.59.43 STC47873 +LRGPSEVRI\u000007/29/20 18:59:43 I West 登录 Tandem/Base24。","18.59.43 STC47873 +LRGPSEVRI\u000007/29/20 18:59:43 I West 从 Tandem/Base24 注销。","18.59.43 STC47873 +LRGPSEVRI\u000007/29/20 18:59:43 I West Environment 重置正常","18.59.43 STC47873 +LRGPSEVRE\u000007 /29/20 18:59:43 E West 任务“发生最大重置”,“18.59.43 STC47873 +LRGPSEVRE\u000007/29/20 18:59:43 E West Base24/Tandem 通信错误。解决后运行作业 PRGSWSVR。 ","18.59.43 STC47873 +LRGPSEVRI\u000007/29/20 18:59:43 我西服务器正在结束","\u0000 "],"seq":{"w":"3","c": "32347"}}

我注意到,一旦我的 grok 在其中一条消息中找到匹配项,它只会显示该消息,在本例中是第一个消息。 是否可以全部捕获 6 个并将其发送到 Kibana?

如果有任何建议,我将不胜感激。 我是 grok 的新手,我尝试了我在 google 中找到的所有内容,但似乎对这种特殊情况没有任何效果。

谢谢。

【问题讨论】:

    标签: logging grok


    【解决方案1】:

    如果你知道总是有 6 条消息,你可以使用这样的东西:

    "message":(\[%{QS:message_1},%{QS:message_2},%{QS:message_3},%{QS:message_4},%{QS:message_5},%{QS:message_6},%{QS:a_string}\]),"seq":{"w":"3","c":"32347"}}
    

    如果你想把它们分开,你可以这样做:

    "message":(\[%{DATA:time} %{DATA:string_1} %{DATA:string_2} %{DATA:time} %{DATA:text_1},%{DATA:time} %{DATA:string_1} %{DATA:string_2} %{DATA:time} %{DATA:text_2},%{DATA:time} %{DATA:string_1} %{DATA:string_2} %{DATA:time} %{DATA:text_3},%{DATA:time} %{DATA:string_1} %{DATA:string_2} %{DATA:time} %{DATA:text_4},%{DATA:time} %{DATA:string_1} %{DATA:string_2} %{DATA:time} %{DATA:text_5},%{DATA:time} %{DATA:string_1} %{DATA:string_2} %{DATA:time} %{DATA:text_6},%{QS:a_string}\]),"seq":{"w":"3","c":"32347"}}
    

    您可以在http://grokdebug.herokuapp.com/进行测试

    【讨论】:

    • 日志的问题是它可能包含不同数量的消息,从 1 到有时 20,到目前为止我已经看到了。如果我确实使用了您的第一个选项,我可以进一步过滤每条消息吗?即:match => { "message_1" => "" match => { "message_2" => "" 等等等等。
    • 你不能用 grok 模式来做到这一点,只能在你的配置文件中使用规则。看到这个 (stackoverflow.com/questions/41385831/…) 使用 grok 你只能预测消息的最大数量并添加这个 (?:|%{QS:message},) 所以你的代码将是 "message":(\[%{QS:message},(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)(?:|%{QS:message},)%{QS:a_string}\]),"seq":{"w":"3","c":"32347"}} 用于 10 条消息等。但是你会有空结果
    • 谢谢,roodyCool。我会尽量理解这个建议和其他问题。
    • 嗨@roodyCool。您建议的 grok 模式在 grok 调试器 ==> ([%{QS:user_msg1},)(?:|%{QS:user_msg2},)(?:|%{QS:user_msg3},)(?:| %{QS:user_msg4},)(?:|%{QS:user_msg5},)(?:|%{QS:user_msg6},)(?:|%{QS:user_msg7},)(?:|%{ QS:user_msg8},)(?:|%{QS:user_msg9},)(?:|%{QS:user_msg10}]),%{NOTSPACE}
    • 非常感谢您的帮助。 :) 但是,当我将它应用到logstash 时,我收到以下错误:“预期为#, \", ', -, [, { grok { match => { "message" => ([% {QS:user_msg1},)(?:|%{QS:user_msg2},)(?:|%{QS:user_msg3},).....(?:|%{QS:user_msg10}])," %{NOTSPACE}"} } 我检查了所有 [, {, }, ] 并且它们都匹配。我尝试了所有建议的预期迹象,但没有。您知道导致错误的原因吗?
    猜你喜欢
    • 1970-01-01
    • 2016-04-02
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多