錯誤日誌功能(移動端)

121 阅读2分钟

背景:

收集客戶端的報錯信息,進行妥善處理,以提高用戶體驗

主要分兩個層面:

1、應用出錯,而且不能再繼續工作了,導致崩潰的結果。此時,需要進行崩潰日誌的收集,這種場景主要交給第三方平臺工具進行,崩潰信息的收集,比如Bugly、友盟等,這種不在此次

2、應用出錯,但還死不了,還可以堅持工作。主要為業務邏輯層面的報錯,比如,接口報錯等。主要由自主的收集工具來收集,這樣就有較高的主動權,可以自由定制。

主體代碼如下

/**
 * 錯誤日誌上傳工具類
 */
public class LogUtil {
    public static void uploadAppLog(String apiPath, String params, String response, String exceptionMessage) {
        uploadAppLog(apiPath, params, response, -1, exceptionMessage);
    }

    public static void uploadAppLog(String apiPath, String params, String response, int exceptionCode, String exceptionMessage) {
        if (!StringUtil.isUrlString(apiPath)) { // 如果不是全路径URL地址,全补全
            apiPath = API_BASE_URL + apiPath;
        }

        EasyJSONObject request = EasyJSONObject.generate(
                "c", "AppLog",
                "a", "upload",
                "device_manufacturer", Build.MANUFACTURER,  // 設備製造廠商
                "device_brand", Build.BRAND,  // 設備品牌
                "device_model", Build.MODEL,  // 設備型號
                "device_os_version", Build.VERSION.RELEASE,  // 設備操作系統版本
                "app_version", BuildConfig.VERSION_NAME,  // APP版本號
                "app_build", BuildConfig.VERSION_CODE,  // APP構建號
                "api_path", apiPath, // Api請求路徑
                "params", params, // 請求參數
                "response", response, // 服務器應答的內容,如JSON字符串
                "exception_code", exceptionCode, // 異常代碼
                "exception_message", exceptionMessage // 異常消息
        );
        SLog.info("request[%s]", request);
        Api.postIO("http://108.61.246.21/twant_log_tracker/", request, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                SLog.info("Error!uploadAppLog failed, message[%s]", e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
    }
}

如何使用

String url = Api.PATH_ARRIVAL_NOTICE;
EasyJSONObject params = EasyJSONObject.generate(
        "token", token,
        "commonId", commonId,
        "goodsId", goodsId,
        "mobile", fullMobile);

Api.postUI(url, params, new UICallback() {
    @Override
    public void onFailure(Call call, IOException e) {
        LogUtil.uploadAppLog(url, params.toString(), "", e.getMessage());
        ToastUtil.showNetworkError(_mActivity, e);
    }

    @Override
    public void onResponse(Call call, String responseStr) throws IOException {
        try {
            SLog.info("responseStr[%s]", responseStr);

            EasyJSONObject responseObj = EasyJSONObject.parse(responseStr);
            if (ToastUtil.checkError(_mActivity, responseObj)) {
                LogUtil.uploadAppLog(url, params.toString(), responseStr, "");
                return;
            }

            ToastUtil.success(_mActivity, "設置成功");
            hideSoftInputPop();
        } catch (Exception e) {
            SLog.info("Error!message[%s], trace[%s]", e.getMessage(), Log.getStackTraceString(e));
        }
    }
});

HAVE A TRY

curl -d "c=AppLog&a=upload&device_manufacturer=Nokia&device_brand=Nokia&device_model=SM-N9500&device_os_version=Android13&app_version=1.3.0.00&app_build=262&api_path=https://f2.twant.com/api/app/goods/59727&params=test_params&response=test_response&exception_code=404&exception_message=NotFound" -X POST http://108.61.246.21/twant_log_tracker/
| app_log | CREATE TABLE `app_log` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `client_ip` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端IP',
  `create_time` int(10) unsigned NOT NULL COMMENT '创建时间',
  `create_time_str` char(19) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '字符串格式的创建时间,格式:2020-08-10 12:34:56',
  `device_manufacturer` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '设备制造商',
  `device_brand` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '设备品牌',
  `device_model` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '设备型号',
  `device_os_version` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '设备操作系统版本',
  `app_version` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'App版本号',
  `app_build` int(10) unsigned NOT NULL COMMENT 'App Build号',
  `api_path` varchar(160) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'API请求路径',
  `params` varchar(4000) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求参数',
  `response` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '服务器应答',
  `exception_code` int(11) NOT NULL COMMENT '异常错误码:0 -- 表示没有异常',
  `exception_message` varchar(4000) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '异常错误消息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13102 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='想要城App日志上报表' |