2011-09-30 14 views
50

में लंबे संदेश कैसे प्रदर्शित करें मैं लॉगकैट पर लंबा संदेश प्रदर्शित करने की कोशिश कर रहा हूं। अगर संदेश की लंबाई 1000 से अधिक वर्ण है, तो यह टूट जाती है।लॉगकैट

लॉगकैट में लंबे संदेश के सभी पात्रों को दिखाने के लिए तंत्र क्या है?

+1

आप लॉगकैट में इतनी बड़ी स्ट्रिंग क्यों दिखाना चाहते हैं? –

+3

मुझे सर्वर से एक लंबी स्ट्रिंग के रूप में प्रतिक्रिया मिल रही है। – Vasu

+1

फिर भी आप पूरी स्ट्रिंग को मुद्रित क्यों करना चाहते हैं, इसे किसी फ़ाइल या डेटाबेस में लिखना और वहां देखें - यदि यह –

उत्तर

95

अगर लॉगक 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)); 
} 
+0

लॉग बिल्ली प्रतिक्रिया का केवल आधा प्रिंटिंग .. मुझे पूरी प्रतिक्रिया की लंबाई कैसे मिल सकती है। आपने कहा कि बहुत लोंगस्ट्रिंग।लम्बाई() लेकिन यहां पर केवल प्रिंट आधा प्रतिक्रिया मुद्रित होती है जब मैं लॉग बिल्ली – Vasu

+0

में जेसन परिणाम प्रिंट करता हूं लेकिन आईफोन कंसोल में मुझे पूरी प्रतिक्रिया स्ट्रिंग मिल रही है – Vasu

+0

आप लॉग में लंबाई() लिखकर प्रतिक्रिया की लंबाई देख सकते हैं। यदि यह मान आपके द्वारा अपेक्षित नहीं है, तो समस्या लॉगिंग के साथ नहीं हो सकती है। – spatulamania

21
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)); 
     } 
    } 

} 
6

प्रवेश करेंगे 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 
    } 
} 
+4

के लिए नीचे @LarsH उत्तर देखें, जब एक साधारण लूप पर्याप्त होगा, फिर रिकर्सन का उपयोग क्यों करें। – pellucide

+2

मैं रिकर्सन का प्रशंसक हूं क्योंकि मुझे पढ़ने योग्यता और कोड का पुन: उपयोग मिलता है। हालांकि यदि आपका कंपाइलर उन्हें अनुकूलित नहीं करता है (जो मुझे एंड्रॉइड स्टूडियो पर विश्वास नहीं करता है) तो यह पूंछ अंत रिकर्सन तेजी से ढेर फ्रेम का निर्माण कर सकता है। इसका अर्थ यह है कि यदि आपके पास पर्याप्त लंबा संदेश है जो रिकर्सिव कॉल के प्लुरिबस का कारण बनता है तो आप आसानी से स्टैक ओवरफ्लो एरर बना सकते हैं। – Luke

7

यह 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))); 
} 
+0

धन्यवाद। 3000 से अधिक प्रतीकों की अनुशंसा नहीं की जाती है, मैं इसका उपयोग करता हूं। – CoolMind

0

क्रम लॉग संदेशों भर में बंटवारे लाइनों को कम से कम करने के लिए नहीं है, मैं बड़ी स्ट्रिंग लेता हूं और प्रत्येक पंक्ति को अलग से लॉग करता हूं।

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)); 
    } 
} 
0

यह है कि यह कैसे 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); 
    } 
} 

MAX_LOG_LENGTH 4000.

यहाँ यह Log.d (डीबग) और हार्डकोडेड "OkHttp" टैग का उपयोग है।

यह लॉगलाइन को न्यूलाइन पर विभाजित करता है या जब यह अधिकतम लंबाई तक पहुंच जाता है।

नीचे इस वर्ग के एक सहायक वर्ग आप उपयोग कर सकते हैं एक ही बात OkHttp किसी भी लॉग पर करता है (यदि आप लैम्ब्डा समर्थन फेंक जैक & जिल या retrolambda है):

/** 
* 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); 
    } 
} 
0

यहाँ एक Kotlin संस्करण है @spatulamania answer (विशेष रूप से के लिए आलसी/स्मार्ट peooples) के लिए:

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)) 
} 
0

मैं इमारती लकड़ी इस समस्या के लिए एक अच्छा विकल्प पर विचार करें। Timber स्वचालित रूप से logcat में संदेश के टुकड़े विभाजित और मुद्रित करें।

https://github.com/JakeWharton/timber

आपको लॉग timber.log.Timber.DebugTree स्थिर कक्षा में विधि कार्यान्वयन देख सकते हैं।

संबंधित मुद्दे