xiaozheng666QQ
使用dispatchCommand执行命令后如何获取在控制台输出的内容而不是返回boolean



土球球
控制台输出的内容属于供人类阅读的内容,插件本身不应依赖任何类似的输出。
不过办法还是有的,监听输出消息的事件(不写 Bukkit,不清楚是啥),然后拿到数据就行了。

轻光233
https://github.com/Light-Light/RemoteControl-Plugin/blob/master/src/com/qing_guang/RemoteControl/plugin/setout/Recorder.java
如果你愿意的话,可以看一下我的源码,里面有获取控制台所有输出的方法
你可以在dispatch之前先注册,之后再删掉(不知道能不能删,看log4j吧)

xiaozheng666QQ
土球球 发表于 2019-10-6 21:00
控制台输出的内容属于供人类阅读的内容,插件本身不应依赖任何类似的输出。
不过办法还是有的,监听输出消 ...

文档里面没找到

xiaozheng666QQ
轻光233 发表于 2019-10-6 21:06
https://github.com/Light-Light/RemoteControl-Plugin/blob/master/src/com/qing_guang/RemoteControl/plu ...

你这个有点没看懂

a1294790523
本帖最后由 a1294790523 于 2019-10-7 01:25 编辑

听说这个是个搞事的问题(
  1.                     ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).addAppender(new AbstractAppender("commandLogger",null, null) {
  2.                         @Override
  3.                         public void append(LogEvent logEvent) {
复制代码

研究了一下,大概是获取log4j的rootlogger,然后添加Appender并重写这个方法,在命令执行时令某个boolean为true然后获取数据即可
但是这个不能确保是命令返回的数据,所以你应该还得加个标识符什么的

xiaozheng666QQ
a1294790523 发表于 2019-10-7 01:24
听说这个是个搞事的问题(

研究了一下,大概是获取log4j的rootlogger,然后添加Appender并重写 ...

没听懂,可能我太笨,大佬能否写个完整的例子

轻光233
本帖最后由 轻光233 于 2019-10-7 08:54 编辑
xiaozheng666QQ 发表于 2019-10-7 02:31
没听懂,可能我太笨,大佬能否写个完整的例子

spigot还是craftbukkit还是minecraft原版服务器,具体哪个我也不清楚,使用的日志记录框架是log4j
log4j里的日志消息监听是靠的Appender
Appender是一个接口,里面有几个你需要重写的方法,如果你不想自己实现其他的方法(大多数情况下不想),就可以让一个新建的类继承AbstractAppender类,并且重写append(LogEvent)方法
LogEvent里面有什么东西可以自己百度,然后在这个方法里写你自己想写的代码
我上面的github项目就是将新获取的一个信息添加到一个50行大小限制的容器里并且向客户端更新一行后台数据(这个是远程后台项目,所指的客户端就是远程操控的客户端)
然后写好这个新建的类之后,在其他什么地方比如它的构造方法里,写上下面这行代码
  1. start();
复制代码
然后在你调用dispatchCommand之前实例化这个类并创建一个变量保存一下
  1. Appender appender = new 你的类名();
复制代码
然后将这个appender添加到RootLogger里
  1. ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).addAppender(appender);
复制代码
注意这里的LogManager可能会出现两个导入项,如果有,切记不要导入java.util.logging包里的那个,导入另一个以org.apache.logging.log4j开头的LogManager
如果没有getRootLogger方法,可以使用下面的这种方法
  1. ((org.apache.logging.log4j.core.Logger)LogManager.getLogger(LogManager.ROOT_LOGGER_NAME)).addAppender(appender);
复制代码
然后再dispatchCommand
由于minecraft服务器是单线程执行任务模式的原因,在命令执行期间不会有其他的输出,所以现在你就可以获取指令执行期间在控制台输出的信息
然后,在dispatchCommand之后删除这个Appender
  1. ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).removeAppender(appender);
复制代码
现在,你的整个逻辑代码看起来应该是这样的
  1. Appender appender = new 你的类名();
  2. ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).addAppender(appender);
  3. Bukkit.dispatchCommand(你的指令执行者,你的指令);
  4. ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).removeAppender(appender);
复制代码
至于那个新建的继承了AbstractAppender的类怎么写,你可以看一下这个类
https://github.com/Light-Light/RemoteControl-Plugin/blob/master/src/com/qing_guang/RemoteControl/plugin/setout/LogAppender.java
构造方法里整个try-catch你就不要看了,又因为我这个是要从服务器启动记录到服务器关闭的,所以Appender不匿名,super那一行的那一串字符就是这个Appender的名字,这里我用的是我的主类名,你想写也行不想写也可以,临时Appedner可以匿名
好了,仁义尽致,只能帮你到这了,如果再有看不懂的地方还是找其它dalao坛友吧


xiaozheng666QQ
轻光233 发表于 2019-10-7 08:37
spigot还是craftbukkit还是minecraft原版服务器,具体哪个我也不清楚,使用的日志记录框架是log4j
log4j里 ...

谢谢指导,明白了

xiaozheng666QQ
轻光233 发表于 2019-10-7 08:37
spigot还是craftbukkit还是minecraft原版服务器,具体哪个我也不清楚,使用的日志记录框架是log4j
log4j里 ...

Exception: java.lang.NoSuchMethodError thrown from the UncaughtExceptionHandler in thread "Craft Scheduler Thread - 1"
不知道是不是我写法问题

轻光233
xiaozheng666QQ 发表于 2019-10-7 16:38
Exception: java.lang.NoSuchMethodError thrown from the UncaughtExceptionHandler in thread "Craft S ...

请把具体代码贴出来,我明天要上学,有几天无法上线,让dalao坛友帮你康康吧

xiaozheng666QQ
轻光233 发表于 2019-10-7 17:11
请把具体代码贴出来,我明天要上学,有几天无法上线,让dalao坛友帮你康康吧 ...

不用了,已经OK了,虽然还存在乱码

第一页 上一页 下一页 最后一页