লগকটে কীভাবে দীর্ঘ বার্তা প্রদর্শিত হবে


99

আমি লগকটে দীর্ঘ বার্তা প্রদর্শন করার চেষ্টা করছি। বার্তার দৈর্ঘ্য যদি 1000 টিরও বেশি অক্ষরের হয় তবে তা ভেঙে যায়।

লগকটে দীর্ঘ বার্তার সমস্ত অক্ষর দেখানোর পদ্ধতি কী?


6
আমি একটি দীর্ঘ স্ট্রিং হিসাবে সার্ভার থেকে প্রতিক্রিয়া পাচ্ছি।
ভাসু

4
তারপরেও আপনি কেন পুরো স্ট্রিংটি মুদ্রণ করতে চান, কোনও ফাইল বা ডাটাবেসে লিখতে এবং সেখানে দেখতে চান - এটি যদি ডিবাগিংয়ের জন্য হয়
রাহুল চৌধারি

আপনার লগক্যাট স্ট্রিং এবং অতীতকে নোটপ্যাডে অনুলিপি করুন, আপনি পুরো 1000 দৈর্ঘ্যের স্ট্রিং দেখতে পাবেন।
ইলঙ্গো জে

উত্তর:


151

যদি লগক্যাটটি দৈর্ঘ্যে 1000 কে ক্যাপ করছে তবে আপনি স্ট্রিং.সুবস্ট্রিং () দিয়ে লগ করতে চান সেই স্ট্রিংটি বিভক্ত করতে পারেন এবং এটি টুকরো টুকরো করে লগ করতে পারেন। উদাহরণ স্বরূপ:

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

লগ ক্যাট মুদ্রণের প্রতিক্রিয়াটির অর্ধেক .. আমি কীভাবে পুরো প্রতিক্রিয়াটির দৈর্ঘ্য পেতে পারি। আপনি বলেছিলেন যে খুব লংস্ট্রিং.লেন্থ () তবে এখানে লগ বিড়ালের জেসন ফলাফলটি প্রিন্ট করলে এটি কেবল অর্ধেক প্রতিক্রিয়া মুদ্রিত
ভাসু

তবে আইফোন কনসোলে আমি পুরো প্রতিক্রিয়াটির স্ট্রিংটি পাচ্ছি
ভাসু

আপনি লগতে দৈর্ঘ্য () লিখে প্রতিক্রিয়ার দৈর্ঘ্যটি পরীক্ষা করতে পারেন। যদি এই মানটি আপনি প্রত্যাশা মতো না করেন তবে সমস্যাটি লগিংয়ের সাথে নাও থাকতে পারে।
স্প্যাটুলামিনিয়া

4
বিশ্বাস করতে পারি না অ্যান্ড্রয়েড এটিকে এত শক্ত করে তোলে!
অ্যালস্টন

4
আমি মনে করি এই কোডটি একটি অতিরিক্ত, খালি লগ এন্ট্রি শেষে লগ করবে, যদি এর veryLongString.length()একাধিক হয় maxLogSize। হয়তো পরিবর্তন <=করতে <
লার্শ

30

স্পটুলামিনিয়া উত্তরের অনুসরণ হিসাবে আমি একটি মোড়ক ক্লাস লিখেছিলাম যা এটি আপনার জন্য পরিচালনা করে। আপনার কেবলমাত্র আমদানি পরিবর্তন করতে হবে এবং এটি সমস্ত কিছু লগ করবে

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

}

24

এটি স্প্যাটুলামিনিয়ার উত্তরের উপর ভিত্তি করে তৈরি হয়, এটি আরও সামান্য সংযোগযুক্ত এবং শেষে খালি লগ বার্তা যোগ করবে না:

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

ধন্যবাদ 3000 এর বেশি প্রতীক বাঞ্ছনীয় নয়, আমি এটি ব্যবহার করি।
কুলমাইন্ড

9

এইচটিটিএলপিগিং ইনটারসেপ্টারের সাহায্যে 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 হয়।

এখানে এটি লগ.ডি (ডিবাগ) এবং হার্ডকোডযুক্ত "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);
    }
}

আমি তাদের কোডে এটি নিজেই সন্ধান করছিলাম কিন্তু এটি খুঁজে পেল না। ধন্যবাদ.
বাগগুলি ঘটেছে

8

লগকটে দীর্ঘ বার্তাটি দেখানোর জন্য এই কোডের টুকরোটি ব্যবহার করে দেখুন।

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

7
যখন একটি সাধারণ লুপ পর্যাপ্ত হবে, কেন পুনরাবৃত্তি ব্যবহার করুন।
পেলেসাইড

4
আমি কোডটির রিডিবিলিট এবং পুনরায় ব্যবহার দুর্দান্ত দেখতে পেয়ে আমি পুনরাবৃত্তির একজন অনুরাগী। তবে এই টেল এন্ড রিকার্সনটি স্ট্যাক ফ্রেমগুলি দ্রুত তৈরি করতে পারে যদি আপনার সংকলক সেগুলি অনুকূল করে না (যা আমি বিশ্বাস করি না যে অ্যান্ড্রয়েড স্টুডিওটি এটি করে) এর অর্থ হ'ল যদি আপনার কাছে যথেষ্ট দীর্ঘ বার্তা থাকে যা বার বার পুনরাবৃত্ত কলগুলির কারণ হয়ে থাকে আপনি সহজেই একটি স্ট্যাকওভারফ্লোআরিয়ার তৈরি করতে পারেন।
লুক 12

3

লগ বার্তাগুলি জুড়ে বিভক্ত রেখাগুলি হ্রাস না করার জন্য, আমি বড় স্ট্রিংটি নিই এবং প্রতিটি লাইন আলাদাভাবে লগ করি।

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

1

@ স্প্যাটুলামিনিয়ার উত্তরের (বিশেষত অলস / স্মার্ট লোকের জন্য) কোটলিন সংস্করণ এখানে রয়েছে :

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

1

আমি টিমবারকে এই সমস্যাটির জন্য একটি ভাল বিকল্প হিসাবে বিবেচনা করি। কাঠ স্বয়ংক্রিয়ভাবে বিভক্ত হয় এবং লগকটে বার্তার খণ্ডগুলি মুদ্রণ করে।

https://github.com/JakeWharton/timber

আপনি timber.log.Timber.DebugTree স্ট্যাটিক ক্লাসে লগ পদ্ধতি প্রয়োগ দেখতে পাবেন।


0

যদি প্রিন্ট জেসন স্ট্রিং থাকে তবে নীচের কোডটি ব্যবহার করতে পারেন

    @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 ("জসন-ট্যাগ", "{}")

পূর্বরূপ ফলাফল


-3

একটি সহজ সমাধানের জন্য, নীচের সংযুক্তি বিন্দুতে নরম মোড়ানো বিকল্পটি ব্যবহার করুন 4 বিকল্পগুলি আপনাকে সহায়তা করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.