Android Log 日志工具,显示超长日志

【Java-代码】

import android.util.Log;

public class LogUtils {

    /**
     * 手动关闭日志,false关闭,true打开
     */
    private static boolean mLogAble = isDebug();

    private static boolean isDebug() {
        return true;
    }


    public static void v(String tag, String msg) {
        v(tag, msg, (Throwable) null);
    }

    public static void v(String tag, String msg, Throwable ex) {
        showLongLog(0, tag, msg, ex);
    }

    public static void d(String tag, String msg) {
        d(tag, msg, (Throwable) null);
    }

    public static void d(String tag, String msg, Throwable ex) {
        showLongLog(1, tag, msg, ex);
    }

    public static void i(String tag, String msg) {
        i(tag, msg, (Throwable) null);
    }

    public static void i(String tag, String msg, Throwable ex) {
        showLongLog(2, tag, msg, ex);
    }


    public static void w(String tag, String msg) {
        w(tag, msg, (Throwable) null);
    }

    public static void w(String tag, String msg, Throwable ex) {
        showLongLog(3, tag, msg, ex);
    }


    public static void e(String tag, String msg) {
        e(tag, msg, (Throwable) null);
    }

    public static void e(String tag, String msg, Throwable ex) {
        showLongLog(4, tag, msg, ex);
    }

    private static void showLongLog(int level, String tag, String msg, Throwable tr) {
        if (mLogAble) {
            msg = msg + '\n' + Log.getStackTraceString(tr);
            //为了显示完整中文日志,1024
            int segmentSize = 1024;
            long length = msg.length();

            if (length > segmentSize) {
                while (msg.length() > segmentSize) {
                    // 循环分段打印日志
                    String logContent = msg.substring(0, segmentSize);
                    showLog(level, tag,  logContent);
                    msg = msg.substring(logContent.length());
                }
            }
            showLog(level, tag,  msg);
        }
    }

    private static void showLog(int level, String tag, String msg) {
        switch (level) {
            case 1:
                Log.d(tag, msg);
                break;
            case 2:
                Log.i(tag, msg);
                break;
            case 3:
                Log.w(tag, msg);
                break;
            case 4:
                Log.e(tag, msg);
                break;
            default:
                Log.v(tag, msg);
                break;
        }
    }

}



【Kotlin-代码】

import android.util.Log

object LogUtilsKt {
    /**
     * 手动关闭日志,false关闭,true打开
     */
    private val mLogAble = isDebug

    private val isDebug: Boolean
        private get() = true

    @JvmOverloads
    fun v(tag: String, msg: String, ex: Throwable? = null as Throwable?) {
        showLongLog(0, tag, msg, ex)
    }

    @JvmOverloads
    fun d(tag: String, msg: String, ex: Throwable? = null as Throwable?) {
        showLongLog(1, tag, msg, ex)
    }

    @JvmOverloads
    fun i(tag: String, msg: String, ex: Throwable? = null as Throwable?) {
        showLongLog(2, tag, msg, ex)
    }

    @JvmOverloads
    fun w(tag: String, msg: String, ex: Throwable? = null as Throwable?) {
        showLongLog(3, tag, msg, ex)
    }

    @JvmOverloads
    fun e(tag: String, msg: String, ex: Throwable? = null as Throwable?) {
        showLongLog(4, tag, msg, ex)
    }

    private fun showLongLog(level: Int, tag: String, msg: String, tr: Throwable?) {
        var message = msg
        if (mLogAble) {
            message = """
                $message
                ${Log.getStackTraceString(tr)}
                """.trimIndent()

            //为了显示完整中文日志,1024
            val segmentSize = 1024
            val length = message.length.toLong()

            if (length > segmentSize) {
                while (message.length > segmentSize) {
                    // 循环分段打印日志
                    val logContent = message.substring(0, segmentSize)
                    showLog(level, tag, logContent)
                    message = message.substring(logContent.length)
                }
            }
            showLog(level, tag, message)
        }
    }

    private fun showLog(level: Int, tag: String, msg: String) {
        when (level) {
            1 -> Log.d(tag, msg)
            2 -> Log.i(tag, msg)
            3 -> Log.w(tag, msg)
            4 -> Log.e(tag, msg)
            else -> Log.v(tag, msg)
        }
    }
}



【测试】

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.filters.MediumTest;
import com.technology.myapplication.utils.LogUtils;
import com.technology.myapplication.utils.LogUtilsKt;
import org.junit.Test;
import org.junit.runner.RunWith;

@MediumTest
@RunWith(AndroidJUnit4.class)
@LargeTest
public class LogExampleUnitTest {

    @Test
    public void testV() {
        //中文字符和英文数字字符显示的长度有所不同
        //经过代码测试,中文日志不分段显示的话,大约能显示1355个字符
        //数字英文字符大约能显示4055个字符
        //所以当需要显示一段比较长的日志时,每次显示1024个

        String msg = "自己复制粘贴一条很长的字符显示,最好超过4096个字符";
        LogUtils.v("test-V", "size=" + msg.length());
        //不分割,只能显示字符:1355
        LogUtils.v("test-V", msg);

        String s = "";
        String text = "";
        for (int i = 0; i < 10000; i++) {
            s = s + "." + i;
            text += "我";

            if (i == 1033) {
                //不分割时,所显示的数字字符长度
                LogUtils.v("test-V", "显示的长度=" + (s.length() - 1));
            }
        }

        LogUtils.v("test-V", "数字字符长度 size=" + s.length());
        //不分割,只能显示字符:4059
        LogUtils.v("test-V", s);

        LogUtils.v("test-V", "中文字符长度 size=" + text.length());
        //不分割,只能显示字符:1353
        LogUtils.v("test-V", text);
    }

    @Test
    public void testKt(){
        String msg = "自己复制粘贴一条很长的字符显示,最好超过4096个字符";
        LogUtilsKt.INSTANCE.e("testKt", msg);
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341