博客
关于我
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/

    你可能感兴趣的文章
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>
    Python听写汇总结果
    查看>>
    python吊打Excel?屁!那是你不会用!
    查看>>
    Python合并两张图片 | 先叠透明度再合并 (附Demo)
    查看>>
    python各进制的表述与转换
    查看>>
    python各种库安装
    查看>>
    python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
    查看>>
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>
    Python变量命名方法-ChatGPT4o作答
    查看>>