Si logcat limita la longitud a 1000, puede dividir la cadena que desea registrar con String.subString () y registrarla en partes. Por ejemplo:
int maxLogSize =1000;for(int i =0; i <= veryLongString.length()/ maxLogSize; i++){int start = i * maxLogSize;intend=(i+1)* maxLogSize;end=end> veryLongString.length()? veryLongString.length():end;Log.v(TAG, veryLongString.substring(start,end));}
Log cat imprimiendo solo la mitad de la respuesta. ¿Cómo puedo obtener la longitud de la respuesta completa? dijiste que veryLongString.length () pero aquí se imprime solo la mitad de la respuesta cuando imprimo el resultado json en log cat
Vasu
Pero en la consola del iPhone obtengo la cadena de respuesta completa
Vasu
puede comprobar la longitud de la respuesta escribiendo length () en el registro. Si este valor no es el esperado, es posible que el problema no sea el registro.
espátulamania
3
¡No puedo creer que Android lo haga tan difícil!
Alston
1
Creo que este código registrará una entrada de registro vacía adicional al final, si veryLongString.length()es un múltiplo de maxLogSize. Quizás cambie el <=a <.
LarsH
29
Como continuación de la respuesta de la espátulamania, escribí una clase contenedora que se encarga de esto por ti. Solo necesita cambiar la importación y registrará todo
publicclassLog{publicstaticvoid d(String TAG,String message){int maxLogSize =2000;for(int i =0; i <= message.length()/ maxLogSize; i++){int start = i * maxLogSize;intend=(i+1)* maxLogSize;end=end> message.length()? message.length():end;
android.util.Log.d(TAG, message.substring(start,end));}}}
Gracias. No se recomiendan más de 3000 símbolos, yo lo uso.
CoolMind
9
Así es como lo hace OkHttp con HttpLoggingInterceptor:
publicvoid 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{intend=Math.min(newline, i + MAX_LOG_LENGTH);Log.d("OkHttp", message.substring(i,end));
i =end;}while(i < newline);}}
MAX_LOG_LENGTH es 4000.
Aquí usa Log.d (depuración) y la etiqueta "OkHttp" codificada.
Divide el registro en nuevas líneas o cuando alcanza la longitud máxima.
Esta clase a continuación es una clase auxiliar que puede usar (si tiene soporte lambda, tire Jack & Jill o retrolambda) para hacer lo mismo que OkHttp hace en cualquier registro:
/**
* Help printing logs splitting text on new line and creating multiple logs for too long texts
*/publicclassLogHelper{privatestaticfinalint MAX_LOG_LENGTH =4000;publicstaticvoid v(@NonNullString tag,@NullableString message){
log(message, line ->Log.v(tag, line));}publicstaticvoid d(@NonNullString tag,@NullableString message){
log(message, line ->Log.d(tag, line));}publicstaticvoid i(@NonNullString tag,@NullableString message){
log(message, line ->Log.i(tag, line));}publicstaticvoid w(@NonNullString tag,@NullableString message){
log(message, line ->Log.w(tag, line));}publicstaticvoid e(@NonNullString tag,@NullableString message){
log(message, line ->Log.e(tag, line));}publicstaticvoid v(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.v(tag, line));}publicstaticvoid d(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.d(tag, line));}publicstaticvoid i(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.i(tag, line));}publicstaticvoid w(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.w(tag, line));}publicstaticvoid e(@NonNullString tag,@NullableString message,@NullableThrowable throwable){
log(message, throwable, line ->Log.e(tag, line));}privatestaticvoid log(@NullableString message,@NonNullLogCB 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{intend=Math.min(newline, i + MAX_LOG_LENGTH);
callback.log(message.substring(i,end));
i =end;}while(i < newline);}}privatestaticvoid log(@NullableString message,@NullableThrowable throwable,@NonNullLogCB callback){if(throwable ==null){
log(message, callback);return;}if(message !=null){
log(message +"\n"+Log.getStackTraceString(throwable), callback);}else{
log(Log.getStackTraceString(throwable), callback);}}privateinterfaceLogCB{void log(@NonNullString message);}}
cuando un bucle simple será suficiente, por qué usar la recursividad.
pellucide
3
Soy un fanático de la recursividad, ya que encuentro excelente la facilidad de uso y la reutilización del código. Sin embargo, esta recursividad final puede acumular marcos de pila rápidamente si su compilador no los optimiza (lo que no creo que haga el estudio de Android). Esto significa que si tiene un mensaje sustancialmente largo que causa un pluribus de llamadas recursivas, puede crear fácilmente un StackOverflowError.
Lucas
3
Para no minimizar la división de líneas en los mensajes de registro, tomo la cadena grande y registro cada línea por separado.
Respuestas:
Si logcat limita la longitud a 1000, puede dividir la cadena que desea registrar con String.subString () y registrarla en partes. Por ejemplo:
fuente
veryLongString.length()
es un múltiplo demaxLogSize
. Quizás cambie el<=
a<
.Como continuación de la respuesta de la espátulamania, escribí una clase contenedora que se encarga de esto por ti. Solo necesita cambiar la importación y registrará todo
fuente
Esto se basa en la respuesta de Spatulamania, es un poco más conciso y no agregará un mensaje de registro vacío al final:
fuente
Así es como lo hace OkHttp con HttpLoggingInterceptor:
MAX_LOG_LENGTH
es 4000.Aquí usa Log.d (depuración) y la etiqueta "OkHttp" codificada.
Divide el registro en nuevas líneas o cuando alcanza la longitud máxima.
Esta clase a continuación es una clase auxiliar que puede usar (si tiene soporte lambda, tire Jack & Jill o retrolambda) para hacer lo mismo que OkHttp hace en cualquier registro:
fuente
Pruebe este código para mostrar un mensaje largo en logcat.
fuente
Para no minimizar la división de líneas en los mensajes de registro, tomo la cadena grande y registro cada línea por separado.
fuente
Aquí hay una versión de Kotlin para la respuesta de @spatulamania (especialmente para personas perezosas / inteligentes):
fuente
Considero que Timber es una buena opción para este problema. Timber divide e imprime automáticamente fragmentos de mensajes en logcat.
https://github.com/JakeWharton/timber
Puede ver la implementación del método de registro en la clase estática timber.log.Timber.DebugTree.
fuente
si imprime la cadena json, puede usar el código a continuación
código completo
fuente
Para una solución fácil, use la opción Usar envoltura suave en el punto de adjunto no 4 opciones que pueden ayudarlo.
fuente