如何在logcat中显示长消息

Vas*_*asu 83 android logcat

我试图在logcat上显示长消息.如果消息的长度超过1000个字符,则会被破坏.

在logcat中显示长消息的所有字符的机制是什么?

spa*_*nia 136

如果logcat将长度限制为1000,那么您可以使用String.subString()拆分要记录的字符串并将其记录为碎片.例如:

int maxLogSize = 1000;
for(int i = 0; i <= veryLongString.length() / maxLogSize; i++) {
    int start = i * maxLogSize;
    int end = (i+1) * maxLogSize;
    end = end > veryLongString.length() ? veryLongString.length() : end;
    Log.v(TAG, veryLongString.substring(start, end));
}
Run Code Online (Sandbox Code Playgroud)

  • 简直无法相信Android会变得如此困难! (2认同)

jid*_*vah 28

作为spatulamania答案的后续,我写了一个包装类,为你处理这个问题.您只需要更改导入,它将记录所有内容

public class Log {

    public static void d(String TAG, String message) {
        int maxLogSize = 2000;
        for(int i = 0; i <= message.length() / maxLogSize; i++) {
            int start = i * maxLogSize;
            int end = (i+1) * maxLogSize;
            end = end > message.length() ? message.length() : end;
            android.util.Log.d(TAG, message.substring(start, end));
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Lar*_*rsH 18

这建立在spatulamania的答案之上,有点简洁,并且最后不会添加空的日志消息:

final int chunkSize = 2048;
for (int i = 0; i < s.length(); i += chunkSize) {
    Log.d(TAG, s.substring(i, Math.min(s.length(), i + chunkSize)));
}
Run Code Online (Sandbox Code Playgroud)


man*_*ani 7

尝试使用这段代码在logcat中显示长消息.

public void logLargeString(String str) {
    if(str.length() > 3000) {
        Log.i(TAG, str.substring(0, 3000));
        logLargeString(str.substring(3000));
    } else {
        Log.i(TAG, str); // continuation
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当一个简单的循环就足够了,为什么要使用递归. (4认同)
  • 我是递归的粉丝,因为我发现可读性和重用代码很棒.然而,如果你的编译器没有对它们进行优化,那么这个尾端递归可以快速构建堆栈帧(我不相信Android工作室会这样做).这意味着如果你有一个非常长的消息导致递归调用的pluribus,你可以很容易地创建一个StackOverflowError. (2认同)

Dan*_*ato 7

这是带有HttpLoggingInterceptor的OkHttp的执行方式:

public void log(String message) {
  // Split by line, then ensure each line can fit into Log's maximum length.
  for (int i = 0, length = message.length(); i < length; i++) {
    int newline = message.indexOf('\n', i);
    newline = newline != -1 ? newline : length;
    do {
      int end = Math.min(newline, i + MAX_LOG_LENGTH);
      Log.d("OkHttp", message.substring(i, end));
      i = end;
    } while (i < newline);
  }
}
Run Code Online (Sandbox Code Playgroud)

MAX_LOG_LENGTH 是4000。

在这里,它使用Log.d(调试)和硬编码的“ OkHttp”标签。

它在换行符或达到最大长度时拆分日志。

下面的此类是您可以使用的帮助器类(如果您有lambda支持抛出Jack&Jill或retrolambda),则可以在任何日志上执行OkHttp的相同操作:

/**
 * Help printing logs splitting text on new line and creating multiple logs for too long texts
 */

public class LogHelper {

    private static final int MAX_LOG_LENGTH = 4000;

    public static void v(@NonNull String tag, @Nullable String message) {
        log(message, line -> Log.v(tag, line));
    }

    public static void d(@NonNull String tag, @Nullable String message) {
        log(message, line -> Log.d(tag, line));
    }

    public static void i(@NonNull String tag, @Nullable String message) {
        log(message, line -> Log.i(tag, line));
    }

    public static void w(@NonNull String tag, @Nullable String message) {
        log(message, line -> Log.w(tag, line));
    }

    public static void e(@NonNull String tag, @Nullable String message) {
        log(message, line -> Log.e(tag, line));
    }

    public static void v(@NonNull String tag, @Nullable String message, @Nullable Throwable throwable) {
        log(message, throwable, line -> Log.v(tag, line));
    }

    public static void d(@NonNull String tag, @Nullable String message, @Nullable Throwable throwable) {
        log(message, throwable, line -> Log.d(tag, line));
    }

    public static void i(@NonNull String tag, @Nullable String message, @Nullable Throwable throwable) {
        log(message, throwable, line -> Log.i(tag, line));
    }

    public static void w(@NonNull String tag, @Nullable String message, @Nullable Throwable throwable) {
        log(message, throwable, line -> Log.w(tag, line));
    }

    public static void e(@NonNull String tag, @Nullable String message, @Nullable Throwable throwable) {
        log(message, throwable, line -> Log.e(tag, line));
    }

    private static void log(@Nullable String message, @NonNull LogCB callback) {
        if (message == null) {
            callback.log("null");
            return;
        }
        // Split by line, then ensure each line can fit into Log's maximum length.
        for (int i = 0, length = message.length(); i < length; i++) {
            int newline = message.indexOf('\n', i);
            newline = newline != -1 ? newline : length;
            do {
                int end = Math.min(newline, i + MAX_LOG_LENGTH);
                callback.log(message.substring(i, end));
                i = end;
            } while (i < newline);
        }
    }

    private static void log(@Nullable String message, @Nullable Throwable throwable, @NonNull LogCB callback) {
        if (throwable == null) {
            log(message, callback);
            return;
        }
        if (message != null) {
            log(message + "\n" + Log.getStackTraceString(throwable), callback);
        } else {
            log(Log.getStackTraceString(throwable), callback);
        }
    }

    private interface LogCB {
        void log(@NonNull String message);
    }
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*uke 6

通过 Kotlin,我们可以使用 stdlib chunked函数:

fun logUnlimited(tag: String, string: String) {
    val maxLogSize = 1000
    string.chunked(maxLogSize).forEach { Log.v(tag, it) }
}
Run Code Online (Sandbox Code Playgroud)