Android日志工具-SLog说明

2017-09-13  本文已影响316人  叨叨宅

作为一个码农,我希望有一天面朝大海,没有bug(想想,就算了),然鹅!!!现实是骨感的。
在东财有段时间了,闲暇之余,决定改造下项目中的日志库。这便是此篇文章的由来,下面 说说主角。

既然要做一个日志库并且开源给大家共享,那便需要足够的扩展性,同时要做好简单易用和性能高效。OK!目标已经明确,我要开车啦!

SLog主要四个模块:

模块名称 说明
配置 日志库通用配置
日志打印机 日志数据输出工具
格式化工具 包装原始日志信息成我们想要的格式
缓存管理 处理日志缓存文件

下面依次介绍:

一、配置

主要是com.weiqi.slog. Settings这个类

       //init log
        Settings settings = new Settings.Builder()
                .context(context)//获取设备信息等写到日志文件头部
                .mLogSegment(LogSegment.TWENTY_FOUR_HOURS)//保存日志文件名时间切片 如果缓存日志量大可以使用小时间片
                .zoneOffset(ZoneOffset.P0800)//保存日志时区偏移
                .timeFormat(SLogConstants.DEFAULT_TIME_FORMAT)//保存日志时间头格式
                .isBorder(true)//是否 开启外框
                .isThread(true)//是否 打印线程信息
                .isStackTrace(true)//是否 打印堆栈跟踪信息 非必要可以关闭 提升性能
                .build();

这里基本是设置日志库通用配置参数,注释已经说的很清楚了。

二、日志打印机

在com.weiqi.slog.printer包下有这几个类:

类名 说明
Printer.java 接口类
PrinterSet.java 接口集合
DefaultFilePrinter.java 默认的文件打印机,实现了日志信息写入SD卡
DefaultConsolePrinter.java 默认的logcat打印机,实现了日志信息logcat中显示

1、使用说明:

        /**
         * 创建一个控制台打印机
         */
        Printer consolePrinter = new DefaultConsolePrinter();
        /**
         * 设置需要的堆栈跟踪信息深度为2层并开启数据自动JSON格式化
         */
        consolePrinter.setFormatter(new DefaultConsoleFormatter(3, true));

        /**
         * 创建一个SD卡文件打印机 设置日志存储地址
         * 默认开启 一个文件上限为30的缓存清理工具 你也可以null关闭 或者自定义实现
         */
        Printer filePrinter = new DefaultFilePrinter(SDUtils.getLogPath(getApplicationContext()));
        filePrinter.setFormatter(new DefaultFileFormatter());
        filePrinter.addLevelForFile(new ArrayList<LogLevel>() {//需要写入文件的日志类型 不设置默认全写入日志文件
            {
                add(LogLevel.WTF);
            }
        });

        /**
         * 打印机放入集合
         */
        if (BuildConfig.DEBUG) {
            SLog.init(settings, consolePrinter, filePrinter);
        } else {
            SLog.init(settings, filePrinter);//非debug环境 关闭consolePrinter
        }

2、代码说明:
(1)、DefaultConsolePrinter.java

    @Override
    public void println(LogLevel logLevel, String tag, String msg, boolean isBorder,
                        boolean isThread, boolean isStackTrace, boolean isSync, String
                                fileSubffix) {

        if (mMessageFormatter != null) {//通过信息格式化工具包装日志信息
            msg = mMessageFormatter.format(logLevel, tag, msg, isBorder, isThread, isStackTrace);
        }

        onHandlePrint(logLevel, tag, msg);//logcat输出
    }

(2)、DefaultFilePrinter.java
文件打印机实现了同步、和异步两种方式将日志信息写入缓存文件。
同步方式:直接写入缓存文件,线程阻塞;
异步方式:日志加入写队列,通过写线程写入缓存文件,线程非阻塞。(推荐方式)

    @Override
    public void println(LogLevel logLevel, String tag, String msg, boolean isBorder,
                        boolean isThread, boolean isStackTrace, boolean isSync, String
                                fileSubffix) {
        if (mLogLevelsForFile != null && !mLogLevelsForFile.contains(logLevel)) {
            return;
        }

        if (mMessageFormatter != null) {
            msg = mMessageFormatter.format(logLevel, tag, msg, isBorder, isThread, isStackTrace);
        }

        onHandlePrint(msg, isSync, fileSubffix);
    }

    /**
    * 实现同步、异步方式写日志
    */
    private void onHandlePrint(String msg, boolean isSync, String fileSubffix) {
        LogPacket logPacket = new LogPacket(msg, fileSubffix);
        if (!isSync) {
            if (mWriterRunnable == null) {
                synchronized (this) {
                    LogFileWriterRunnable temp = mWriterRunnable;
                    if (temp == null) {
                        temp = new LogFileWriterRunnable(mLogFileHelper);
                        new Thread(temp).start();
                        mWriterRunnable = temp;
                    }
                }
            }
            mWriterRunnable.enqueue(logPacket);
        } else {
            mLogFileHelper.doPrintln(logPacket);
        }
    }

三、格式化工具

在com.weiqi.slog.printer包下有这几个类:

类名 说明
MessageFormatter.java 接口类
DefaultFileFormatter.java 对应在文件打印机中包装日志信息
DefaultConsoleFormatter.java 对应在logcat打印机中包装日志信息
DefaultBorderFormatter.java 用边框包装日志信息

1、使用说明:
参考上一节打印机使用说明。实现也比较简单,就不多说了。

四、缓存管理

在com.weiqi.slog.cacher包下有这几个类:

类名 说明
CacheHelper.java 接口类
LogCacheHelper.java 对应在文件打印机中管理日志缓存文件

1、使用说明:

    public DefaultFilePrinter(String logDir) {
        CacheHelper cacheHelper = new LogCacheHelper(logDir, 30);
        init(logDir, cacheHelper);
    }

    public DefaultFilePrinter(String logDir, CacheHelper cacheHelper) {
        init(logDir, cacheHelper);
    }

2、代码说明:
通过对日志文件按创建日志从先到后排列,自动删除缓存旧文件,保留最新的30个缓存文件。

五、完结

好啦,到这里就介绍完了,有什么异议或者建议,请提在文章评论区或者github issues
项目地址 点这里


【原创出品 未经授权 禁止转载】
【欢迎微友分享转发 禁止公号等未经授权的转载】

上一篇下一篇

猜你喜欢

热点阅读