Server Log Filter

Hide noisy server console lines from the MCDR console with configurable regex rules, without touching the server's own log file.

management

Installation command

!!MCDR plugin install server_log_filter

Author

Synced at

...

Last update

...

Latest version

Total downloads

44

Back to catalogue

ServerLogFilter-v1.1.0.mcdr

Version

1.1.0

Date

October 4, 2026

Size

27.80 KiB

Downloads

3

MD5

2e8991f7680afadb57cb92ca2f40bf0e

SHA256

47caab8924d41d181a4dc2a056565fec471517812466bcaef9b6f203092c1c2a

MCDR Plugin Dependencies

Plugin IDRequirement
mcdreforged>=2.15.0

Python Package Requirements

Python PackageRequirement

none

新增:零命中规则提醒 + 灾难性回溯防护

这一版加了两样东西,目标都是同一个:让过滤配置保持干净,同时不把插件变重。

1. 零命中规则提醒

某条规则如果连续若干个开服周期一次都没命中,它多半已经没用了——要么是正则写错, 要么是它要过滤的那段日志已经不再产生。达到阈值后,插件会在下一次开服完成 (服务端打印 Done)之后给出一次提醒,不会被淹没在开服日志里:

==================================================================
[ServerLogFilter] 注意:有 1 条过滤规则连续 3 次及以上开服都没有命中
  · standing on air - force-sending blocks below
      已连续 3 次开服零命中;自启用以来从未命中过
  通常只有两种可能:
    1. 这条正则写错了(拼写 / 大小写 / 转义,或与当前服务端版本不匹配)
    2. 这段日志已经不再产生(例如上游 bug 已被修复)
  建议:用 !!logfilter test <一行日志> 验证规则是否还匹配;
        确认无用后从配置的 patterns 里删除该条,
        若确认只是「本来就罕见」可调大 stale_rule_threshold,
        或用 !!logfilter reset 清空计数重新观察。
==================================================================
  • 新配置:warn_about_stale_rules(默认 true)、stale_rule_threshold(默认 3,设 0 关闭)
  • 统计写在 config/server_log_filter/state.json,与你自己维护的 config.json 分开, 插件不会改动后者
  • 新命令:!!logfilter reset(admin),清空连续零命中计数重新观察
  • !!logfilter 的状态输出里会标出每条规则的连续零命中次数

两个容易被忽略、但关系到提醒是否可信的保护:

  • 只统计「真正完成过启动」的周期。 否则服务端连续几次启动失败(比如 mod 报错) 会把所有规则刷成零命中,提醒就变成误导。
  • 热重载会接续统计。 !!MCDR reload plugin 时,命中次数与「本周期的启动已完成」 标记都会被带到新实例,一个正常命中的周期不会被切成两段而误判成零命中。

2. 灾难性回溯防护

真正的性能风险不是规则条数,而是写坏的正则。带嵌套量词的表达式在匹配失败时 回溯是指数级的,实测单一行:

模式输入长度单行耗时
(a+)+$22188 ms
(a+)+$273.0 秒
`^(aa)*$`25

足以冻结 MCDR 主线程。现在载入时会用几个很短的探测串试跑每条规则,超预算的规则 会被跳过并给出明确报错:

  • 新配置:validate_patterns(默认 true)、pattern_probe_timeout_ms(默认 25)
  • 参数是标定出来的:4 类常见危险写法在探测串上耗时 190~380 ms,全部被拦下; 8 种真实写法最坏仅几微秒——余量约 9000 倍,不会误伤正常规则

关于「性能」的一句实话

上面第 1 项功能常被期待能「减少过滤带来的性能负担」。实测数据不支持这个说法, 所以文档里没有这样写:

规则数单行耗时1000 行/秒时 CPU 占用
1 条0.19 µs0.019%
5 条0.45 µs0.045%
25 条1.70 µs0.17%

对照:MCDR 自己解析同一行要 2.13 µs,本插件只占其中约 9%。 即便按 1000 行/秒的极端突发(真实小服通常 10~100 行/秒),每小时累计也只有 0.67 秒。 删掉一条用不到的规则所省下的时间,远低于测量噪声。

所以这个功能的价值是配置卫生——尽早发现写错的规则、以及发现「已经没必要再过滤了」的规则。 真正会拖慢服务端的是上面第 2 项处理的问题。

以上数字都可用仓库里的 benchmarks/bench_filter.py 自行复现。

兼容性

最低 MCDR 版本要求没有变化,仍是 2.15.0。

本次功能用到的 API(save_config_simple、带 file_name 的 load_config_simple、 嵌套 Serializable、on_server_startup)经逐版本检查,自 MCDR 2.13.0 起就全部存在; 门槛仍只由 InfoActionFlag(2.15.0 才引入)决定。

MCDR 版本结果
2.13.0 / 2.14.1仍由 MCDR 原生依赖检查明确拦截:依赖项 [email protected] 不满足版本约束 >=2.15.0
2.15.0(最低支持)加载、过滤、零命中提醒、状态文件、命令(含 !!logfilter reset)全部实测通过
2.15.7 / 2.16.0同上,全部通过

在 2.15.0 / 2.15.7 / 2.16.0 上,12 项检查逐项一致(提醒出现时机、提醒内容、 session_index 与连续零命中计数的推进、状态文件写入、命令树注册),零运行时异常。

Minecraft 侧结论不变:过滤在 MCDR 侧完成,与 MC 版本无耦合。

安装

下载下方的 ServerLogFilter-v1.1.0.mcdr,放进 MCDR 实例的 plugins/ 目录即可; 运行中的实例可用 !!MCDR reload plugin server_log_filter 热重载。

首次启动会生成配置文件 config/server_log_filter/config.json,新增的字段会自动补齐默认值, 原有配置无需改动。

SHA256:47caab8924d41d181a4dc2a056565fec471517812466bcaef9b6f203092c1c2a