
使用方法:
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 日志工具所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)