Android 日志工具

Android 日志工具,第1张

概述目标实现功能打印日志到控制台和文件中日志支持在logcat窗口有链接跳转到对应的位置,文件中就直接拷贝内容到logcat窗口也支持链接文件支持设置文件大小和最大数量使用方法:LogUtil.d("process------------>");一共有两个文件LogUtil和LogFileUtil,代码如下:importand 目标实现功能打印日志到控制台和文件中日志支持在logcat 窗口 有链接跳转到对应的位置,文件中就直接拷贝内容到logcat 窗口 也支持链接文件支持设置文件大小和最大数量

使用方法:

LogUtil.d("process------------>");

一共有两个文件LogUtil和LogfileUtil,代码如下:

import androID.util.Log;/** * 输出各种级别的log到控制台 * msg字符长度不受限制,默认的Log是受限制的,超过的部分不输出 * 输出的log头有链接,可以点击链接到执行代码文件位置 * 可以直接输出msg,使用默认Tag * 支持设置 LEVEL,小于LEVEL级别以下不再打印log */public class LogUtil {    private static final String TAG = "LogUtil";    public static int LEVEL = Log.VERBOSE;    public static voID v(String TAG, String msg) {        if (LEVEL <= Log.VERBOSE) {            logWithlink(Log.VERBOSE, TAG, msg);        }    }    public static voID d(String TAG, String msg) {        if (LEVEL <= Log.DEBUG) {            logWithlink(Log.DEBUG, TAG, msg);        }    }    public static voID i(String TAG, String msg) {        if (LEVEL <= Log.INFO) {            logWithlink(Log.INFO, TAG, msg);        }    }    public static voID w(String TAG, String msg) {        if (LEVEL <= Log.WARN) {            logWithlink(Log.WARN, TAG, msg);        }    }    public static voID e(String TAG, String msg) {        if (LEVEL <= Log.ERROR) {            logWithlink(Log.ERROR, TAG, msg);        }    }    public static voID v(String msg) {        if (LEVEL <= Log.VERBOSE) {            logWithlink(Log.VERBOSE, TAG, msg);        }    }    public static voID d(String msg) {        if (LEVEL <= Log.DEBUG) {            logWithlink(Log.DEBUG, TAG, msg);        }    }    public static voID i(String msg) {        if (LEVEL <= Log.INFO) {            logWithlink(Log.INFO, TAG, msg);        }    }    public static voID w(String msg) {        if (LEVEL <= Log.WARN) {            logWithlink(Log.WARN, TAG, msg);        }    }    public static voID e(String msg) {        if (LEVEL <= Log.ERROR) {            logWithlink(Log.ERROR, TAG, msg);        }    }    //Log输出的最大长度    private static int LOG_MAX_LENGTH = 2000;//2000    /**     * 循环打印log,解决msg过长不打印问题     */    private static voID LogWrapperLoop(int logPriority, String TAG, String msg) {        int msgLength = msg.length();        /**         * adb  lgh=3         *  ^         *  |   index=1         * print a         */        int index = 0;//输出字符的位置        while (index < msgLength) {            if (index + LOG_MAX_LENGTH > msgLength) {                LogWrapper(logPriority, TAG, msg.substring(index, msgLength));            } else {                LogWrapper(logPriority, TAG, msg.substring(index, index + LOG_MAX_LENGTH));            }            index += LOG_MAX_LENGTH;        }    }    private static voID LogWrapper(int logPriority, String TAG, String msg) {        switch (logPriority) {            case Log.VERBOSE:                LogfileUtil.v(TAG, msg);                Log.v(TAG, msg);                break;            case Log.DEBUG:                LogfileUtil.d(TAG, msg);                Log.d(TAG, msg);                break;            case Log.INFO:                LogfileUtil.i(TAG, msg);                Log.i(TAG, msg);                break;            case Log.WARN:                LogfileUtil.w(TAG, msg);                Log.w(TAG, msg);                break;            case Log.ERROR:                LogfileUtil.e(TAG, msg);                Log.e(TAG, msg);                break;            case Log.ASSERT:                break;            default:                break;        }    }    /**     * 带有链接的log打印     */    private static voID logWithlink(int logPriority, String TAG, String msg) {        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();        int index = 4;        String classname = stackTrace[index].getfilename();        String methodname = stackTrace[index].getmethodname();        int lineNumber = stackTrace[index].getlineNumber();        methodname = methodname.substring(0, 1).toupperCase() + methodname.substring(1);        StringBuilder stringBuilder = new StringBuilder();        stringBuilder.append("[ (").append(classname).append(":").append(lineNumber).append(")#").append(methodname).append(" ] ");        stringBuilder.append(msg);        String logStr = stringBuilder.toString();        LogWrapperLoop(logPriority, TAG, logStr);    }}
import androID.util.Log;import java.io.file;import java.io.fileWriter;import java.io.filenameFilter;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Comparator;import java.util.Date;import java.util.concurrent.Executors;/** * 将日志打印到文件: * <p> * 支持设置文件最大大小LOG_SIZE_MAX  KB,超过大小重新创建文件(由于文件名是以毫秒为维度理论不会重复) * 支持文件总个数LOG_file_TOTAL,超过总个数删除最先创建的文件 * 支持设置日志文件输出目录LOG_file_PRINT_DIR */public class LogfileUtil {    // 日志文件总数    private static final int LOG_file_TOTAL = 10;    // 单日志文件大小上限 KB    private static final long LOG_SIZE_MAX = 5 * 1024;    // 日志文件输出文件夹    private static final String LOG_file_PRINT_DIR = "/sdcard/MyProject/log/info/";    // 文件名格式    private static final SimpleDateFormat file_name_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss-SSS");    //创建一个可重用固定线程数的线程池    private static java.util.concurrent.ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();    public static final voID v(String TAG, String msg) {        printLog("VERBOSE", TAG, msg);    }    public static final voID d(String TAG, String msg) {        printLog("DEBUG", TAG, msg);    }    public static final voID i(String TAG, String msg) {        printLog("INFO ", TAG, msg);    }    public static final voID w(String TAG, String msg) {        printLog("WARN ", TAG, msg);    }    public static final voID e(String TAG, String msg) {        printLog("ERROR", TAG, msg);    }    private static voID printLog(final String level, final String TAG, final String msg) {        singleThreadPool.execute(new Runnable() {            @OverrIDe            public voID run() {                try {                    fileWriter fileWriter = new fileWriter(getfile(), true);                    fileWriter.write(formatLog(level, TAG, msg));                    fileWriter.close();                } catch (Exception e) {                    e.printstacktrace();                }            }        });    }    //格式化日志    private static String formatLog(String level, String TAG, String msg) {        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");        StringBuilder builder = new StringBuilder();        builder.append(dateFormat.format(new Date(System.currentTimeMillis())) + " ");        builder.append("[" + level + "] ");        builder.append("[" + TAG + "] ");        builder.append(msg);        builder.append("\n");        return builder.toString();    }    // 获取需要输出的日志文件    private static file getfile() {        // 确认文件夹是否存在        file fileDir = new file(LOG_file_PRINT_DIR);        if (!fileDir.exists()) {            fileDir.mkdirs();        }        // 获取文件夹下的日志文件        file[] fileList = fileDir.Listfiles(new filenameFilter() {            @OverrIDe            public boolean accept(file dir, String name) {                return name.endsWith(".log");            }        });        int fileCount = fileList == null ? 0 : fileList.length;        // 没有日志文件时,直接创建新文件        if (fileCount == 0) {            return createLogfile();        }        // 只有一个日志文件时        if (fileCount == 1) {            return isCreateLogfile(fileList[0]);        }        // 对日志排序,排序结果为升序        Arrays.sort(fileList, new Comparator<file>() {            @OverrIDe            public int compare(file file1, file file2) {                String file1name = "";                String file2name = "";                try {                    file1name = file1.getname().split(".log")[0];                    file2name = file2.getname().split(".log")[0];                    Date datefile1 = file_name_FORMAT.parse(file1name);                    Date datefile2 = file_name_FORMAT.parse(file2name);                    return datefile1.getTime() < datefile2.getTime() ? -1 : 1;                } catch (Exception e) {                    Log.i("LogUtil", "file1name:" + file1name + ",   file2name:" + file2name);                    e.printstacktrace();                }                return 0;            }        });        file lastfile = fileList[fileCount - 1];        // 日志文件未超过最大控制个数        if (fileCount < LOG_file_TOTAL) {            return isCreateLogfile(lastfile);        }        if (sizeOf(lastfile) >= LOG_SIZE_MAX) {            // 删除时间最早的一个文件            fileList[0].delete();        }        return isCreateLogfile(lastfile);    }    // 确认是否需要创建新日志文件    private static file isCreateLogfile(file file) {        // 超过日志文件大小上限,需要创建新日志文件        if (sizeOf(file) >= LOG_SIZE_MAX) {            return createLogfile();        }        return file;    }    // 创建一个新的日志文件    private static file createLogfile() {        return new file(LOG_file_PRINT_DIR + file_name_FORMAT.format(new Date(System.currentTimeMillis())) + ".log");    }    // 计算文件大小,返回单位 KB    private static long sizeOf(file file) {        long length = file.length();        return length / 1024;    }}
总结

以上是内存溢出为你收集整理的Android 日志工具全部内容,希望文章能够帮你解决Android 日志工具所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1037041.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存