适用场景

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 的日志如图:

34
成功请求到 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

分析日志查看错误码含义

21
如图所示,查看 Request 与 Response 可知,已经成功发送一条 GET 请求,服务端返回错误码 403。

对于所有的请求,响应格式都是一个 JSON 对象:

{
    "code": 403,
    "error": "Forbidden to find by class '_User' permissions."
}

LeanCloud 错误码详解19中可以查到错误码 403 的含义。结合服务端返回的错误信息,定位问题原因是未开启用户表 find 权限。

特别说明: 这个示例问题在 用户 - 查询5 文档中有详细说明。是因为 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 15 接口文档查看请求体与返回值是否正确。

1 人赞了这个帖子.