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>