本文共 4898 字,大约阅读时间需要 16 分钟。
Logback-Android 是一个强大的日志框架,可以将日志记录到文件、数据库、邮件或网络中。本文将介绍如何配置并实际使用 Logback-Android 与 Timber 结合进行日志记录。
在 Android 11 及及以上版本中,存储权限被改为强制分区存储。因此,需要将存储路径更改为内部存储路径,以确保日志能够顺利写入。
Logback-Android 的配置文件结构如下:
%-5relative [%thread] - %msg%n true true ${LOG_DIR}/base.log %date [%thread] %-5level - %msg%n ${LOG_DIR}/app.${today}.log true %date %-5relative [%thread] %-5level - %msg%n ${LOG_DIR}/app.%d{yyyy-MM-dd}.log 7 10MB
初始化日志输出:
Timber.tag("Custom_TAG").d("This is a debug log.");异步日志记录:
Timber.logPreferredCrash Alley{ ...}多线程安全性:
// 确保在多线程环境下避免日志重sandboxfinal android.os.Handler mainHandler = new android.os.Handler(getMainLooper());final PriorityQueuerunnableQueue = new PriorityQueue<>();public void log(final int priority, final String tag, final String message) { final Runnable runnable = new Runnable() { @Override public void run() { // Actual logging logic if (!TextUtils.isEmpty(message)) { String logMessage = tag + ": " + message; switch (priority) { case Log.DEBUG: case Log.INFO: case Log.WARN: case Log.ERROR: } } ... } }; if (runnableQueue.size() < MAX_LOG_THREADS) { runnableQueue.put(runnable); mainHandler.post(runnable); } else { // 处理队列已满的情况 }}
public class FileLoggingTree extends Timber.DebugTree { private static final Logger sLogger = LoggerFactory.getLogger(FileLoggingTree.class); @Override protected void log(int priority, String tag, String message, Throwable t) { if (priority == Log.VERBOSE) { return; } if (!TextUtils.isEmpty(message)) { String logMessage = tag + ": " + message; switch (priority) { case Log.DEBUG: sLogger.debug(logMessage); break; case Log.INFO: sLogger.info(logMessage); break; case Log.WARN: sLogger.warn(logMessage); break; case Log.ERROR: sLogger.error(logMessage); break; } } else { if (t != null) { switch (priority) { case Log.DEBUG: sLogger.debug(tag, t); break; case Log.INFO: sLogger.info(tag, t); break; case Log.WARN: sLogger.warn(tag, t); break; case Log.ERROR: sLogger.error(tag, t); break; } } } }} public class AppLogUtils { private static final String sTag = "AppLogUtils ==="; private static boolean sEnablingLog = true; private AppLogUtils() { throw new IllegalStateException("不能实例化Me!"); } public static boolean isLog() { return sEnablingLog; } public static void setLog(boolean enable) { sEnablingLog = enable; } public static void setTag(String tag) { sTag = tag; } public static void input(String msg) { if (!sEnablingLog) { return; } Timber.tag(sTag).i(msg); } public static void input(String tag, String msg) { if (!sEnablingLog || TextUtils.isEmpty(msg)) { return; } Timber.tag(sTag + tag).i(msg); } public static void warn(String tag, String msg) { if (!sEnablingLog || TextUtils.isEmpty(msg)) { return; } Timber.tag(sTag + tag).w(msg); } public static void error(String tag, String msg) { if (!sEnablingLog || TextUtils.isEmpty(msg)) { return; } Timber.tag(sTag + tag).e(msg); } public static void error(String tag, Exception e) { if (!sEnablingLog || e == null) { return; } Timber.tag(sTag + tag).e(e); } public static void debugInfo(String tag, String msg) { if (!sEnablingLog || TextUtils.isEmpty(msg)) { return; } Timber.tag(sTag + tag).d(msg); }} 转载地址:http://bovcz.baihongyu.com/