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

如何用C++实现Minecraft server.jar终端输出的逐行过滤采集

逐行采集筛选Minecraft服务端日志的C++实现方案

核心用到的函数

  • 进程输出捕获:POSIX环境优先用popen(),直接执行java -jar server.jar nogui启动服务端同时绑定输出管道,返回的FILE*可直接读取输出;Windows环境可使用CreatePipe() + CreateProcess()组合实现标准输出/错误流的重定向
  • 逐行读取:可直接用C标准库的fgets()读管道流,也可将管道包装为C++标准库的std::istream后调用std::getline()实现按行读取
  • 内容筛选:简单字符串匹配用std::string::find()即可,复杂规则(比如提取玩家ID、报错码)可引入C++11新增的<regex>库,调用std::regex_search()做正则匹配
  • 结果输出:筛选后的日志可通过std::ofstream写入本地持久化文件,也可调用系统socket函数上报到监控系统

触发采集的优化方案

要实现仅当server.jar运行时才启动采集,可根据你的使用场景二选一:

  1. 可自主控制服务端启动流程:直接将采集程序作为父进程,拉起server.jar作为子进程,采集逻辑随子进程启动而启动、随子进程退出而终止,无任何额外空耗,效率最高
  2. 服务端由第三方脚本启动无法修改:
    • 轻量实现可做低频率进程轮询:POSIX环境调用popen("ps -ef")扫描进程列表匹配java .*server.jar特征,Windows环境调用CreateToolhelp32Snapshot()遍历进程快照匹配,匹配到运行中的服务端才启动采集逻辑,未匹配到直接休眠,可将轮询间隔设为10~30秒,资源消耗几乎可忽略
    • 零空耗实现可监听系统事件:Linux环境用inotify监听server.jar文件的执行事件,Windows环境用WMI监听进程创建事件,触发对应事件时再启动采集

补充说明:如果服务端已经配置了log4j输出日志到本地文件,也可以直接监听日志文件的增量写入,Linux用inotify监听文件修改事件,Windows用ReadDirectoryChangesW监听,只读取新增的行做筛选,无需修改服务端启动流程,适配性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:45:03