# 错误分析接入指南
# 1、前言
需要参照文档接入CrashSDK: https://yueying-docs.effirst.com/android-join.html
# 2、自定义日志使用说明
1> 第一步: 如图,点击 "管理工具" -> "监控项管理" -> "添加监控项" 进行日志类型定义
- 监控名称: 日志名称, "错误分析" 页面中日志类型的实际显示名称
- 日志类型: 代码中进行日志对象初始化时需要传的参数,用于区分日志的类型
2> 第二步: 拷贝类 <code>CustomLogInfoBuilder</code> 到您的代码中,该类中的方法参见注释:
import android.text.TextUtils;
import android.util.Log;
import com.uc.crashsdk.export.CustomLogInfo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomLogInfoBuilder {
/**
* 自定义日志类型,统称exception
*/
private static final String LOG_TYPE = "exception";
/**
* 日志一级分类,值统一为exception
*/
private static final String LOG_KEY_CT = "k_ct";
/**
* 日志二级分类,业务自行决定
*/
private static final String LOG_KEY_AC = "k_ac";
/**
* 可选,不推荐业务设置,如果需要可以考虑跟平台同学确认
* 平台列表展现的title
* 如果业务没有设置,有堆栈的情况下,会使用第一个出现的业务栈点为标题,否则直接使用日志二级分类作为标识
*/
private static final String LOG_KEY_STACK_FUNC = "stackFunc";
/**
* 可选,不推荐业务设置,如果需要可以考虑跟平台同学确认
* 自定日志的问题唯一标识,
* 平台会使用它来走位问题类型标识,必将stackHash一致的日志聚合到一起
*/
private static final String LOG_KEY_STACK_HASH = "stackHash";
/**
* 日志块分隔符
*/
private static final String LOG_SECTION_SEP = "--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---";
/**
* 换行符
*/
private static final String LINE_SEP = "\n";
/**
* 自定义日志信息块
*/
private Map<string, string=""> kvInfoMap = new HashMap<>(20);
/**
* 日志内容主体
* 调用build方法的时候,会将该集合里的内容使用日志分割符拼装到一起
*/
private List<string> sectionList = new ArrayList<>(5);
/**
* 日志内容主体 - 堆栈
*/
private String stack;
/**
* CRASH SDK 的自定义日志对象
*/
private CustomLogInfo mCustomLogInfo;
/**
* 初始化
* @param subLogType 自定义日志类型
*/
public CustomLogInfoBuilder(String subLogType) {
mCustomLogInfo = new CustomLogInfo(new StringBuffer(), LOG_TYPE);
kvInfoMap.put(LOG_KEY_CT, LOG_TYPE);
kvInfoMap.put(LOG_KEY_AC, subLogType);
}
/**
* 可选,添加键值对信息
*/
public CustomLogInfoBuilder put(String key, String value) {
if (LOG_KEY_AC.equals(key) || LOG_KEY_CT.equals(key)) {
Log.w("crashsdk", "key can not be 'k_ac' and 'k_ct'");
return this;
}
kvInfoMap.put(key, value);
return this;
}
/**
* 可选,不推荐业务设置,如果需要可以考虑跟平台同学确认
* 平台列表展现的title
* 如果业务没有设置,有堆栈的情况下,会使用第一个出现的业务栈点为标题,否则直接使用日志二级分类作为标识
*/
public CustomLogInfoBuilder stackFunc(String stackFunc) {
kvInfoMap.put(LOG_KEY_STACK_FUNC, stackFunc);
return this;
}
/**
* 可选,不推荐业务设置,如果需要可以考虑跟平台同学确认
* 自定日志的问题唯一标识,
* 平台会使用它来走位问题类型标识,必将stackHash一致的日志聚合到一起
*/
public CustomLogInfoBuilder stackHash(String stackHash) {
kvInfoMap.put(LOG_KEY_STACK_HASH, stackHash);
return this;
}
/**
* 可选,添加异常堆栈块
*/
public CustomLogInfoBuilder stack(Throwable t) {
return stack(Log.getStackTraceString(t));
}
/**
* 可选,添加异常堆栈块
*/
public CustomLogInfoBuilder stack(String stackStr) {
stack = "Exception message:" + LINE_SEP +
"Back traces starts." + LINE_SEP +
stackStr +
"Back traces ends.";
return this;
}
/**
* 可选,添加日志主体内容块
*/
public CustomLogInfoBuilder addSection(String section) {
sectionList.add(section);
return this;
}
/**
* 可选,自定义日志落盘后立即上传,默认为false
*/
public CustomLogInfoBuilder uploadNow(boolean uploadNow) {
mCustomLogInfo.mUploadNow = uploadNow;
return this;
}
/**
* 可选,给日志添加logcat日志块,默认为false
*/
public CustomLogInfoBuilder addLogCat(boolean addLogcat) {
mCustomLogInfo.mAddLogcat = addLogcat;
return this;
}
/**
* 构建自定义日志对象
* @return CRASH SDK 自定义日志对象
*/
public CustomLogInfo build() {
StringBuffer sb = new StringBuffer();
for (Map.Entry<string, string=""> entry : kvInfoMap.entrySet()) {
sb.append(entry.getKey()).append(":").append(entry.getValue()).append(LINE_SEP);
}
if (!TextUtils.isEmpty(stack)) {
sb.append(LOG_SECTION_SEP).append(LINE_SEP);
sb.append(stack).append(LINE_SEP);
}
for (String sectionText : sectionList) {
sb.append(LOG_SECTION_SEP).append(LINE_SEP);
sb.append(sectionText).append(LINE_SEP);
}
mCustomLogInfo.mData = sb;
return mCustomLogInfo;
}
}
</string,></string,>
2> 第三步: 使用上述类 <code>CustomLogInfoBuilder</code> 生成 <code>CustomLogInfo</code> 并调用 <code>CrashApi.generateCustomLog()</code> 生成自定义日志,示例:
// 添加自定义块
CustomLogInfo customLogInfo = new CustomLogInfoBuilder("在平台中填写的日志类型")
.stack(e)
.build();
CrashApi.generateCustomLog(customLogInfo);