背景:
收集客戶端的報錯信息,進行妥善處理,以提高用戶體驗
主要分兩個層面:
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¶ms=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日志上报表' |