Tôi đang cố gắng hiển thị thông báo dài trên logcat. Nếu độ dài của tin nhắn hơn 1000 ký tự, nó sẽ bị hỏng.
Cơ chế để hiển thị tất cả các ký tự của tin nhắn dài trong logcat là gì?
Tôi đang cố gắng hiển thị thông báo dài trên logcat. Nếu độ dài của tin nhắn hơn 1000 ký tự, nó sẽ bị hỏng.
Cơ chế để hiển thị tất cả các ký tự của tin nhắn dài trong logcat là gì?
Câu trả lời:
Nếu logcat đang giới hạn độ dài ở mức 1000 thì bạn có thể chia chuỗi mà bạn muốn đăng nhập bằng String.subString () và đăng nhập nó thành từng phần. Ví dụ:
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));
}
veryLongString.length()
là bội số maxLogSize
. Có thể thay đổi <=
thành <
.
Để tiếp tục câu trả lời spatulamania, tôi đã viết một lớp wrapper để xử lý điều này cho bạn. Bạn chỉ cần thay đổi nhập và nó sẽ ghi lại mọi thứ
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));
}
}
}
Điều này được xây dựng dựa trên câu trả lời của spatulamania, ngắn gọn hơn một chút và sẽ không thêm thông báo nhật ký trống vào cuối:
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)));
}
Đây là cách OkHttp với HttpLoggingInterceptor làm điều đó:
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);
}
}
MAX_LOG_LENGTH
là 4000.
Ở đây nó sử dụng Log.d (gỡ lỗi) và thẻ "OkHttp" được mã hóa cứng.
Nó tách nhật ký theo dòng mới hoặc khi nó đạt đến độ dài tối đa.
Lớp dưới đây là lớp người trợ giúp bạn có thể sử dụng (nếu bạn có hỗ trợ lambda, hãy ném Jack & Jill hoặc retrolambda) để làm điều tương tự OkHttp thực hiện trên bất kỳ nhật ký nào:
/**
* 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);
}
}
Hãy thử đoạn mã này để hiển thị thông báo dài trong 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
}
}
Để không giảm thiểu việc tách dòng giữa các thông báo nhật ký, tôi lấy chuỗi lớn và ghi nhật ký từng dòng riêng biệt.
void logMultilineString(String data) {
for (String line : data.split("\n")) {
logLargeString(line);
}
}
void logLargeString(String data) {
final int CHUNK_SIZE = 4076; // Typical max logcat payload.
int offset = 0;
while (offset + CHUNK_SIZE <= data.length()) {
Log.d(TAG, data.substring(offset, offset += CHUNK_SIZE));
}
if (offset < data.length()) {
Log.d(TAG, data.substring(offset));
}
}
Đây là phiên bản Kotlin cho câu trả lời @spatulamania (đặc biệt dành cho những người lười biếng / thông minh):
val maxLogSize = 1000
val stringLength = yourString.length
for (i in 0..stringLength / maxLogSize) {
val start = i * maxLogSize
var end = (i + 1) * maxLogSize
end = if (end > yourString.length) yourString.length else end
Log.v("YOURTAG", yourString.substring(start, end))
}
Tôi coi Timber là một lựa chọn tốt cho vấn đề này. Gỗ tự động chia nhỏ và in các khối tin nhắn trong logcat.
https://github.com/JakeWharton/timber
Bạn có thể thấy việc triển khai phương thức nhật ký trong lớp tĩnh wood.log.Timber.DebugTree.
nếu in chuỗi json, có thể sử dụng mã bên dưới
@JvmStatic
fun j(level: Int, tag: String? = null, msg: String) {
if (debug) {
if (TextUtils.isEmpty(msg)) {
p(level, tag, msg)
} else {
val message: String
message = try {
when {
msg.startsWith("{") -> {
val jsonObject = JSONObject(msg)
jsonObject.toString(4)
}
msg.startsWith("[") -> {
val jsonArray = JSONArray(msg)
jsonArray.toString(4)
}
else -> msg
}
} catch (e: JSONException) {
e.printStackTrace()
msg
}
p(level, tag, "╔═══════════════════════════════════════════════════════════════════════════════════════", false)
val lines = message.split(LINE_SEPARATOR.toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (line in lines) {
p(level, tag, "║ $line", false)
}
p(level, tag, "╚═══════════════════════════════════════════════════════════════════════════════════════", false)
}
}
}
CXLogUtil.j ("json-tag", "{}")
Để có một giải pháp dễ dàng, hãy sử dụng Tùy chọn bọc mềm trong tùy chọn đính kèm điểm không có 4 bên dưới có thể giúp bạn.