适用场景
LeanCloud 是通过 REST API 来进行前后端分离的,当出现问题的时候,最好是先检查日志里的网络请求,如果有必要的话再和 REST API 文档进行比对,以此来判断是客户端发出的请求不对,还是服务端处理请求不对。
提交工单反馈问题时,客服通常会索要复现的日志来帮助排查问题。本文介绍如何查看日志并通过日志来初步排查问题。
Android SDK 调试指南
开启调试日志
// 在 LeanCloud.initialize() 之前调用
LeanCloud.setLogLevel(LCLogger.Level.DEBUG);
// v8.0.0 以下版本开启调试日志方式:
AVOSCloud.setLogLevel(AVLogger.Level.DEBUG);
//旧版 SDK (v5.0.0 以下版本)开启调试日志方式:
AVOSCloud.setDebugLogEnabled(true);
运行并查看日志
我们以数据存储服务为例,执行下面的代码来查询用户列表:
AVQuery<AVUser> userQuery = AVUser.getQuery();
userQuery.findInBackground().subscribe(new Observer<List<AVUser>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<AVUser> avUsers) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
Androd Studio 运行后查看 Logcat,找到 LeanCloud 请求打印的类似 curl 的日志如图:
成功请求到 LeanCloud ,服务器会返回类似格式的日志:
2019-10-30 16:11:56.124 32748-345/com.example.myapplicationtest D/LoggingInterceptor: Request: curl -X GET
-H Accept: application/json
-H Content-Type: application/json
-H User-Agent: LeanCloud SDK v6.0.3
-H X-LC-Id: JMBPc7y4SUPRDrOSHXjXVMN7-gzGzoHsz
-H X-LC-Prod: 1
-H X-LC-Session: {your_session}
-H X-LC-Key: {your_app_key}
https://jmbpc7y4.lc-cn-n1-shared.com/1.1/users
分析日志查看错误码含义
如图所示,查看 Request 与 Response 可知,已经成功发送一条 GET 请求,服务端返回错误码 403。
对于所有的请求,响应格式都是一个 JSON 对象:
{
"code": 403,
"error": "Forbidden to find by class '_User' permissions."
}
在 LeanCloud 错误码详解中可以查到错误码 403 的含义。结合服务端返回的错误信息,定位问题原因是未开启用户表 find 权限。
特别说明: 这个示例问题在 用户 - 查询 文档中有详细说明。是因为 LeanCloud 为了安全起见,新创建的应用的 _User 表默认关闭了 find 权限,这样每位用户登录后只能查询到自己在 _User 表中的数据,无法查询其他用户的数据。
同样也可以根据 onError 方法返回的 Throwable 内容查看错误码与错误信息。
获取错误信息:throwable.getMessage();
获取错误码:avException.getCode();
完整代码如下:
//创建用户实例
AVUser user = new AVUser();
user.setUsername("Tom");
user.setPassword("cat!@#123");
user.setEmail("tom@leancloud.rocks");
user.setMobilePhoneNumber("+8618200008888");
//注册新用户
user.signUpInBackground().subscribe(new Observer<AVUser>() {
public void onSubscribe(Disposable disposable) {}
public void onNext(AVUser user) {
System.out.println("注册成功。objectId:" + user.getObjectId());
}
public void onError(Throwable throwable) {
// 注册失败
AVException avException = new AVException(throwable);
int code = avException.getCode();
if (code == 202){
//用户名已经被占用
System.out.println("发生错误:" + throwable.getMessage());
} else if(code == 203){
//邮箱已经被占用
System.out.println("发生错误:" + throwable.getMessage());
}else{
//...
}
}
public void onComplete() {}
});
遇到复杂情况可以结合日志分析请求, 或者对比 REST API 接口文档查看请求体与返回值是否正确。