You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wazuh子解码器在Phase-2阶段后未执行的问题求助

关于Wazuh子解码器仅执行第一个的问题

尝试用Wazuh解码器解析以下日志:

received a login at 23:45:32 for user marc from 10.10.10.1

正则表达式已在线验证有效,但prematch解码器下的子解码器仅第一个生效,第二个子解码器始终不执行;调换子解码器顺序后,也只有排在前面的子解码器生效,后续的被忽略。将第一个子解码器的正则合并后能提取多个字段,但第二个子解码器仍被忽略。

原始解码器配置

<!--
日志内容:
received a login at 23:45:32 for user marc from 10.10.10.1
-->
<decoder name="loginLog">
  <prematch>login</prematch>
</decoder>

<decoder name="loginLog-time">
  <parent>loginLog</parent>
  <regex type="pcre2">login at (\S+) for</regex>
  <order>time</order>
</decoder>
 
<decoder name="loginLog-user">
  <parent>loginLog</parent>
  <regex type="pcre2">for user (\S+) from</regex>
  <order>user</order>
</decoder>

对应logtest输出

echo "received a login at 23:45:32 for user marc from 10.10.10.1" | /var/ossec/bin/wazuh-logtest
Starting wazuh-logtest v4.14.0
Type one log per line


**Phase 1: Completed pre-decoding.
        full event: 'received a login at 23:45:32 for user marc from 10.10.10.1'

**Phase 2: Completed decoding.
        name: 'loginLog'
        time: '23:45:32'                    <= 仅第一个子解码器生效

合并子解码器后的配置

<decoder name="loginLog">
  <prematch>login</prematch>
</decoder>
<decoder name="loginLog-time">
  <parent>loginLog</parent>
  <regex type="pcre2">login at (\S+) for user (\w+) from</regex>
  <order>time, user</order>
</decoder>
<decoder name="loginLog-user">
  <parent>loginLog</parent>
  <regex type="pcre2">for user (\S+) from</regex>
  <order>user</order>
</decoder>

合并后的logtest输出

**Phase 1: Completed pre-decoding.
        full event: 'received a login at 23:45:32 for user marc from 10.10.10.1'

**Phase 2: Completed decoding.
        name: 'loginLog'
        dstuser: 'marc'                      <= \
        time: '23:45:32'                     <=  仅合并后的子解码器生效,第二个子解码器被忽略

问题原因与解决方案

原因

Wazuh的子解码器逻辑是匹配即停止:当父解码器匹配成功后,会按顺序遍历其子解码器,只要有一个子解码器匹配成功,就会终止后续子解码器的检查,不会继续执行其他同层级的子解码器。

解决方案

方案1:使用链式解码(推荐用于拆分复杂解码器)

将后续子解码器的parent设置为前一个子解码器的名称,形成链式调用,这样第一个子解码器匹配后,会继续执行它的子解码器:

<decoder name="loginLog">
  <prematch>login</prematch>
</decoder>

<decoder name="loginLog-time">
  <parent>loginLog</parent>
  <regex type="pcre2">login at (\S+) for</regex>
  <order>time</order>
</decoder>
 
<decoder name="loginLog-user">
  <parent>loginLog-time</parent> <!-- 修改parent为前一个子解码器的名称 -->
  <regex type="pcre2">for user (\S+) from</regex>
  <order>user</order>
</decoder>

方案2:单个子解码器提取所有字段

如果日志格式固定,可在一个子解码器中用正则一次性提取所有需要的字段:

<decoder name="loginLog">
  <prematch>login</prematch>
</decoder>

<decoder name="loginLog-details">
  <parent>loginLog</parent>
  <regex type="pcre2">login at (\S+) for user (\S+) from (\S+)</regex>
  <order>time, user, srcip</order>
</decoder>

验证

使用wazuh-logtest测试链式解码配置,即可同时提取time和user字段。

内容的提问来源于stack exchange,提问作者user2593869

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:24:54