美文网首页
Android日志工具-SLog说明

Android日志工具-SLog说明

作者: 叨叨宅 | 来源:发表于2017-09-13 10:26 被阅读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
    项目地址 点这里


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

    相关文章

      网友评论

          本文标题:Android日志工具-SLog说明

          本文链接:https://www.haomeiwen.com/subject/bphhsxtx.html