博客
关于我
Timber 配合 logback-android (slf4j) Log输出
阅读量:500 次
发布时间:2019-03-07

本文共 4898 字,大约阅读时间需要 16 分钟。

Timber 配合 Logback-Android

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

三、日志记录配置

3.1 据功能描述

  • 初始化日志输出

    Timber.tag("Custom_TAG").d("This is a debug log.");
  • 异步日志记录

    Timber.logPreferredCrash Alley{    ...}
  • 多线程安全性

    // 确保在多线程环境下避免日志重sandboxfinal android.os.Handler mainHandler = new android.os.Handler(getMainLooper());final PriorityQueue
    runnableQueue = 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 { // 处理队列已满的情况 }}
  • 四、JAVA实现

    4.1 核心日志处理逻辑

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

    4.2 简化日志工具类设计

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

    五、参考资料

    • Android 文件系统结构
    • Logback-Android 权限配置
    • RollingFileAppender 面板配置
    • FileLoggingTree 日志处理逻辑

    转载地址:http://bovcz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现slow sort慢排序算法(附完整源码)
    查看>>
    Objective-C实现smo算法(附完整源码)
    查看>>
    Objective-C实现SNTP协议(附完整源码)
    查看>>
    Objective-C实现sobel filter索贝尔过滤器算法(附完整源码)
    查看>>
    Objective-C实现Sobel算子(附完整源码)
    查看>>
    Objective-C实现Sobel算子(附完整源码)
    查看>>
    Objective-C实现sobel边缘检测算法(附完整源码)
    查看>>
    Objective-C实现sock merchant袜子商人问题算法(附完整源码)
    查看>>
    Objective-C实现softmax函数功能(附完整源码)
    查看>>
    Objective-C实现stooge sort臭皮匠排序算法(附完整源码)
    查看>>
    Objective-C实现strand sor链排序排序算法(附完整源码)
    查看>>
    Objective-C实现strassen matrix multiplication施特拉森矩阵乘法算法(附完整源码)
    查看>>
    Objective-C实现StringSearch字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现strncmp函数功能(附完整源码)
    查看>>
    Objective-C实现strncpy函数功能(附完整源码)
    查看>>
    Objective-C实现strongly Connected Components 强连通分量算法(附完整源码)
    查看>>
    Objective-C实现strongly connected components强连通分量算法(附完整源码)
    查看>>
    Objective-C实现strschr函数功能(附完整源码)
    查看>>
    Objective-C实现strsep函数功能(附完整源码)
    查看>>
    Objective-C实现subset generation子集生成算法(附完整源码)
    查看>>