Android自定义Log库
JulBirchell
8年前
<h2><strong>背景</strong></h2> <p>我们在开发的时候肯定会打一些Log,特别是在调试代码或者bug的时候,我们都会打一些Log日志来记录,但是当我们发布正式版本的时候,尼玛,要一行一行的去掉,这就尴尬了。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/b8b6f3b8e2279136d61e634ec93b06af.jpg"></p> <p>懵逼状态</p> <h2><strong>励志封装Log库</strong></h2> <p>本来想使用github上的Logger库的,但是感觉有点烦中,后面看到了鸿洋大师写过一篇关于Log库的文章 Android反观Log库 后面我也是根据这个来简单的修改的</p> <h2><strong>自定义内容</strong></h2> <ol> <li>增加变量来区分debug模式还是release模式,在release的情况下将所有的Log日志都去掉。</li> <li>利用StackTraceElement来输出我们的Log的位置,便于我们定位和寻找日志。</li> </ol> <h2><strong>实现</strong></h2> <p>我们以i的log来作为例子:</p> <pre> <code class="language-java">/** * iiiiiiiiiiiiii * @param content */ public static void i(String content){ i(null,content); } public static void i(String tag,String content){ if (!sDebug) return; printer.i(getFinalTag(tag),content); }</code></pre> <p>其中的isDebug是我们的标识位,我们可以把它在初始化的时候来与编译类型绑定起来。</p> <p>其中Printer类是实现了打印Log日志功能的输出类:</p> <pre> <code class="language-java">public class LogPrint implements Printer{ @Override public void d(String message, String str) { new DebugLogText(message).setup(str); } @Override public void e(String message, String str) { new ErrorLogText(message).setup(str); } @Override public void e(String message, String str,Throwable throwable) { new ErrorLogText(message).setup(str+throwable.getMessage()); } @Override public void w(String message, String str) { new WarnLogText(message).setup(str); } @Override public void i(String message, String str) { new InfoLogText(message).setup(str); } @Override public void v(String message, String str) { new VerboseLogText(message).setup(str); } @Override public void wtf(String message, Object... args) { } @Override public void json(String message, String json) { new InfoLogText(message).setup(json); } @Override public void xml(String xml) { } @Override public void clear() { } }</code></pre> <p>具体的输出类型是由对应的Log类型来产生,我们来看一个类InfoLogText:</p> <pre> <code class="language-java">public class InfoLogText extends LogText { public InfoLogText(String tag) { super(tag); } @Override protected void setUpHeader() { Log.i(mTag, SINGLE_DIVIDER); } @Override protected void setUpFooter() { Log.i(mTag, DOUBLE_DIVIDER); } @Override protected void setUpContent(String content) { StackTraceElement targetStackTraceElement = getTargetStackTraceElement(); Log.i(mTag, "(" + targetStackTraceElement.getFileName() + ":" + targetStackTraceElement.getLineNumber() + ")"); Log.i(mTag, content); } }</code></pre> <h2><strong>总结</strong></h2> <p>我们可以看到,它实际调用的是系统的Log的日志方法,当然拼接了,对应的Log日志的类和行数,具体的原理我们可以查看上面提到的鸿洋的文章。</p> <p>好了,我么大家来看一下最后的日志效果</p> <pre> <code class="language-java">11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ******************************************** 11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: (MainActivity.java:30) 11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: is a test 11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ════════════════════════════════════════════</code></pre> <p> </p> <p> </p> <p>来自:http://www.jianshu.com/p/ef509328a466</p> <p> </p>