打造最好用的日志库: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>