使用dispatchCommand执行命令后如何获取在控制台输出的内容而不是返回boolean
控制台输出的内容属于供人类阅读的内容,插件本身不应依赖任何类似的输出。
不过办法还是有的,监听输出消息的事件(不写 Bukkit,不清楚是啥),然后拿到数据就行了。
不过办法还是有的,监听输出消息的事件(不写 Bukkit,不清楚是啥),然后拿到数据就行了。
https://github.com/Light-Light/RemoteControl-Plugin/blob/master/src/com/qing_guang/RemoteControl/plugin/setout/Recorder.java
如果你愿意的话,可以看一下我的源码,里面有获取控制台所有输出的方法
你可以在dispatch之前先注册,之后再删掉(不知道能不能删,看log4j吧)
如果你愿意的话,可以看一下我的源码,里面有获取控制台所有输出的方法
你可以在dispatch之前先注册,之后再删掉(不知道能不能删,看log4j吧)
土球球 发表于 2019-10-6 21:00
控制台输出的内容属于供人类阅读的内容,插件本身不应依赖任何类似的输出。
不过办法还是有的,监听输出消 ...
文档里面没找到
轻光233 发表于 2019-10-6 21:06
https://github.com/Light-Light/RemoteControl-Plugin/blob/master/src/com/qing_guang/RemoteControl/plu ...
你这个有点没看懂
本帖最后由 a1294790523 于 2019-10-7 01:25 编辑
听说这个是个搞事的问题(
复制代码
研究了一下,大概是获取log4j的rootlogger,然后添加Appender并重写这个方法,在命令执行时令某个boolean为true然后获取数据即可
但是这个不能确保是命令返回的数据,所以你应该还得加个标识符什么的
听说这个是个搞事的问题(
- ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).addAppender(new AbstractAppender("commandLogger",null, null) {
- @Override
- public void append(LogEvent logEvent) {
研究了一下,大概是获取log4j的rootlogger,然后添加Appender并重写这个方法,在命令执行时令某个boolean为true然后获取数据即可
但是这个不能确保是命令返回的数据,所以你应该还得加个标识符什么的
a1294790523 发表于 2019-10-7 01:24
听说这个是个搞事的问题(
研究了一下,大概是获取log4j的rootlogger,然后添加Appender并重写 ...
没听懂,可能我太笨,大佬能否写个完整的例子
本帖最后由 轻光233 于 2019-10-7 08:54 编辑
spigot还是craftbukkit还是minecraft原版服务器,具体哪个我也不清楚,使用的日志记录框架是log4j
log4j里的日志消息监听是靠的Appender
Appender是一个接口,里面有几个你需要重写的方法,如果你不想自己实现其他的方法(大多数情况下不想),就可以让一个新建的类继承AbstractAppender类,并且重写append(LogEvent)方法
LogEvent里面有什么东西可以自己百度,然后在这个方法里写你自己想写的代码
我上面的github项目就是将新获取的一个信息添加到一个50行大小限制的容器里并且向客户端更新一行后台数据(这个是远程后台项目,所指的客户端就是远程操控的客户端)
然后写好这个新建的类之后,在其他什么地方比如它的构造方法里,写上下面这行代码
复制代码然后在你调用dispatchCommand之前实例化这个类并创建一个变量保存一下复制代码然后将这个appender添加到RootLogger里
复制代码注意这里的LogManager可能会出现两个导入项,如果有,切记不要导入java.util.logging包里的那个,导入另一个以org.apache.logging.log4j开头的LogManager
如果没有getRootLogger方法,可以使用下面的这种方法
复制代码然后再dispatchCommand
由于minecraft服务器是单线程执行任务模式的原因,在命令执行期间不会有其他的输出,所以现在你就可以获取指令执行期间在控制台输出的信息
然后,在dispatchCommand之后删除这个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 发表于 2019-10-7 02:31
没听懂,可能我太笨,大佬能否写个完整的例子
spigot还是craftbukkit还是minecraft原版服务器,具体哪个我也不清楚,使用的日志记录框架是log4j
log4j里的日志消息监听是靠的Appender
Appender是一个接口,里面有几个你需要重写的方法,如果你不想自己实现其他的方法(大多数情况下不想),就可以让一个新建的类继承AbstractAppender类,并且重写append(LogEvent)方法
LogEvent里面有什么东西可以自己百度,然后在这个方法里写你自己想写的代码
我上面的github项目就是将新获取的一个信息添加到一个50行大小限制的容器里并且向客户端更新一行后台数据(这个是远程后台项目,所指的客户端就是远程操控的客户端)
然后写好这个新建的类之后,在其他什么地方比如它的构造方法里,写上下面这行代码
- start();
- Appender appender = new 你的类名();
- ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).addAppender(appender);
如果没有getRootLogger方法,可以使用下面的这种方法
- ((org.apache.logging.log4j.core.Logger)LogManager.getLogger(LogManager.ROOT_LOGGER_NAME)).addAppender(appender);
由于minecraft服务器是单线程执行任务模式的原因,在命令执行期间不会有其他的输出,所以现在你就可以获取指令执行期间在控制台输出的信息
然后,在dispatchCommand之后删除这个Appender
- ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).removeAppender(appender);
- Appender appender = new 你的类名();
- ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).addAppender(appender);
- Bukkit.dispatchCommand(你的指令执行者,你的指令);
- ((org.apache.logging.log4j.core.Logger)LogManager.getRootLogger()).removeAppender(appender);
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坛友吧
轻光233 发表于 2019-10-7 08:37
spigot还是craftbukkit还是minecraft原版服务器,具体哪个我也不清楚,使用的日志记录框架是log4j
log4j里 ...
谢谢指导,明白了
轻光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"
不知道是不是我写法问题
xiaozheng666QQ 发表于 2019-10-7 16:38
Exception: java.lang.NoSuchMethodError thrown from the UncaughtExceptionHandler in thread "Craft S ...
请把具体代码贴出来,我明天要上学,有几天无法上线,让dalao坛友帮你康康吧