Android日志打印工具-android-ueueo-log

android-ueueo-log

android-ueueo-log是Android日志输出工具,对输出的日志信息进行了美化,可以输出Json字符串,Xml字符串和简单的Java对象,并对输出信息进行了格式化。

感谢Logger,因为是基于Logger然后根据自己的需求做的一些修改。

特性

  • 输出Json,Xml和Java对象(包括数组,集合,Map),并进行了格式化缩进;
  • 输出打印日志的方法调用栈信息;
  • 输出当前线程信息;
  • 支持将日志存储到文件中;
  • 可自由控制日志输出级别;
  • 支持日志的拼接组合输出;

下载和导入

可以从Github上下载源码:android-ueueo-log

简书地址:http://www.jianshu.com/p/5719e25d970b

项目中使用Gradle导入:

dependencies {
   compile 'com.ueueo:ueueo-log:2.5'
}

如何使用

初始化

UELog共提供了4个初始化方法:

UELog.init("AAA");
UELog.init("AAA", 2);
UELog.init("AAA", 3, UELogLevel.INFO);
UELog.init("AAA", 4, UELogLevel.INFO, true);

第一个参数:全局日志打印的Tag(默认为UEUEO);
第二个参数:打印方法调用栈的数量(默认为 1);
第三个参数:指定日志打印级别,只有要输出的日志级别大于等于(>=)此参数值,才会打印。
日志级别从低到高分别为:
VERBOSE=1,DEBUG=2,INFO=3,WARN=4,ERROR=5,ASSERT=6,NONE=7,当指定为NONE时就不会输出任何日志了;
第四个参数:指定日志是否保存到文件中(默认为false不保存)。
日志文件存储路径为外部存储空间的根目录下 UEUEO文件夹里,日志文件会根据不同的Tag而存储在不同的文件夹中,当程序运行打印第一条日志时会根据当前时间创建日志文件,并且此次运行都存储在此日志文件中,当退出应用重新启动进程,则会创建新的日志文件。

如果不进行任何初始化操作,则所有参数都为默认值。

输出Json,Xml和Java对象

//输出Json字符串
UELog.json("{\"id\":221,\"name\":\"my name is ueueo\",\"desc\":\"this is description!\"}");
//输出Xml字符串
UELog.xml("<?xml version=\"1.0\" encoding=\"UTF-8\"?><html><title>this is a title</title><body>这个是网页</body></html>");

//创建Java对象
User user = new User();
user.id = 102;
user.name = "UEUEO";
user.age = 22;
//输出对象
UELog.object(user);   
             

输出结果分别如下图:

输出打印日志的方法调用栈信息

上图分别为输出1级方法调用栈,输入3级方法调用栈和不输出方法调用栈的日志输出结果。

前两条日志当有方法调用栈输出时,日志信息会通过边框美化输出,而第三条日志因为不需要输出方法调用栈信息,而且日志信息是单行日志,输出时为了不占用控制台输出空间,所以不会添加边框。但是如果输出多行日志则会有边框,例如:

UELog.i("第一行日志 \n 换行输出日志");

输出结果如下:

Exception输出

try {
    Object obj = null;
    obj.toString();
} catch (Exception e) {
    UELog.e(e, "空指针异常");
}

输出结果如下:

输出有不定参数的字符串日志

     UELog.i("指定参数的日志输出  参数1:%d  参数2:%s   参数3:%s", 110, "apple", "ueueo");

输出结果如下:

设置当前要打印日志的Tag,方法调用栈数量和文件存储

上面说明了,当调用UELoginit方法进行初始化时,可以指定日志的Tag等配置信息,这些配置影响的是全局的日志输出,但是有些时候我们可能希望当前要输出的日志与init方法指定的配置不一样,例如:

init时指定Tag为AAA,但是当前的日志希望Tag为BBB,则:

UELog.init("AAA");            
UELog.i("输出的日志Tag是AAA");
UELog.tag("BBB").i("输出的日志Tag是AAA");
UELog.i("再次输出的日志Tag是AAA");

输出结果如下:

除了可以单独指定Tag外,还可以指定方法调用栈显示数量和是否存储到文件:

UELog.tag("BBB").method(3).file(true).i("输出的日志Tag是BBB,显示方法数量为3,并且保存到文件中");

日志的拼接组合输出

为了方便大家理解我所说的日志的拼接组合,我先来举个例子:

当发送网络请求时,需要打印请求的URL、请求参数和返回结果,一般的做法是:

//打印请求地址
UELog.i("POST  http://www.baidu.com/api/gps");
//打印请求参数
UELog.json("{\"id\":221}");
//打印返回结果
UELog.json("{\"name\":\"my name is ueueo\",\"desc\":\"this is description!\"}");

也就是分步打印数据,这样打印出来的结果如下:

这样看其实也挺清楚明白的,但是当网络请求多线程并发时,上面的日志就有可能变成如下:

这时候你还能看出谁是谁的参数,谁是谁的结果吗,肯定是不行的,而日志的拼接组合就是为了解决这个问题,我们先来看看下面的日志输出:

看到这样的输出是不是更加的清楚明白,那这个日志是怎样输出的呢?如下:

//拼接合并输出
UELog.append("POST  http://www.baidu.com/api/gps");
UELog.append("请求参数");
UELog.appendJson("{\"id\":221}");
UELog.append("返回结果");
UELog.json("{\"name\":\"my name is ueueo\",\"desc\":\"this is description!\"}");

UELog提供了append方法,可以对多次要输出的内容进行拼接,然后最后一次行的输出,append方法有:

UELog.append("字符串");//拼接字符串
UELog.appendJson("{\"id\":221}");//拼接Json字符串
UELog.appendXml("<html></html>");//拼接Xml字符串
UELog.appendObject(obj);//拼接对象

也可以这样拼接:

UELog.append("字符串").appendJson("{\"id\":221}").appendXml("<html></html>").appendObject(obj).i("输出");

append方法并不会进行日志输出,只有调用了日志输出方法才会最终输出的控制台,输出方法就是:

UELog.v("verbose level log");
UELog.d("debug level log");
UELog.i("info level log");
UELog.w("warn level log");
UELog.e("error level log");
UELog.wtf("assert level log");
UELog.json("json string log");
UELog.xml("xml string log");
UELog.object(obj);

注意:

  • 其中json,xml和object的输出都是以debug等级输出的;
  • append方法的调用必须是在同一线程内才有效,所以最好保证你的append方法的调用都是在同一个方法里,而且调用日志输出方法输出日志之后,append拼接的日志将被清空,再次打印的日志将没有之前的拼接信息;

作者 UEUEO

简书主页:http://www.jianshu.com/u/7adf23444c8d

有什么问题或者建议欢迎在简书上给我留言,谢谢~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • ✨ 2016年 很特别 这一年结束了高中时光 这一年开始了大学生活 在心里告别了许多人 或是班级里作为大家的榜样 ...
    几木木木阅读 275评论 0 0
  • 上大学的时候,觉得世界是美好的,现实是美好的,然而,毕业却打破了一切的幻想,把一切赤裸裸的现实摆在面前,最后用这些...
    对方正在输入_44b6阅读 185评论 0 1