# 错误分析接入指南

# 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&lt;&gt;(20);

   /**
    * 日志内容主体
    * 调用build方法的时候,会将该集合里的内容使用日志分割符拼装到一起
    */
   private List<string> sectionList = new ArrayList&lt;&gt;(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);