日志能力

使用日志能力相关接口来满足在不同场景下操作应用内日志的需求,如写入日志、导出日志等。

写入日志

调用logDebug等方法写入日志,在应用导出的日志中会包含写入的日志。

接口定义

iOS:

code-group

Swift
/// 日志服务接口
@objc public protocol KIMLogServicePublicInterface {
    /// 写入Debug级别的日志
    /// - Parameter message: Debug日志内容
    @objc func logDebug(message: String)
    
    /// 写入Info级别的日志
    /// - Parameter message: Info日志内容
    @objc func logInfo(message: String)
    
    /// 写入Warning级别的日志
    /// - Parameter message: Warning日志内容
    @objc func logWarning(message: String)

    /// 写入Error级别的日志
    /// - Parameter message: Error日志内容
    @objc func logError(message: String)
}

Android:

code-group

Kotlin
// 日志服务接口
interface KIMILogService : KIMISdkLinkupService {
    /**
     *   只在控制台打印Log,不会持久化到日志文件中
     *   日志类型:Debug
     *   @param tag 用于标识日志来源的标签,通常为类名或模块名。
     *   @param msg 需要打印的日志消息。
     */
    fun logDebug(tag: String, msg: String)

    /**
     *   控制台打印Log,且会持久化到日志文件中
     *   日志类型:Info
     *   @param tag 用于标识日志来源的标签,通常为类名或模块名。
     *   @param msg 需要打印的日志消息。
     */
    fun logInfo(tag: String, msg: String)

    /**
     *   控制台打印Log,且会持久化到日志文件中
     *   日志类型:Warning
     *   @param tag 用于标识日志来源的标签,通常为类名或模块名。
     *   @param msg 需要打印的日志消息。
     */
    fun logWarning(tag: String, msg: String)

    /**
     *   控制台打印Log,且会持久化到日志文件中
     *   日志类型:Error
     *   @param tag 用于标识日志来源的标签,通常为类名或模块名。
     *   @param msg 需要打印的日志消息。
     */
    fun logError(tag: String, msg: String)
}

代码示例

iOS:

code-group

Swift
/// 写入Debug日志
KIMInject.call(KIMLogServicePublicInterface.self)?.logDebug(message: "KIMExtensionProject|KIMExtensionAppDelegate|Debug")
/// 写入Info日志
KIMInject.call(KIMLogServicePublicInterface.self)?.logInfo(message: "KIMExtensionProject|KIMExtensionAppDelegate|Info")
/// 写入Warning日志
KIMInject.call(KIMLogServicePublicInterface.self)?.logWarning(message: "KIMExtensionProject|KIMExtensionAppDelegate|Warning")
/// 写入Error日志
KIMInject.call(KIMLogServicePublicInterface.self)?.logError(message: "KIMExtensionProject|KIMExtensionAppDelegate|Error")

Android:

code-group

Kotlin
val service = KIM.getService().getLinkUpService(KIMILogService::class.java)
// 写入Debug日志
service?.logDebug(tag, "testDebug")
// 写入Info日志
service?.logInfo(tag, "testInfo")
// 写入Warning日志
service?.logWarning(tag, "testWarning")
// 写入Error日志 
service?.logError(tag, "testError")

导出日志

应用内部提供导出日志入口,如需要在额外的入口导出日志可调用exportLogZips方法将应用内的日志文件压缩成zip格式,并导出至指定路径。日志成功导出后,开发者可以通过导出的日志路径来查看或分享日志文件。

接口定义

iOS:

code-group

Swift
/// 日志服务接口
@objc public protocol KIMLogServicePublicInterface {
    
    /// 导出日志到指定路径。
    /// - Parameters:
    ///   - startDate: 导出日志的起始日期。
    ///   - endDate: 导出日志的结束日期。
    ///   - path: 日志存放路径, 如果目录未创建, 则会自动创建。
    ///   - completion: 日志导出结果回调。
    ///    - paths: 导出成功后的一个或多个日志路径数组,导出失败时为空。
    ///
    /// 调用该方法导出日志到指定路径下,可以通过导出的日志路径来查看或分享日志文件。导出时可以指定起始和结束日期进行日志过滤,如果不指定,则导出全部日志。
    @objc func exportLogZips(startDate: Date?,
                             endDate: Date?,
                             path: String,
                             completion: ((_ paths: [String]) -> Void)?)
}

Android:

code-group

Kotlin
// 日志服务接口
interface KIMILogService : KIMISdkLinkupService {
    /** 
     *   导出日志文件压缩包
     *   @param filterTimestampStart - 过滤的时间节点(时间戳)开始时间,0表示不过滤。
     *   @param filterTimestampEnd - 过滤的时间节点(时间戳)结束时间,0表示不过滤。
     *   @param zipExtName - 压缩成Zip时额外添加的后缀文件名,比如DeviceID,命名规则为Android-时间戳-zipExtName.zip
     *   @param splitSize - 压缩成Zip时,进行拆分的文件最大大小,默认0,表示不拆分
     *   @param callback 导出结果回调,返回的日志zip文件列表
     */
    fun exportLog2Zips(
        filterTimestampStart: Long? = 0,
        filterTimestampEnd: Long? = 0,
        zipExtName: String? = "",
        splitSizeMB: Int = 0,
        callback: (List<File>?) -> Unit
    )
}

代码示例

iOS:

code-group

Swift
/// 导出日志到指定路径,可以指定起始和结束日期进行日志过滤
/// 此处如果实现了attachLogFilePaths方法,将会把返回路径下的额外日志文件复制到日志包中一同导出。
KIMInject.call(KIMLogServicePublicInterface.self)?.exportLogZips(startDate: nil, endDate: nil, path: tempPath) { paths in
    /// 通过导出的日志路径来查看或分享日志文件。
}

Android:

code-group

Kotlin
val service = KIM.getService().getLinkUpService(KIMILogService::class.java)
// 导出日志到指定路径,可以指定起始和结束日期进行日志过滤
// 此处如果实现了attachLogFilePaths方法,将会把返回路径下的额外日志文件复制到日志包中一同导出。
service?.exportLog2Zips(filterTimestampStart,
                        filterTimestampEnd,
                        zipExtName,
                        splitSizeMB,
                        callback)

附加额外日志

实现attachLogFilePaths接口返回需要额外附加的日志路径。应用在导出日志时,会调用该方法把需要额外添加的日志文件复制到导出日志zip包中。

接口定义

iOS:

code-group

Swift
/// 日志拓展能力
@objc public protocol KIMLogServiceCapability {
    /// 返回第三方附加日志文件路径。
    /// - Parameter paths: 第三方日志文件路径数组,如果为空则不附加任何日志。
    ///
    /// 实现该方法返回需要额外附加的日志路径。应用在导出日志时,会调用该方法把需要额外添加的日志文件复制到导出日志zip包中。
    @objc func attachLogFilePaths() -> [String]?
}

Android:

code-group

Kotlin
/**
 *  KIMExpMultipleLog 是一个拓展服务类,用于处理来自第三方附加日志文件路径。
 *  一个扩展服务的多个扩展实现均生效,外部实现这个扩展点类,并注册即可。
 */
abstract class KIMExpMultipleLog : KIMExpMultiple {
    /**
     *   attachLogFilePaths 用于获取第三方的日志文件路径
     *   实现该方法返回需要额外附加的日志路径。应用在导出日志时,会调用该方法把需要额外添加的日志文件复制到导出日志zip包中。
     */
    open fun attachLogFilePaths(): List<String>? {
        return emptyList()
    }
}

代码示例

  1. 实现日志拓展协议。

iOS:

code-group

Swift
class CustomLogService: KIMLogServiceCapability {

    func attachLogFilePaths() -> [String]? {
        // 返回需要额外附加的日志路径
        let extraLogPaths = ["\(NSHomeDirectory())"]
        return extraLogPaths
    }
}

Android:

code-group

Kotlin
class KIMExpMultipleLogImpl : KIMExpMultipleLog() {
    override fun attachLogFilePaths() :List<String>?{
        // 返回需要额外附加的日志路径
        return extraLogPaths
    }
}

2、注册协议实现对象。

iOS:

code-group

Swift
class KIMExtensionAppDelegate: KIMLifecycleProtocol {
    let customLogService = CustomLogService()
    required init() { }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) {
        KIMInject.register(customLogService, KIMLogServiceCapability.self)
    }
}

Android:

code-group

Kotlin
class XxxApplication : KIMSdkApplication() {
    override fun confMeatsOnBone(): KConf<Meat> {
        return kConfOf(
            KIMExpMultipleLog::class.java confTo KIMExpMultipleLogImpl::class.java,
            )
    }
}