ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Visual Syslog源码解析(三):规则匹配引擎TMessMatch的位掩码设计全解读

Visual Syslog源码解析(三):规则匹配引擎TMessMatch的位掩码设计全解读 Visual Syslog源码解析三规则匹配引擎TMessMatch的位掩码设计全解读【免费下载链接】visualsyslogSyslog Server for Windows with a graphical user interface项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslogVisualSyslog 是一款带图形界面的Syslog 服务器而它三大核心功能——全局日志过滤、消息高亮、消息处理规则——背后共用同一个轻量级规则匹配引擎 TMessMatch。本文带你完整解读这个引擎如何用**位掩码bitmask**设计以两个整型变量搞定 8 种优先级和 24 种设施的任意组合匹配。一、一个类撑起三套功能在 VisualSyslog 源码中TMessMatch被嵌入到三个上层模块里扮演条件判断器的角色上层模块文件作用主窗口全局过滤main.h只显示匹配规则的日志高亮规则messhl.hTMessHighlight Match Style按规则着色处理规则messprocessing.hTMessProcessRule Match Process触发报警/转发/存文件也就是说你在界面上勾选的每一个复选框、填写的每一行关键词最终都会变成TMessMatch里的几个字段。主窗口中每条收到的日志都会调用 MessMatch.Match(sm) 做一次判断不匹配的直接丢弃不显示。二、位掩码设计用 2 个整数表示任意组合核心定义在 messmatch.h#define PriorityMaskAll 0xFF // 8 种优先级 #define FacilityMaskAll 0x00FFFFFF // 24 种设施为什么用位掩码Syslog 协议中 PRI 字段低 3 位是优先级、高 28 位是设施见 syslog.h。如果要用传统方式表示匹配 err 或 warning 两种优先级你得写一个枚举数组而位掩码方案下每一位对应一个取值勾不勾选就是 0 或 1勾选 emerg →0x01勾选 alert →0x02……两者都勾就是0x03全部不勾 0什么都不匹配全勾 0xFF全匹配这就是为什么默认值全匹配可以直接定义为0xFF和0xFFFFFF一个常量表达任何值都通过。匹配时的核心运算真正执行判断的是 LocalMatch只需两次左移 按位与if( ((1LOG_PRI(p-PRI)) PriorityMask) 0 ) return false; if( ((1LOG_FAC(p-PRI)) FacilityMask) 0 ) return false;其中LOG_PRI(p) p 0x07取出优先级编号LOG_FAC(p) ((p) 0x03F8) 3取出设施编号syslog.h。把1左移 N 位得到只有一位为 1 的数再与掩码做与运算——为 0 说明该位没被勾选直接判定不匹配。整个过滤判断不循环、不查表两条指令级的开销这正是位掩码的性能优势。 细节若消息本身没有 PRI 字段p-PRI -1会跳过掩码判断直接放行到文本规则——对非标准格式日志更宽容。三、双层文本规则AND 与 OR 的嵌套逻辑掩码只解决元数据过滤TMessMatch还提供了两条文本规则见 messmatch.hPriorityMask AND FacilityMask AND 规则1 AND 规则2 └─ 规则1 规则2用 AND 连接每条规则由三部分组成Field字段0-全文、1-消息体、2-IP、3-主机名、4-Facility、5-Tag覆盖 6 个常用字段Contains是否包含true为包含/等于false取反NOT contains / 不等于Text关键词列表多行文本行与行之间是 OR 关系——只要命中任意一行即算通过这种行间 OR、行间组之间 AND的结构非常实用例如规则 1 写login failed/auth denied两行规则 2 选 Tag sshd就精确表达了来自 sshd 的登录失败或认证拒绝消息。Tag 字段的小巧思匹配 Tag 时messmatch.cpp会自动剥离[PID]后缀日志里 Tag 常带进程号如sshd[1234]剥离后再比较避免用户必须写死进程号。大小写敏感由MatchCase统一控制开启时用Pos()精确查找关闭时双方转大写再比对FieldContains。四、bNot 取反一个布尔位实现排除规则TMessMatch::Match的完整逻辑只有 6 行messmatch.cppbool TMessMatch::Match(TSyslogMessage * p) { bool rv LocalMatch(p); if( bNot ) return ! rv; return rv; }bNot true时结果整体取反对应界面里的 Negation (apply logical NOT) 复选框。这让你能写出匹配除 sshd 之外的所有消息这类排除型规则而无需把逻辑分散到各个上层模块。五、界面与数据模型的双向同步上图右侧的 Priorities / Facilities 复选框列表就是位掩码的可视化形态。双向转换逻辑非常简洁messmatchframe.cppFromDialog界面→数据逐位累加p-PriorityMask | PriorityLB-Checked[i] ? (1i) : 0;把勾选状态打包成掩码ToDialog数据→界面反向展开PriorityLB-Checked[i] p-PriorityMask (1i);注意一个小技巧下拉框的 FieldContains 被合并编码成单个索引Field1 * 2 (Contains1 ? 0 : 1)读回时再除 2、取余 1 拆成两个值用一个 ComboBox 省掉了两个控件。六、XML 持久化与旧版配置兼容规则以 XML 形式存盘Save字段名直白not、prioritymask、facilitymask、field1、text1等。更值得称道的是 Load 中的向后兼容逻辑老版本配置存的是单值priorityoperationp0-等于 / 1-小于等于 / 2-大于等于加载时自动展开为位掩码case 1: // (to emerg) for(int i0; iPriority; i) PriorityMask | 1Priority;即匹配该级别及更紧急的级别被转换为对应位的集合老用户升级后规则无缝生效。此外GetDescription()messmatch.cpp把掩码反向翻译成人类可读文本——遍历每一位拼出Priority (err) OR (warning) AND Tag sshd这样的描述串显示在主窗口过滤标签和规则列表的预览列中IsAllMatch 则靠判断描述是否等于All messages match快速识别未设置过滤状态。七、总结设计点实现收益优先级匹配BYTE PriorityMask(1n) maskO(1) 判断任意组合设施匹配DWORD FacilityMask24 位同左24 种设施全覆盖文本规则字段枚举 多行 OR 列表双层 AND表达力接近小型 DSL取反单一bNot布尔位排除规则零成本持久化XML 旧格式自动迁移平滑升级TMessMatch总共不到 400 行代码却以位掩码 双层规则的组合支撑起 VisualSyslog 的过滤、高亮、处理三大功能。对于想学习如何用最小数据结构表达组合条件的开发者这是非常值得精读的范例。【免费下载链接】visualsyslogSyslog Server for Windows with a graphical user interface项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表