大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述Android 开源日志库 Logger 使用教程相关的知识,希望能为你提供帮助。
本篇文章已授权微信公众号 guolin_blog ( 郭霖) 独家发布1.Logger 是什么 在我们日常的开发中, 肯定是少不了要和 Log 打交道, 回想一下我们是怎么使用 Log 的: 先定义一个静态常量 TAG, TAG 的值通常是当前类的类名, 然后在需要打印 Log 的地方, 调用
转载请注明出处: http://blog.csdn.net/like_program/article/details/52986553
Log.d(TAG, "
要打印的内容"
)
。每次新写一个类,
都要写一个 TAG,
这也就算了,
最苦逼的是,
项目一上线,
还要手动去把每个 Log 注释掉。。。当然, 有的同学可能要说, 这又没什么, 自己封装一个 Log 不就行了。但是对新手来说, 自己封装有一定的难度, 如果有现成的开源库可以直接拿来用就好了。
Github 上的大牛当然也注意到了这个情况, 于是开源日志库 Logger 诞生了。
Logger 的 Github 主页: https://github.com/orhanobut/logger
Logger 提供以下功能:
- 线程的信息
- 类的信息
- 方法的信息
- 将 JSON 文本人性化输出
- 将换行符人性化输出
- 简洁的输出
- 从日志跳转到源码
原生 Log 打印的日志:
文章图片
Logger 打印的日志:
文章图片
可以看到, Logger 打印的日志把多余的日志全部忽略了, 只显示对我们有用的日志, 而且还把日志框了起来, 可以让我们看得更舒服。不得不说, Logger 做的实在是太人性化了。
Logger 使用方法也不难, Logger 开源库的 Github 主页 写了很详细的使用方法, 英文还过得去的同学可以直接去 Logger 主页查看使用方法, 有英文恐惧症的同学呢, 可以通过这篇博客来学习下。
2.Logger 的使用 打开 android Studio, 新建 LoggerTest 项目。
1.导入依赖 在 LoggerTest / app/ build.gradle 中的 dependencies 中, 导入依赖, 代码如下:
dependencies {
compile '
com.orhanobut:logger:1.15'
}
然后 Android Studio 应该会弹出
Sync Now
,
也就是箭头 1 指向的位置,
如图:
文章图片
如果弹出了
Sync Now
,
就点击它,
如果没有弹出,
就点击箭头 2 指向的选项。等 Grade 构建完, 我们就可以使用 Logger了。
2.简单使用 Logger 的使用方法和原生 Log 差不多, 我们先来尝试下打印一个简单文本。
修改 MainActivity.java 中的 onCreate() 方法, 代码如下:
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.d("
执行了 onCreate"
);
}
咦, 怎么没写 TAG? 其实, Logger 是有它自己默认的 TAG 的, 默认的 TAG 是
PRETTYLOGGER
,
我们运行一下程序,
看一下输出日志:
文章图片
我们可以看到, 已经成功的将日志输出了, 而且比我们之前用的原生 Log 输出的美观多了, 日志信息一目了然。箭头指向的就是 Logger 默认的 TAG, 所以如果你想让 Logcat 只显示你自己打印的日志, 可以在日志过滤器中, 将默认 TAG 添加进去。
文章图片
文章图片
或者直接在过滤框中添加:
文章图片
3.打印更多类型数据 Logger 还支持打印 JSON, XML 等格式的数据。
1.JSON 类型数据
private String JSON_CONTENT =
"
{\\"
weatherinfo\\"
:{\\"
city\\"
:\\"
北京\\"
,\\"
cityid\\"
:\\"
101010100\\"
,"
+
"
\\"
temp\\"
:\\"
18\\"
,\\"
WD\\"
:\\"
东南风\\"
,\\"
WS\\"
:\\"
1级\\"
,\\"
SD\\"
:\\"
17%\\"
,\\"
WSE\\"
:\\"
1\\"
,"
+
"
\\"
time\\"
:\\"
17:05\\"
,\\"
isRadar\\"
:\\"
1\\"
,\\"
Radar\\"
:\\"
JC_RADAR_AZ9010_JB\\"
,"
+
"
\\"
njd\\"
:\\"
暂无实况\\"
,\\"
qy\\"
:\\"
1011\\"
,\\"
rain\\"
:\\"
0\\"
}}"
;
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.json(JSON_CONTENT);
}
文章图片
2.XML 类型数据
private String XML_CONTENT =
"
<
china dn=
\\"
nay\\"
>
<
city quName=
\\"
黑龙江\\"
pyName=
\\"
heilongjiang\\"
"
+
"
cityname=
\\"
哈尔滨\\"
state1=
\\"
1\\"
state2=
\\"
1\\"
stateDetailed=
\\"
多云\\"
/>
<
city quName=
\\"
吉林\\"
"
+
"
pyName=
\\"
jilin\\"
"
+
"
cityname=
\\"
长春\\"
state1=
\\"
0\\"
state2=
\\"
0\\"
stateDetailed=
\\"
晴\\"
/>
<
city quName=
\\"
辽宁\\"
"
+
"
pyName=
\\"
liaoning\\"
"
+
"
cityname=
\\"
沈阳\\"
state1=
\\"
1\\"
state2=
\\"
0\\"
stateDetailed=
\\"
多云转晴\\"
/>
<
city "
+
"
quName=
\\"
海南\\"
pyName=
\\"
hainan\\"
"
+
"
cityname=
\\"
海口\\"
state1=
\\"
22\\"
state2=
\\"
21\\"
stateDetailed=
\\"
中到大雨转小到中雨\\"
/>
<
/china>
"
;
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.xml(XML_CONTENT);
}
【Android 开源日志库 Logger 使用教程】
文章图片
3.List 类型数据
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// List 类型数据
List<
String>
list =
new ArrayList<
>
();
list.add("
hello"
);
list.add("
world"
);
Logger.d(list);
}
文章图片
4.Map 类型数据
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Map 类型数据
Map<
String, String>
map =
new HashMap<
>
();
map.put("
key_hello"
, "
hello"
);
map.put("
key_world"
, "
world"
);
Logger.d(map);
}
文章图片
5.Set 类型数据
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set 类型数据
Set<
String>
set =
new HashSet<
>
();
set.add(new String("
hello"
));
set.add(new String("
world"
));
Logger.d(set);
}
文章图片
4.字符串格式化
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.d("
hello %s %d"
, "
world"
, 5);
}
文章图片
5.自定义 TAG 如果你不满意默认的 TAG, 也可以自己定义一个 TAG, 只需要调用一次 Logger.init() 就行了。因为只需要调用一次, 所以可以在 Application 中来完成 Logger 的初始化。
新建 MyApplication 继承 Application, 代码如下:
public class MyApplication extends Application {private static String TAG =
"
LoggerTest"
;
@
Override
public void onCreate() {
super.onCreate();
Logger.init(TAG);
}
}
修改 AndroidManifest.xml 中 application 的属性, 添加
android:name=
"
.MyApplication"
,
AndroidManifest.xml 代码如下:
<
application
android:name=
"
.MyApplication"
android:allowBackup=
"
true"
android:icon=
"
@
mipmap/ic_launcher"
android:label=
"
@
string/app_name"
android:supportsRtl=
"
true"
android:theme=
"
@
style/AppTheme"
>
<
activity android:name=
"
.MainActivity"
>
<
intent-filter>
<
action android:name=
"
android.intent.action.MAIN"
/>
<
category android:name=
"
android.intent.category.LAUNCHER"
/>
<
/intent-filter>
<
/activity>
<
/application>
这样 App 启动时, 初始化的就是我们自定义的 MyApplication 了。然后我们在 MainActivity 的 onCreate() 中打印一下日志, 看下自定义的 TAG 生效了没。
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.d("
hello world"
);
}
文章图片
可以看到, 我们自定义的 TAG 已经生效了。那么有的同学可能会有疑问了, 我要是不想一直用这个 TAG 呢, 要是临时想换个 TAG 用呢, 当然也是有办法的, 调用
Logger.t("
临时TAG名"
).d()
,
就能使用临时的 TAG 打印日志了。@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.t("
MyTag"
).d("
hello world"
);
}
文章图片
可以看到, 临时的 TAG 名被追加到自定义 TAG 的后面了。
6.设置不打印日志 之前说了, 日志只是开发的时候需要用到, 等到项目上线就不能用了。Logger 当然也考虑到了这一点, 通过设置
Logger.init(TAG).logLevel(LogLevel.NONE)
可以设置为不打印日志。logLevel() 方法默认的参数是 LogLevel.FULL
,
也就是打印全部日志。修改 MyApplication 的 onCreate() 方法:
@
Override
public void onCreate() {
super.onCreate();
Logger.init(TAG).logLevel(LogLevel.NONE);
}
运行一下, 可以发现 Logger 没有打印日志。
7.打印 Exception Logger 打印 Exception, 可以很清晰的看到 Exception 信息, 这里我们写一个数组越界异常:
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] a =
new int[3];
try {
a[4] =
3;
} catch (Exception e) {
Logger.e(e, "
message"
);
}
}
文章图片
8.更多个性化设置 Logger 还有一些个性化设置, 比如
Logger.init(TAG)
.methodCount(3) // 方法栈打印的个数,
默认是 2
.hideThreadInfo() // // 隐藏线程信息,
默认显示
.methodOffset(2) // 设置调用堆栈的函数偏移值,
默认是 0
.logAdapter(new AndroidLogAdapter());
// 自定义一个打印适配器
有兴趣的同学可以去 Logger 的 Github 主页 查看Logger 的更多用法。
源码下载
推荐阅读
- Android 6.0的运行时权限
- Android知识点剖析系列(深入了解layout_weight属性)
- Android发展历程
- 图解 Android 事件分发机制
- Android中Animation 详细解读
- 关于安卓的回调方法
- Supporting Multiple Screens(支持Android各种屏幕尺寸)
- Android-找到包下面所有的类
- Android--再探MVP模式