Zh:Debugging
Notch的客户端和服务端(以及启动器)可以生成除平常显示的额外日志信息,其中的一些对调试非常有帮助。要完成这个,需要通过指定一个自定义Log4j配置。
本地启动器直接提供了一个“日志配置”部分来完成这个。对于其他情况,可以通过向游戏添加-Dlog4j.configurationFile=fullpathtoconfigfile.xml
参数来完成:
- Java启动器中的JVM参数部分
- 服务端启动命令的
-jar
之前 - 直接调用
launcher.jar
时-jar
之前
当使用本地启动器时,使用日志配置的XML变体并勾选“自定义日志配置输出XML”。这会允许启动器在其输出中提供更干净的的信息。当使用java启动器或启动服务端时,使用非XML变体(你在控制台中不需要XML,且XML变体不适用于服务端GUI)。
如果不能找到指定了-Dlog4j.configurationFile
的配置,那么将会使用默认的那个代替。
你可以通过解压要工作的jar中的log4j2.xml
来获取游戏的默认配置。
选项
log4j配置中只有一些选项拥有有用的行为。
最主要的一个是<Root>
中的level
。一般来说,它被设置为info
,但它同样接受trace
、debug
、info
、warn
、error
、all
和off
。Minecraft实际上使用的最底层是debug
,所以要获得最多的额外信息应该使用这个。
另一个重要的选项是<filter>
列表。默认地,游戏使用<filter>
过滤掉所有数据包相关的信息,它会拒绝所有标记为NETWORK_PACKETS
的日志信息。你可以更改它来使过滤器反而只接受NETWORK_PACKETS
而拒绝其他的一切,或者你也可以整个移除<filter>
让它显示所有的信息。除NETWORK_PACKETS
之外,还有一些别的日志标记:SOUNDS
、NETWORK
、PACKET_SENT
以及PACKET_RECEIVED
。NETWORK
和NETWORK_PACKETS
的行为完全一样;PACKET_SENT
和PACKET_RECEIVED
可以用于只显示一组数据包;而SOUNDS
可以用于发射有关音乐通道何时开始及结束的信息(通常只在诊断音频似乎会播放两次的问题时才有用)。
另外要注意:默认地,如果一天中的日志超过7个,那么log4j会覆写旧的日志(见MC-100524)。你可以通过向<RollingRandomAccessFile>
添加<DefaultRolloverStrategy max="1000"/>
来禁用此行为,这使得一天最多1000个文件(这不太可能被命中——在较大的对象上使用1000,因为在较大的数量上开始出现性能命中)。
示例配置
仅网络数据包
应用至:原版客户端及服务端
产生所有服务端/客户端发送和接受到数据包的日志,除此之外没有别的内容(这也同样禁用了正常内容的日志,包括聊天)不幸的是,自Netty重写后(Minecraft 1.7),只能记录数据包的ID和类,而不能记录它们的内容;然而这些信息还可能会有一些帮助。
Config:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="com.mojang.util">
<Appenders>
<Console name="SysOut" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
</Console>
<Queue name="ServerGuiConsole">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Queue>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="debug">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="ACCEPT" onMismatch="DENY" />
</filters>
<AppenderRef ref="SysOut"/>
<AppenderRef ref="File"/>
<AppenderRef ref="ServerGuiConsole"/>
</Root>
</Loggers>
</Configuration>
Config (XML output):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="SysOut" target="SYSTEM_OUT">
<XMLLayout />
</Console>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="debug">
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="ACCEPT" onMismatch="DENY" />
</filters>
<AppenderRef ref="SysOut"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
所有调试信息
应用至:原版客户端和服务端
你可以记录比你想象的多得多。这除了会输出平常的日志消息(比如聊天),还会输出网络数据包、声音开始/停止播放(仅客户端)、一些认证请求以及别的杂项信息。
Config:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="com.mojang.util">
<Appenders>
<Console name="SysOut" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
</Console>
<Queue name="ServerGuiConsole">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Queue>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="SysOut"/>
<AppenderRef ref="File"/>
<AppenderRef ref="ServerGuiConsole"/>
</Root>
</Loggers>
</Configuration>
Config (XML output):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="SysOut" target="SYSTEM_OUT">
<XMLLayout />
</Console>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="SysOut"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
所有CraftBukkit/Spigot上的调试信息
应用至:从CraftBukkit衍生的CraftBukkit服务端
因为CraftBukkit使用了一些不一样的控制台输出(且没有服务端GUI),所以配置需要进行一些小小的改变来正确地显示。然而,这么做也会显示重映射的数据包类名
Config:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="net.minecraft,com.mojang">
<Appenders>
<Console name="WINDOWS_COMPAT" target="SYSTEM_OUT"></Console>
<Queue name="TerminalConsole">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Queue>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="WINDOWS_COMPAT"/>
<AppenderRef ref="File"/>
<AppenderRef ref="TerminalConsole"/>
</Root>
</Loggers>
</Configuration>
启动器任务信息
应用至:Launcher.jar
通过在(Java启动器的)launcher.jar上启用调试启动,你可以看到与Mojang API——如果你想看你自己账号对每个端点的示例连接,这会起到一些帮助。
注意如果你调用了普通的启动器EXE/JAR,该配置也许不会生效——取而代之地,应将它用于位于%appdata%\.minecraft
的launcher.jar
。
Config:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="com.mojang">
<Appenders>
<Console name="SysOut" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Console>
<Queue name="DevelopmentConsole">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Queue>
<Async name="Async">
<AppenderRef ref="SysOut"/>
<AppenderRef ref="DevelopmentConsole"/>
</Async>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Async"/>
</Root>
</Loggers>
</Configuration>