ZH:Debugging

From wiki.vg
Jump to navigation Jump to search

Notch的客户端和服务端(以及启动器)可以生成除平常显示的额外日志信息,其中的一些对调试非常有帮助。要完成这个,需要通过指定一个自定义Log4j配置

本地启动器直接提供了一个“日志配置”部分来完成这个。对于其他情况,可以通过向游戏添加-Dlog4j.configurationFile=fullpathtoconfigfile.xml参数来完成:

当使用本地启动器时,使用日志配置的XML变体并勾选“自定义日志配置输出XML”。这会允许启动器在其输出中提供更干净的的信息。当使用java启动器或启动服务端时,使用非XML变体(你在控制台中不需要XML,且XML变体不适用于服务端GUI)。

Warning.png 如果不能找到指定了-Dlog4j.configurationFile的配置,那么将会使用默认的那个代替。

你可以通过解压要工作的jar中的log4j2.xml来获取游戏的默认配置。

选项

log4j配置中只有一些选项拥有有用的行为。

最主要的一个是<Root>中的level。一般来说,它被设置为info,但它同样接受tracedebuginfowarnerroralloff。Minecraft实际上使用的最底层是debug,所以要获得最多的额外信息应该使用这个。

另一个重要的选项是<filter>列表。默认地,游戏使用<filter>过滤掉所有数据包相关的信息,它会拒绝所有标记为NETWORK_PACKETS的日志信息。你可以更改它来使过滤器反而只接受NETWORK_PACKETS而拒绝其他的一切,或者你也可以整个移除<filter>让它显示所有的信息。除NETWORK_PACKETS之外,还有一些别的日志标记:SOUNDSNETWORKPACKET_SENT以及PACKET_RECEIVEDNETWORKNETWORK_PACKETS的行为完全一样;PACKET_SENTPACKET_RECEIVED可以用于只显示一组数据包;而SOUNDS可以用于发射有关音乐通道何时开始及结束的信息(通常只在诊断音频似乎会播放两次的问题时才有用)。

另外要注意:默认地,如果一天中的日志超过7个,那么log4j会覆写旧的日志(见MC-100524)。你可以通过向<RollingRandomAccessFile>添加<DefaultRolloverStrategy max="1000"/>来禁用此行为,这使得一天最多1000个文件(这不太可能被命中——在较大的对象上使用1000,因为在较大的数量上开始出现性能命中)。

示例配置

仅网络数据包

应用至:原版客户端及服务端

产生所有服务端/客户端发送和接受到数据包的日志,除此之外没有别的内容(这也同样禁用了正常内容的日志,包括聊天)不幸的是,自Netty重写后(Minecraft 1.7),只能记录数据包的ID和类,而不能记录它们的内容;然而这些信息还可能会有一些帮助。

Warning.png 数据包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%\.minecraftlauncher.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>