为了方便调试,许多开发者都会习惯用 Log 打印网络请求响应的内容,而不是使用其他工具。

但是在打印日志时,你可能会遇到日志显示不完整的情况,比如响应的 JSON 数据在中间被截断了。

有人可能会认为是字符串超长的问题,不过回想『Java String 长度限制』就可以判断出这个问题并不是由于 String 的长度限制导致的,那就只能是 Android 的 Log 限制。

从 Android 内核源码来看,有以下宏定义:

#define LOGGER_ENTRY_MAX_LEN        (4*1024)  
#define LOGGER_ENTRY_MAX_PAYLOAD    (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))

Android 系统对日志长度有限制,最大长度为 4K,超过这个范围的自动截断,所以就会出现打印不全的情况。

既然一次只能打印 4K 长度的信息,那很容易想到将待打印的信息拆分成一个个信息段,然后分别打印即可。

实际测试发现,日志的最大长度其实略小于 4*1024。为了保险起见,可以设置每一段日志长度为 3*1024。如果待打印的字符串信息长度小于等于 3*1024,则直接打印即可,否则将日志信息截断为一段一段分别打印。

public class LogUtil {
    private static final int LOGGER_MAX_LENGTH = 3 * 1024;
    public static void i(@NonNull String tag, @NonNull String msg) {
        if (msg.length() > LOGGER_MAX_LENGTH) {
            while (msg.length() > LOGGER_MAX_LENGTH) {
                Log.i(tag, msg.substring(0, LOGGER_MAX_LENGTH));
                msg = msg.substring(LOGGER_MAX_LENGTH);
            }
        }
        Log.i(tag, msg);
    }
}

一般情况下会对日志工具类做了封装,可参考之前『定制 Android 日志工具』一文做组合使用。