package com.tencent.wework; //import java.lang.management.ManagementFactory; //import java.lang.management.RuntimeMXBean; /** * @warning: 1. 不要修改成员变量名,native方法内有反射调用 * 2. 调用本地方法需保持包结构,本工具需放在包com.tencent.wework内 * 3. 不允许继承,类名和函数名均不可修改,会影响本地方法的引用,详见:javah生成本地方法头文件 * 4. 使用其他工具打印的日志将无法被查询,如需使用SLF4j风格的日志或性能更好的日志框架, * 请自行封装SpecUtil.SpecLog或SpecUtil.SpecLogNative方法 * * @usage: 1. 获取SDK的版本号 * 2. 打印三个级别的日志 * 3. 开启调试模式 */ public final class SpecUtil { /** * @description SDK版本号 * @usage 可用于校对不同SDK版本,或后续针对不同的SDK版本添加业务逻辑 */ private static final String SDK_VERSION = "1.4.0"; public static String GetSDKVersion() { return SDK_VERSION; } /** * @description 正确的包名,SDK必须存放在"com.tencent.wework"下,否则会影响本地方法的调用 */ private static final String EXPECTED_PACKAGE_NAME = "com.tencent.wework"; public static String GetExpectedPackageName() { return EXPECTED_PACKAGE_NAME; } private static final String LINE_SEPERATOR = System.getProperty("line.separator"); public static void WWSpecLogInfo(String... args) { SpecLog('I', args); } public static void WWSpecLogError(String... args) { SpecLog('E', args); } public static void WWSpecLogDebug(String... args) { SpecLog('D', args); } public static void WWSpecLogInfoWithReqId(String reqId, String... args) { SpecLogWithReqId(reqId, 'I', args); } public static void WWSpecLogErrorWithReqId(String reqId, String... args) { SpecLogWithReqId(reqId, 'E', args); } public static void WWSpecLogDebugWithReqId(String reqId, String... args) { SpecLogWithReqId(reqId, 'D', args); } /** * @usage 打印标准日志 * @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看 * @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG * @param args 自定义参数 */ public static void SpecLog(char logLevel, String... args) { StackTraceElement element = Thread.currentThread().getStackTrace()[3]; SpecLogNative( logLevel, element.getFileName(), element.getLineNumber(), String.join(",", args).replace(LINE_SEPERATOR, " ") ); } /** * @usage 打印标准日志 * @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看 * @param reqid 请求id * @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG * @param args 自定义参数 */ public static void SpecLogWithReqId(String reqId, char logLevel, String... args) { StackTraceElement element = Thread.currentThread().getStackTrace()[3]; SpecLogNativeWithReqId( reqId, logLevel, element.getFileName(), element.getLineNumber(), String.join(",", args).replace(LINE_SEPERATOR, " ") ); } /** * @usage 打印标准日志 * @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看 * 如需SLF4J风格的接口或对日志性能有进一步需求,开发者可以自行封装该函数 * @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG * @param fileName 文件名(类名) * @param lineNumber 行号 * @param argsString 自定义参数 */ public static native void SpecLogNative(char logLevel, String fileName, int lineNumber, String argsString); /** * @usage 打印标准日志 * @note 只有使用SpecLog和SpecLogNative函数打印的日志能被调试平台查询,其他框架的日志仅能本地查看 * 如需SLF4J风格的接口或对日志性能有进一步需求,开发者可以自行封装该函数 * @param reqid 请求id * @param logLevel 日志级别,使用char传递,目前支持I——INFO、E——ERROR、D——DEBUG * @param fileName 文件名(类名) * @param lineNumber 行号 * @param argsString 自定义参数 */ public static native void SpecLogNativeWithReqId(String reqId, char logLevel, String fileName, int lineNumber, String argsString); /** * @usage 开启调试模式,进程级别开关 * @param debugToken 调试凭证,在管理端获取 * @param accessToken 应用access token * @return 是否开启成功 */ public static boolean SpecOpenDebugMode(String debugToken, String accessToken) { return SpecOpenDebugModeNative(debugToken, accessToken); } private static native boolean SpecOpenDebugModeNative(String debugToken, String accessToken); /** * @usage 生成notify id。用户可调用本接口生成notify id,也可完全自定义生成 * @return 新的notify id,支持纳秒级隔离,内部异常时会输出日志并返回空串 * @note 1. 用户可先生成notify id,将其与回调数据关联存储后,再使用该notify id通知应用, * 从而保证回调数据被请求时已存储完毕 */ public static String GenerateNotifyId() { return GenerateNotifyIdNative(); } private static native String GenerateNotifyIdNative(); static { // 检查包名 String packageName = SpecUtil.class.getPackage().getName(); if (!EXPECTED_PACKAGE_NAME.equals(packageName)) { // 静态代码块内还无法调用native日志函数,这里的日志在管理系统无法查询 System.out.println("SpecUtil class must be in package com.tencent.wework"); System.exit(1); } // 加载so库 try { System.loadLibrary("WeWorkSpecSDK"); } catch (UnsatisfiedLinkError e) { System.out.println("libWeWorkSpecSDK.so not found in java.library.path"); e.printStackTrace(); System.exit(1); } catch (Exception e) { System.out.println("unexpected exception: " + e.getMessage()); e.printStackTrace(); System.exit(1); } SpecUtil.WWSpecLogInfo("SDK init done", "packageName=" + packageName, "SDK_VERSION=" + SDK_VERSION); } }