
Wazuh Logcollector 模块深度解析日志采集器的配置、调优与源码实现【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuhWazuh 通过 Logcollector 模块在受监控端点上采集系统日志、应用日志和事件日志并实时转发给 Wazuh 服务端进行解码与规则匹配。本文基于 Wazuh 仓库中的官方模块文档模块概述、采集器列表、配置参考并结合同仓 C 源码实现完整讲解六种核心日志采集器的适用场景、localfile/socket全部配置参数、logcollector.*内部选项的默认值与调优方法以及常见故障的排查路径。1. 模块定位与工作原理日志采集是安全运营的基础环节安全团队依赖统一的日志汇聚来完成合规审计、威胁检测与漏洞修复定位。Wazuh 的日志采集链路分两级Agent 端Logcollector 模块运行在被监控端点上的 Wazuh agent 中的wazuh-logcollector守护进程负责从本地日志源读取事件并转发给 Wazuh server。除文件型日志外还可以配置第三方通过 API 或 socket 把日志消息直接发给 serverServer 端Wazuh server 使用解码器decoders和规则rules实时分析收到的日志提取关键字段并生成告警。从源码结构看Logcollector 是一个独立的 agent 守护进程源码位于 src/logcollector核心组成如下主循环与线程池约 3000 行实现输入/输出线程池、消息队列与文件状态管理每个log_format对应一个读取器实现如 read_syslog.c、read_json.c、read_journald.c、read_macos.c、read_win_event_channel.c、read_win_el.c、read_multiline.c、read_command.c、read_audit.c 等state.c 负责维护采集状态文件lccom.c 实现远程命令通道对应logcollector.remote_commands选项。1.1 线程模型与消息队列logcollector.h 中的全局定义揭示了模块的并发架构#define N_MIN_INPUT_THREADS 1 #define N_OUPUT_THREADS 1 #define OUTPUT_MIN_QUEUE_SIZE 128 #define WIN32_MAX_FILES 200输入端由w_input_thread线程池负责读取各日志文件线程数由logcollector.input_threads控制默认 4最小 1输出端由w_output_thread单线程将消息推送至消息队列哈希表w_msg_queues_table队列最小容量 128logcollector.queue_size下限文件读位点持久化在queue/logcollector/file_status.json中记录每个文件的path、hashSHA1与offset见 logcollector.h#L26-L37保证 agent 重启后从上次位置续读。这一多输入线程 队列 单输出线程的结构意味着调优时输入线程数影响读取吞吐队列大小影响突发日志的缓冲能力二者正是文档中Performance Tuning一节调参的原理依据。2. 六种核心日志采集器collectorsLogcollector 通过ossec.conf中的localfile块声明每个日志源log_format决定使用哪个采集器。各采集器对照表如下完整文档见 collectors.mdFormat支持系统说明syslogLinux、macOS、Windows纯文本日志文件一行一个事件jsonLinux、macOS、WindowsJSON 编码日志文件一行一个对象eventchannelWindows通过 EventChannel APIEvtSubscribe/EvtRender读取 Windows 事件日志Vista 及以上eventlogWindows通过OpenEventLog/ReadEventLogAPI 读取兼容所有 Windows 版本macosmacOSmacOS 统一日志系统ULS底层调用logCLIjournaldLinuxsystemd journal除上述六种外配置参考还列出了command、full_command、audit、nmapg、mysql_log、postgresql_log、djb-multilog、multi-line等扩展格式源码中同样能看到对应的独立读取器实现文件一一印证。2.1 syslog — 纯文本文件逐行读取纯文本日志是大多数 Linux/macOS 日志的标准格式localfile location/var/log/auth.log/location log_formatsyslog/log_format /localfilelocation支持三类取值静态路径、基于日期strftime格式的命名模式、通配符模式。2.2 json — JSON 日志文件逐行读取 JSON 对象解析失败的行会被静默丢弃。若配置了labels标签会在事件转发前注入到每个 JSON 对象中localfile location/var/log/app.json/location log_formatjson/log_format /localfile2.3 eventchannel — Windows 事件通道使用 EventChannel API 订阅 Windows 事件Vista 及以上可用。默认监控System、Application、Security三个通道Windows 暴露的任意通道都可以通过location添加。可用query元素执行 XPath 查询做事件过滤localfile locationSecurity/location log_formateventchannel/log_format /localfile事件输出格式的重要变化在 Wazuh 4.x 中agent 将每个事件包装为包含Message与Event原始 XML的 JSON 对象从Wazuh 5.0 起agent 直接转发EvtRender()返回的原生 Windows 事件 XML与 Windows 事件查看器的导出格式一致Event xmlnshttp://schemas.microsoft.com/win/2004/08/events/event System Provider NameMicrosoft-Windows-Security-Auditing Guid{54849625-5478-4994-a5ba-3e3b0328c30d}/ EventID4624/EventID ChannelSecurity/Channel ComputerHOST/Computer Security/ /System EventData Data NameSubjectUserNameSYSTEM/Data Data NameLogonType5/Data ... /EventData /Event与旧格式的关键差异无?xml version1.0 encodingUTF-8?声明Event为根元素命名空间与属性完全保留 EventChannel API 的原样输出。该标准化让下游处理更统一也使转发事件可与事件查看器原生导出直接比对。注意此变化仅影响 Windows agentlog_formateventchannel/log_format配置本身不变。2.4 eventlog — 传统 Windows 事件日志通过OpenEventLog/ReadEventLogAPI 读取兼容所有 Windows 版本覆盖Application、Security、System日志localfile locationApplication/location log_formateventlog/log_format /localfile对于 Vista 及以上系统官方建议优先使用eventchannel——它能访问更多通道且事件元数据更丰富。2.5 macos — macOS 统一日志系统ULS底层调用 macOSlogCLI对应源码 read_macos.c 与 macos_log.c。每个 agent 只允许一个log_formatmacos的localfile块localfile locationmacos/location log_formatmacos/log_format query typelog,trace levelinfoprocess sshd/query /localfilequery属性说明type逗号分隔列表取值为activity、log、tracelevel最低日志级别取值为default、info、debug查询体为谓词表达式可使用process、subsystem、category、message等字段。2.6 journald — systemd journal采集 Linux systemd journal 条目使用filter元素按 journal 字段过滤。过滤值按PCRE2 正则表达式编译精确匹配请加锚点^、$localfile locationjournald/location log_formatjournald/log_format filter fieldSYSLOG_IDENTIFIER^sshd$/filter /localfile可配置多个filter元素叠加过滤。journal 的底层封装在 journal_log.c 中实现read_journald.c 作为读取器对接主循环。3.localfile配置项完整参考Logcollector 模块为Agent-only模块配置文件位于/var/ossec/etc/ossec.conf涉及localfile与socket两个 XML 节内部选项前缀为logcollector.*。以下参数说明继承自 配置参考文档3.1 location日志文件路径或日志源标识。必填无默认值。允许取值静态文件路径如/var/log/syslogstrftime日期模式如/var/log/app-%y-%m-%d.log通配符模式如/var/log/app*.logWindows 环境变量仅 Windows如%WINDIR%\Logs\file.log特殊值macosULS、journaldsystemd journalWindows 事件通道名如Application、Security、System具体取决于log_format的取值。3.2 log_format决定日志源如何被读取和解析。必填。允许取值取值含义syslog纯文本日志一行一个事件jsonJSON 日志一行一个对象eventchannelWindows 事件通道VistaeventlogWindows 事件日志全版本兼容macosmacOS ULSjournaldsystemd journalcommand命令输出full_command命令完整输出含空行auditLinux audit 日志nmapgNMAP grepable 输出mysql_logMySQL 日志postgresql_logPostgreSQL 日志djb-multilogDJB multilog 格式multi-line多行日志条目3.3 query事件过滤仅用于 Windows Event Channel 与 macOS ULS。WindowsXPath 查询或简单事件 ID 过滤如Event/System[EventID7040]也支持完整 QueryList XML 格式macOS谓词表达式配合type/level属性query typelog levelinfosubsystem com.apple.securityd/query3.4 filter仅 journald按 journal 字段过滤格式为filter fieldFIELD_NAME^regex_pattern$/filter值按 PCRE2 编译支持多个 filter 叠加。3.5 其余参数速查参数默认值说明only-future-eventsyes仅 Windows Event Channel。yes只采集 agent 启动后产生的事件no处理通道中全部历史事件target无发往标准分析队列指定路由目标 socket 或文件用于自定义处理管道out_format无转发前的自定义输出格式模板ignore_binariesno通配符展开时跳过疑似二进制文件labels无为事件附加自定义标签label keykey_namevalue/labelJSON 日志中直接注入对象其他格式作为元数据附加age无读取全部通配符场景下只读取不超过指定年龄如1d、12h、30m的文件exclude无通配符场景下排除匹配该正则的文件reconnect_time5s日志源断连后重连等待时间socket、command 类来源4.socket配置节socket节让 agent 监听指定 socket 接收外部发来的日志消息是通过第三方 API 集成把日志发给 Wazuh链路的端点侧配置参数默认值说明name无必填Unix socket 路径Linux/Unix或命名管道名Windowslocation无name的别名二者互斥必须指定其一modetcptcp或udpprefix无为收到的消息添加前缀便于标识来源socket name/var/run/custom.sock/name modetcp/mode prefixcustom-app/prefix /socket5.logcollector.*内部选项与默认值内部选项配置在/var/ossec/etc/internal_options.confLinux/Unix或C:\Program Files (x86)\ossec-agent\internal_options.confWindows用户可用local_internal_options.conf覆盖。仓库自带模板 etc/internal_options.conf 中的实际默认值与文档完全一致摘录如下选项默认值取值范围说明logcollector.loop_timeout2秒正整数检测日志文件变化的检查间隔logcollector.open_attempts0无限重试2–998或0打开日志文件失败前的重试次数logcollector.remote_commands00/1是否接受 manager 远程命令修改采集配置logcollector.vcheck_files64秒0–1024文件元数据轮转、删除检查间隔logcollector.max_lines10000100–10000000禁用单文件单次迭代最多读取行数防止繁忙日志独占处理时间logcollector.max_files10001–100000同时监控的文件数上限logcollector.sock_fail_time300秒1–3600socket 连接失败后的重试等待logcollector.input_threads4正整数读文件线程数高吞吐场景可调大logcollector.queue_size1024128–220000内部输出队列大小更大可提升突发处理但占用更多内存logcollector.sample_log_length64字符1–4096错误消息中日志样本的最大长度logcollector.rlimit_nofile11001024–1048576文件描述符上限必须高于max_fileslogcollector.force_reload00/1周期性关闭并重新打开文件句柄适配某些日志轮转方案logcollector.reload_interval64秒1–86400强制重载间隔须 ≥vcheck_files仅force_reload1时生效logcollector.reload_delay1000毫秒0–30000强制重载中关闭与重开之间的延迟避免竞态logcollector.exclude_files_interval86400秒1–172800排除文件列表的刷新间隔logcollector.state_interval60秒0–36000禁用状态文件更新间隔logcollector.debug00/1/2调试级别0 无输出2 全量调试6. 配置实战示例以下示例继承自官方配置文档覆盖最常见的部署场景JSON 应用日志 自定义标签localfile location/var/log/app.json/location log_formatjson/log_format labels label keyappmyapp/label label keyenvironmentproduction/label /labels /localfile日期滚动日志strftimelocalfile location/var/log/application-%y-%m-%d.log/location log_formatsyslog/log_format /localfile通配符 排除 文件年龄监控所有app*.log排除.old结尾且只读 7 天内的文件localfile location/var/log/app*.log/location log_formatsyslog/log_format exclude\.old$/exclude age7d/age /localfileWindows 事件通道按事件 ID / 级别过滤!-- 按事件 ID 过滤 -- localfile locationSystem/location log_formateventchannel/log_format queryEvent/System[EventID7040]/query /localfile !-- 仅错误与严重事件Level3 -- localfile locationSystem/location log_formateventchannel/log_format query QueryList Query Id0 PathSystem Select PathSystem*[System[(Levellt;3)]]/Select /Query /QueryList /query /localfilemacOS ULS 多条件谓词localfile locationmacos/location log_formatmacos/log_format query typetrace,log,activity levelinfo (process sudo) or (process sessionlogoutd and message contains logout is complete.) or (process sshd) /query /localfile通过 journald 监控 Docker 容器日志localfile locationjournald/location log_formatjournald/log_format filter fieldCONTAINER_NAME^my-container$/filter /localfile多行日志如 Java 堆栈与命令输出localfile location/var/log/app.log/location log_formatmulti-line/log_format /localfile localfile log_formatcommand/log_format commanddf -h/command frequency360/frequency /localfile7. 性能调优官方文档给出的三类调优组合配置在internal_options.conf高日志量场景——增大线程与队列logcollector.input_threads8 logcollector.queue_size4096 logcollector.max_lines50000监控大量文件——提高文件上限注意rlimit_nofile必须大于max_fileslogcollector.max_files5000 logcollector.rlimit_nofile5500慢速/不稳定文件系统——放宽定时参数并启用强制重载logcollector.loop_timeout5 logcollector.vcheck_files120 logcollector.force_reload1 logcollector.reload_interval300这些参数分别对应源码主循环中的全局变量loop_timeout、vcheck_files、maximum_lines、force_reload、reload_interval见 logcollector.h#L209-L222调参即直接改变主循环的轮询与重载节奏。8. 监控与状态检查查看采集状态文件对应 state.c 写出的状态间隔由logcollector.state_interval控制# Linux/Unix cat /var/ossec/var/run/wazuh-logcollector.state # Windows type C:\Program Files (x86)\ossec-agent\wazuh-logcollector.state查看 Logcollector 运行日志# Linux/Unix tail -f /var/ossec/logs/ossec.log | grep logcollector # Windows Get-Content C:\Program Files (x86)\ossec-agent\ossec.log -Wait | Select-String logcollector临时开启调试在local_internal_options.conf中加入logcollector.debug2后重启 agentecho logcollector.debug2 /var/ossec/etc/local_internal_options.conf systemctl restart wazuh-agent9. 故障排查文件未被监控确认 agent 用户wazuh或ossec有读权限ls -la file用grep -A5 location... /var/ossec/etc/ossec.conf核对配置检查是否触及max_files上限。CPU 占用过高降低检查频率loop_timeout5、vcheck_files120、限制突发读取max_lines5000、低配机器下调线程数input_threads2。事件未被转发适当增大queue_size用/var/ossec/bin/agent_control -ls验证 agent 连接检查agent.conf中是否设置了 EPS每秒事件数限流。Windows 事件通道问题用Get-WinEvent -ListLog * | Select-String ChannelName确认通道存在若需采集历史事件将only-future-events设为nolocalfile locationSecurity/location log_formateventchannel/log_format only-future-eventsno/only-future-events /localfilemacOS ULS 采不到日志确认 agent 拥有完整磁盘访问权限可先用log show --predicate process sshd --info手工验证谓词再次确认 agent 中只有一个log_formatmacos的localfile块。Socket 连接失败确认 socket 路径存在ls -la /var/run/custom.sock、权限正确chmod 660chown wazuh:wazuh并可将logcollector.sock_fail_time60缩短重试间隔。10. 小结Logcollector 是 Wazuh agent 上唯一负责日志进的模块它用统一而简洁的localfile/socket配置模型覆盖纯文本、JSON、Windows 事件、macOS ULS、systemd journal、命令输出与 socket 七类来源再配以十余个logcollector.*内部选项完成吞吐、文件轮转与资源上限的精细控制。理解其多输入线程读取 → 队列缓冲 → 单输出线程转发的线程模型后调优与排障都有明确的落点读慢看线程与loop_timeout突发丢事件看queue_size与max_lines轮转异常看force_reload三件套。完整的模块文档可继续参考 README、采集器 与 配置参考源码实现在 src/logcollector。【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考