优点
1,线程信息:log在哪个线程
2,类信息:log在哪个类
3,方法信息:log在哪个方法的哪一行
4,各种集合输出:list、map、array、set等,(只支持debug输出)
5,将 json、xml 格式化后输出
6,支持参数添加占位符来格式化字符串,Logger.d(“hello %s”, “world”);
7,支持从日志跳转到源码
8,弥补了“android的logcat的message有字符长度的限制,超过将直接截断”的缺陷
9,漂亮的换行分割,整洁的输出
10,指定任意TAG
如何使用
1,添加依赖
compile 'com.orhanobut:logger:2.2.0'
2,在application的onCreate方法中进行初始化
Logger.addLogAdapter(new AndroidLogAdapter());
以上初始化方式使用的均是框架的默认配置,我们也可以自定义这些配置:
一般我们可能只需要定义一下全局的TAG标记。
FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
.showThreadInfo(false) //(可选)是否显示线程信息。 默认值为true
.methodCount(2) // (可选)要显示的方法行数。 默认2
.methodOffset(7) // (可选)设置调用堆栈的函数偏移值,0的话则从打印该Log的函数开始输出堆栈信息,默认是0
.logStrategy(customLog) //(可选)更改要打印的日志策略。 默认LogCat
.tag("MyTAG") //(可选)每个日志的全局标记。 默认PRETTY_LOGGER(如上图)
.build();
Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
3,然后就可以使用了
Logger.d("debug日志");
Logger.e("error日志");
Logger.i("info日志");
Logger.w("warning");
Logger.v("verbose");
Logger.wtf("wtf!!!!");
从图上也可以看出,框架默认的TAG为PRETTY_LOGGER。
可添加占位符
Logger.d("hello %s, luck number is %d", "world", 5);
可直接打印集合,数组等引用类型
/**
* List
*/
List list = new ArrayList();
list.add("hello");
list.add("world");
Logger.d(list);
/**
* Map
*/
Map map = new HashMap();
map.put("map1","hello");
map.put("map2","world");
Logger.d(map);
/**
* Set
*/
Set set = new HashSet();
set.add("hello");
set.add("world");
Logger.d(set);
/**
* Array
*/
String [] strs = {"hello", "world"};
Logger.d(strs);
注:
1,打印集合的时候,特别是数组时,前面不要添加其他字符,如:Logger.d(“数组集合”+strs);这样会把整体当做一个参数,导致判断错误,不能正常输出数组类型。
2,打印集合时,使用DEBUG等级。
打印JSON数据
public void testJson(){
String jsonDate = "{\"id\":859,\"channelnumber\":681,\"bilingual\":0,\"name\":\"beIN Sports 2 English 600K H265\",\n" +
" \"language\":\"EN\",\n" +
" \"videotype\":\"MPEG2\",\"audiotype\":\"MPEP1\",\"callsign\":\"beIN Sports 2 English 600K H265\",\"country\":\"cn\"};";
Logger.json(jsonDate);
Log.d(TAG, jsonDate);
}
打印XML数据
public void testXml() {
String xmlDate = "<province id=\"01\" name=\"北京\"> \n" +
" <city id=\"0101\" name=\"北京\"> \n" +
" <county id=\"010101\" name=\"北京\" weatherCode=\"101010100\"/> \n" +
" <county id=\"010102\" name=\"海淀\" weatherCode=\"101010200\"/> \n" +
" <county id=\"010103\" name=\"朝阳\" weatherCode=\"101010300\"/> \n" +
" <county id=\"010110\" name=\"石景山\" weatherCode=\"101011000\"/> \n" +
" </city> \n" +
" </province> ";
Logger.xml(xmlDate);
Log.d(TAG, xmlDate);
}
局部定义TAG
public void testNormal(){
Logger.t("hello").d("DEBUG日志");
Logger.i("INFO日志");
}
默认是在PRETTY_LOGGER后面拼接你的tag打印。
根据构建的应用版本来动态决定是否输出log
这样我们就再也不用通过手动配置true或者false来确定发布的版本了。
1,首先建议在app的build.gradle配置文件中自定义一个BuildConfig字段,语法格式如下:
buildConfigField "boolean", "LOG_DEBUG", "true"
上述语法就定义了一个boolean类型的LOG_DEBUG字段,值为true,该字段编译后自动生成。之后我们就可以在程序中通过BuildConfig.LOG_DEBUG来调用我们设置的字段值了。此处我们目的是为了自定义一个字段来动态控制不同版本下LOG日志的打印,所以我们先去app的build.gradle中创建一个Boolean的变量:
buildTypes {
release {
...
buildConfigField "boolean" , "LOG_DEBUG" , "false"
...
}
debug {
...
buildConfigField "boolean" , "LOG_DEBUG" , "true"
...
}
}
虽然在Gradle脚本中默认的debug和release两种模式BuildCondig.DEBUG字段分别为true和false,而且不可更改,但一般不建议直接使用该值,我们可以自定义添加新的字段,关于Android Studio中Gradle的其他妙用请查看本人的博客:安卓项目实战之:gradle配置中BuildConfig自定义字段的妙用
2,然后在application初始化的地方:
Logger.addLogAdapter(new AndroidLogAdapter() {
@Override
public boolean isLoggable(int priority, String tag) {
return BuildConfig.LOG_DEBUG;
}
});
通过适配器控制打印,只要覆盖isLoggable()方法,返回一个boolean值即可。如果返回true,将会打印日志信息,如果返回false,那么会忽略它。
注意:返回值导入的包是:import com.orhanobut.logger.BuildConfig; 有时顺手导入:com.gotechcn.frameworks,那就没有效果。
保存log到文件
要想将log保存到文件,只需要设置一个适配器就好了,但是需要注意如下两点:
1,Logger默认写入到本地的文件格式是csv格式,使用excel打开是这样的
可能你并不习惯,你还是想用txt
那么需要自定义一个CustomDiskStrategy类实现LogStrategy接口
将DiskLogStrategy的实现代码copy过去然后,修改下面代码中的csv为txt就好了:
但由于LogStrategy都是在FormatStrategy内部配置的,所有我们还需要自定义一个CustomFormatStrategy类,其实也是可以简单复制CvsFormateStrategy类,然后用我们刚才自定义的CustomDiskStrategy替换掉里面所有的DiskLogStrategy就好了!
2,如果你既需要在logCat中打印出log,同时又想将日志写入文件中,那么你需要为logger添加两个Adapter,例如下图所示,可以同时配置自定义的TxtFormateStrategy(或者自带的CvsFormateStrategy)和它自带的PrettyFormategy,如果只配置其中一个那么只会使其只具有相应的一个功能,所以如果既要保存到文件又要显示在logCat必须配置两个adapter。
如下的适配器也会将log日志保存到文件。
Logger.addLogAdapter(new DiskLogAdapter());
该适配器同样也可以重新配置默认的参数,但会有点不同,配置的是日期格式等。
通过打印,找到保存的路径: /storage/emulated/0
设置android studio中LogCat信息五颜六色
进入studio的settings界面,在输入框搜索logcat进入logcat设置界面,如下:
点击“Save As”自己新建一个style配置,然后依次点击选中一个日志级别,将Use Inberited attributes 的勾选去掉,再将 Foreground 前的复选框选上,双击后面的框框去选择想要设置的颜色,一一设置完后,点击apply,然后再点击ok。
Log日志级别 | 推荐颜色值 | 类型 |
---|---|---|
VERBOSE | BBBBBB | 琐碎的,意义最小的信息 |
DEBUG | 2770BB | 调试信息,调试程序时 |
INFO | 9CBB61 | 数据信息,可用来分析用户行为 |
WARN | C78537 | 警告信息,存在潜在风险 |
ERROR | FF6B68 | 错误信息,存在严重错误 |
ASSERT | FF3920 | 断言失败信息 |
Logcat日志信息的设置和过滤
左侧小工具栏的设置图标:用于对日志显示的内容进行设置,包括:时间、进程号、包名、Tag的显示与否。
过滤
上面的中间部分可以设置日志级别方面的过滤,后面的搜索栏用来搜索日志中出现的字符串。
Regex代表是否进行模糊匹配
最后面的下拉选择栏主要是用来设置日志过滤方式,如下:
如果要显示自己APP全部日志,选择show only selected application
如果只需要显示指定的日志信息,这时候我们就可以自己设置日志过滤规则:
点击Edit Filter Configuration选项,弹出如下对话框:
有四种过滤方式:
Log Tag
使用标签方式,如果你在文件中使用Log.d(Tag,logMessage) 这个tag标识就是你要设置的tag.
Log Message
日志信息
Package Name
根据应用程序的包名
PID
根据应用程序ID
后面的Regex表示是否模糊匹配日志
如果项目中使用了Logger日志框架,在没有自定义TAG的情况下我们知道框架默认的TAG是PRETTY_LOGGER,所以我们就可以这样设置:
这样就只会显示我们使用Logger框架输出的日志信息了。