打造最好用的日志库:Android-PLog
KirCollazo
8年前
<p>做Android开发自然离不开日志的打印,从第一个Hello World程序到几十万行的大型App,开发用的IDE从Eclipse到Android Studio,编译系统从ant到gradle,LogCat要算最常用的又最不离不弃的一个工具了。那么日志工具类呢?用什么好?</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/b3eb955416dc648d7d4d97a4599a65fd.png"></p> <p style="text-align:center">我只是说标题</p> <p>好,这篇文章主要是要给我的一个类库做广告: <a href="/misc/goto?guid=4959714707664148562" rel="nofollow,noindex">Android-PLog</a> 。</p> <p>下面有请小明同学与他的老师为我们讲解这个库的需求和使用说明。</p> <h2><strong>引入依赖</strong></h2> <pre> <code class="language-java">小明:老师, Log.d(tag, msg) 好麻烦啊,我只是要打印一个msg看看而已,不想要tag怎么办啊? 老师:很简单啊,用 PLog.d(msg) 就好了。 小明:老师, 我这里找不到PLog这个类啊? 老师:在你的build.gradle里加上 compile 'org.mym.plog:android-plog:1.3.0' 就好啦。 小明:build.gradle是什么? 老师:滚出去!</code></pre> <p>PLog支持JCenter依赖,因此只要加上这么一行依赖就好啦。相信大家对build.gradle文件应该比小明熟悉吧?</p> <h2><strong>初始化和配置</strong></h2> <pre> <code class="language-java">PLog.init(PLogConfig.newBuilder() .forceConcatGlobalTag(true) .useAutoTag(true) //保持内部类信息 .keepInnerClass(true) //保持行号信息,点击可以跳转源文件 .keepLineNumber(true) //单行180,超过自动换行 .maxLengthPerLine(180) //release版本自动关闭日志 .controller(new EasyController(BuildConfig.DEBUG, BuildConfig.DEBUG)) .build());</code></pre> <pre> <code class="language-java">小明:老师,这些配置代码我得放哪里啊? 老师:当然是 Application 的 onCreate 里面。 小明:不可以在别的地方么? 老师: 当然可以,不过在你调用之前就不会使用你自己的配置啦 。 小明:我为什么需要这样做配置呢? 老师: 配置都是可选的 ,至于为什么推荐这么写,后面你就知道了。</code></pre> <h2><strong>空消息打印</strong></h2> <pre> <code class="language-java">小明同学已经很喜欢用不带tag的打印方式了。 小明:老师,我只想看看某个地方是不是执行了,每次都得去打印一句"PLog.d("Here")"或者"PLog.d("main activity method A executed")",好麻烦啊! 老师:你可以使用 PLog.empty() 方法,什么参数也不用传。 小明:哇,好方便!可是它只会输出为 "Here executed" ,我想改成 "我说要有光" ,怎么办? 老师:你在初始化的时候设置一下 emptyMsg(String) 就好了,顺便还可以通过 emptyMsgLevel 修改日志等级哦。 小明:嗯,可是我想让它在两个类当中输出的东西不一样怎么办? 老师:滚出去!</code></pre> <p>PLog的 empty() 方法主要是设计来观察程序执行路径的,因此输出内容一般不需要动态改变哦~~~~</p> <pre> <code>Tips:其实也是可以的,只要重新init一下就好了。</code></pre> <h2><strong>Loggable控制</strong></h2> <pre> <code class="language-java">小明同学用PLog越来越顺手了,忽然有一天发现日志太多了。 小明:老师,我忽然不想要这些日志在release版本打出来了怎么办? 老师:以前你是怎么做的? 小明:搞一个封装类,release的时候把标记位设置为false就好了。 老师:你回头看看你的 controller 配置是什么? 小明: EasyController 啰,不是你让我写的嘛。参数还传递的是 BuildConfig.DEBUG ……啊,我知道了。 小明:不过还有个问题,我想只关闭WARN以下级别的日志怎么办? 老师:自己去实现 LogController 接口。</code></pre> <h2><strong>无限长字符串打印</strong></h2> <pre> <code class="language-java">小明同学有天收到了个8K的大JSON字符串。 小明:老师你看这个JSON完全没打印完嘛! 老师:谁让你以前用的 Log.d ,还不赶紧改过来,用 PLog.d 。 小明:可是这是LogCat的限制啊,超过4K会被截断, PLog 能解决? 老师: PLog 有个 maxLengthPerLine 选项,超出这个值可以自动换行。 别说超过4K了,就算是2K,你把滚动条从左拖到右不嫌累么? 小明:那传个什么值给它呢? 老师:一般给个140~220就可以了,看你屏幕显示得了多少呗。 小明:回头我就买个宽屏。</code></pre> <h2><strong>参数格式化和Throwable</strong></h2> <pre> <code class="language-java">小明:老师我今天什么消息都不想打印,就想打印一个Exception。以前用的 Log.e(tag, msg, Throwable) ,现在 PLog 里找不到这个方法。 老师:用 Log.objects(Object...) 或者 Log.e(msg, Object...) 都可以。 不仅可以自动格式化参数,如果参数包含Throwable还可以打印堆栈 。</code></pre> <h2><strong>小明的试用报告</strong></h2> <ul> <li> <h3><sub>支持JCenter, 轻巧零依赖</sub></h3> </li> <li> <h3><sub>支持空消息打印(通常用于观察某处是否执行)</sub></h3> </li> <li> <h3><sub>支持无Tag、全局/局部Tag、自动Tag打印</sub></h3> </li> <li> <h3><sub>支持变长参数和自动格式化</sub></h3> </li> <li> <h3><sub>支持打点计时日志(TimingLog)</sub></h3> </li> <li> <h3><sub>可打印Throwable参数, 不影响过滤器</sub></h3> </li> <li> <h3><sub>支持显示行号,Android Studio控制台点击可跳转到源文件对应行, 还可以通过栈帧偏移控制跳转位置</sub></h3> </li> <li> <h3><sub>支持粒度可控的的loggable控制</sub></h3> </li> <li> <h3><sub>支持重定向Logger(通常用于本地文件打印、第三方日志接入等)</sub></h3> </li> <li> <h3><sub>无限长字符串打印, 同时支持自动换行</sub></h3> </li> </ul> <p><img src="https://simg.open-open.com/show/3af5575bdd992f4eed3706d257d9a870.jpg"></p> <p style="text-align:center">ScreenShot.png</p> <p> </p> <p> </p> <p>来自:http://www.jianshu.com/p/cf3b749b9efb</p> <p> </p>