Android开源日志库Logger的使用,日志重复打印、无法对齐问题。

基于 com.orhanobut:logger:2.2.0

Logger的GitHub地址:https://github.com/orhanobut/logger

1.添加依赖

implementation ‘com.orhanobut:logger:2.2.0‘

2.初始化

Logger.addLogAdapter(new AndroidLogAdapter());

或者

FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
        .showThreadInfo(true)   // (可选) 是否显示线程信息。Default:true
        .methodCount(1)        // (可选) 显示的方法数量。Default:2
        .methodOffset(0)       // (可选) 隐藏的方法数量,若设为 1,则隐藏跳转到日志输出的方法。Default:0
//        .logStrategy(customLog)   // (可选) 更改日志策略以打印输出。Default:new LogcatLogStrategy()。AS3.0会出现日志无法对齐的问题,下文有解决方法。
//        .tag("My custom tag")    // (可选) 每个日志的全局标记. Default:PRETTY_LOGGER
        .build();
  Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy){
  // 日志适配器通过检查此函数来检查日志是否应该打印。如果要禁用/隐藏输出日志,请重写isLoggable方法。true将打印日志消息,false会忽略它。
    @Override public boolean isLoggable(int priority, String tag) {
        return BuildConfig.DEBUG;
    }
});

注意:应放到application中初始化。为了保证仅初始化一次LogAdapter,一个LogAdapter便不会重复输出日志。分析源码得:

LogAdapter在集合中,每次初始化都会向集合中添加LogAdapter

public final class Logger {
    public static void addLogAdapter(@NonNull LogAdapter adapter) {
        printer.addAdapter(checkNotNull(adapter));
    }
}

public interface Printer {
    void addAdapter(@NonNull LogAdapter adapter);
}

class LoggerPrinter implements Printer {
    private final List<LogAdapter> logAdapters = new ArrayList<>();
    @Override public void addAdapter(@NonNull LogAdapter adapter) {
        logAdapters.add(checkNotNull(adapter));
    }
}

日志输出会遍历LogAdapter集合,所以集合中有多少个LogAdapter就会输出多少次。

class LoggerPrinter implements Printer {
    @Override public synchronized void log(int priority, @Nullable String tag, @Nullable String message, @Nullable Throwable throwable) {
        if (throwable != null && message != null) {
            message += " : " + Utils.getStackTraceString(throwable);
        }
        if (throwable != null && message == null) {
            message = Utils.getStackTraceString(throwable);
        }
        if (Utils.isEmpty(message)) {
            message = "Empty/NULL log message";
        }

        for (LogAdapter adapter : logAdapters) {
            if (adapter.isLoggable(priority, tag)) {
                adapter.log(priority, tag, message);
            }
        }
    }
}

3.使用

Logger.d("debug");
Logger.e("error");
Logger.w("warning");
Logger.v("verbose");
Logger.i("information");
Logger.wtf("What a Terrible Failure");

支持字符串格式参数:

Logger.d("hello %s", "world");

支持集合(仅可用于调试日志):

Logger.d(MAP);
Logger.d(SET);
Logger.d(LIST);
Logger.d(ARRAY);

JSON和XML支持(输出将处于调试级别):

Logger.json(JSON_CONTENT);
Logger.xml(XML_CONTENT);

效果展示:

将日志保存到文件中,请参照官网。

Logger工作原理图(来自GitHub):

解决在Android Studio 3.0以上的版本中Logger无法对齐的问题

/**
 * 自定义LogStrategy,解决AS3.0以上版本中日志无法对齐的问题
 */
public class MyLogcatLogStrategy implements LogStrategy {
    @Override
    public void log(int priority, @Nullable String tag, @NonNull String message) {
        Log.println(priority, randomKey() + tag, message);
    }

    private int last;

    private String randomKey() {
        int random = (int) (10 * Math.random());
        if (random == last) {
            random = (random + 1) % 10;
        }
        last = random;
        return String.valueOf(random);
    }
}

// Logger 初始化时,将该类实例化,并设置到 LogStrategy 中
PrettyFormatStrategy strategy = PrettyFormatStrategy.newBuilder()
        .logStrategy(new LogCatStrategy())
        .tag("TAG")//(可选)这里也可以设置全局TAG
        .build();
Logger.addLogAdapter(new AndroidLogAdapter(strategy));

原文地址:https://www.cnblogs.com/zhaolanqi/p/10039813.html

时间: 2024-07-29 20:58:44

Android开源日志库Logger的使用,日志重复打印、无法对齐问题。的相关文章

Android 开源日志库 Logger 使用教程

转载请注明出处: http://blog.csdn.net/like_program/article/details/52986553 1.Logger 是什么 在我们日常的开发中,肯定是少不了要和 Log 打交道,回想一下我们是怎么使用 Log 的:先定义一个静态常量 TAG,TAG 的值通常是当前类的类名,然后在需要打印 Log 的地方,调用 Log.d(TAG, "要打印的内容").每次新写一个类,都要写一个 TAG,这也就算了,最苦逼的是,项目一上线,还要手动去把每个 Log

爆料喽!!!开源日志库Logger的使用秘籍

导读 日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://github.com/orhanobut/logger 在Android Studio中的gradle中加入,就可以引用依赖logger库: dependencies { compile 'com.orhanobut:logger:1.15' } Logger库能提供的功能: 线程的信息 类的信息

android开源图表库MPAndroidChart文档翻译(上)

MPAndroidChart 是 Android 系统上一款开源的图表库.目前提供线图和饼图,支持选择.缩放和拖放. android开源图表库MPAndroidChar的githu地址: https://github.com/PhilJay/MPAndroidChart 文档地址:https://github.com/PhilJay/MPAndroidChart/wiki API地址:https://jitpack.io/com/github/PhilJay/MPAndroidChart/v2.

Android开源图表库XCL-Charts版本号公布及展示页

XCL-Charts V2.1 Android开源图表库(XCL-Charts is a free charting library for Android platform.) XCL-Charts基于原生的Canvas来绘制各种图表,在设计时,尽量在保证开发效率的同一时候,给使用者提供足够多的定制化能力. 因此使用简便,同一时候具有相当灵活的定制能力. 眼下支持(3D/非3D,背向式)柱形图(Bar Chart).3D/非3D饼图(Pie Chart).堆叠图(Stacked Bar Cha

【Android开源项目解析】RecyclerView侧滑删除粒子效果实现——初探Android开源粒子库 Leonids

前两天在微博上看到了这个侧滑删除的粒子效果,但是只有IOS的,所以心血来潮,写了个玩玩,下面简单介绍下实现的思路 项目简介 实现原理解析 代码实现 如何使用 更多参考 项目简介 先不废话,上效果图 项目地址:https://github.com/ZhaoKaiQiang/ParticleLayout 实现原理解析 其实看了那么多的关于侧滑删除的项目,再来思考这个问题,就so easy了! 咱们先分析下需求: - 侧滑手势检测 - 粒子跟手效果 - 删除状态判断 - 数据源刷新 ok,知道需求了,

Android开源图表库介绍

XCL-Charts XCL-Charts V1.8     Android开源图表库(XCL-Charts is a free charting library for Android platform.)     XCL-Charts基于Android原生Canvas来绘制各种图表,使用简便,定制灵活.     目前支持3D/非3D柱形图(Bar Chart).3D/非3D饼图(Pie Chart).堆积图(Stacked Bar Chart).面积图(Area Chart). 折线图(Li

Android开源工具库

 一.依赖注入DI 通过依赖注入减少View.服务.资源简化初始化,事件绑定等重复繁琐工作 1. AndroidAnnotations(Code Diet) android快速开发框架 项目地址:https://github.com/excilys/androidannotations 文档介绍:https://github.com/excilys/androidannotations/wiki 官方网站:http://androidannotations.org/ 特点:(1)依赖注入:包

android开源图表库MPAndroidChart文档翻译(下)

在 android开源图表库MPAndroidChart文档翻译(中) 介绍了设置数据,设置颜色,轴的格式化,图例,动态修改数据.这篇文章继续翻译MPAndroidChart文档剩余内容. 十七.ChartData 类 这个WIKI条目的意图是更好的介绍MPAndroidChart的数据模型. ChartData类是所有图表数据类的基类,例如LineData,BarData等等,通过图表的setData方法提供表格数据. public class LineData extends ChartDa

android开源图表库MPAndroidChart文档翻译(中)

在 android开源图表库MPAndroidChart文档翻译(上) 中,介绍了mpandroidchart的创建,回调方法,还有轴.这篇文章继续翻译剩余内容.文档内容比较多,这是中篇.最后的内容在下篇做翻译. 六.设置数据 要给图表设置数据,调用的方法为 public void setData(ChartData data) { ... } ChartData是渲染过程中所需图表所有数据和信息的基类.对于每种图表,有不同的子类用来设置特定图表的数据.例如LineData.可以用ArrayLi