Latest 0.1.0
Homepage https://github.com/YanChen-ing/YCILog
License MIT
Platforms ios 8.0
Authors

Version
License
Platform

日志收集

特性

  • [x] 无埋点,可动态配置的日志收集组件。通过对少数控件基类重要交互事件的监听,筛选出需要收集的日志,并记录。

  • [x] 支持分级调试日志,易统一各组件调试日志记录输出。

  • [x] 支持崩溃日志收集。

  • [x] 支持目标地灵活扩展。

演示

YCILog

设计

基本原理

通过 Objective-C 的 Runtime(运行时)特性,将日志收集方法插入有限的几个基类事件处理方法前。日志收集方法中通过控件的视图结构,生成唯一ID,以此比对配置表,收集指定日志需求。当事件触发时,在基类事件处理方法前,通过ID比对,收集指定数据,可收集控件状态,页面属性等。

架构图

YCILog

Core – 核心模块。负责外部调用,日志分发到目标地。

Destinations – 常用的目标地。负责针对性的对数据格式化及发送。

AutoTrack – 自动追踪。用以支持无埋点日志追踪。

CrashReporter – 崩溃收集。

安装

pod "YCILog"

使用

YCILog

准备

根据需要,继承 BaseDestnation,定义指定的目标地,当前YCILog/Destinations 已可选目标地 控制台,移动开发平台。

Swift

1.引用

 import YCILog

2.声明一个全局变量(组件)或全局常量(主应用),用于控制模块(组件)内日志是否输出

// 全局常量, 控制日志输出
let logger: YCILog.Type = YCILog.self
// 组件接口类声明该变量:
public var logger: YCILog.Type?

3.添加日志输出目标地(继承自BaseDestination)

         let c = YCIMobile.config

        //========= 设置 日志流 目的地 =========

        // 1. 移动平台
        let YCIMobile = YCIMobileDestination(appID:c.appKey, appSecret: c.appSecret, encryptionKey: "")

        YCIMobile.sendingPoints.track = 50

        let baseServer = URL(string: c.httpsServer)

        YCIMobile.serverURL = URL(string: "/sdk/analysis/log.do", relativeTo: baseServer)

        YCIMobile.getUserInfoClosure = {
            return ["userName":SGBUserInfoPersister.userInfo()?.username ?? ""]
        }

        YCILog.addDestination(YCIMobile)

4.启动其他功能

        //========= 启动 更多功能 =========

        // 启动 自动追踪
        AutoTracker.start(options: [.PV])

        // 启动 崩溃日志收集
        CrashReporter.shared.start()

5.使用处

       // 根据重要程度,使用分级日志方法
       logger?.track("btn1Clicked")

       logger?.debug("abc.....")

       logger?.error("test...")

Objective – C

1.新建 SGBLog.swift类对 YCILog 初始化配置。(参考swift用法)

2.引入日志宏模板 SGBLogMacro.h ,方便在OC类中,植入默认收集埋点类名,方法名,行号等调试用信息。

3.使用时,使用 SGBLogMacro.h 定义的宏方法。如:

    loog_Info(@"重定向 执行完成");

    NSDictionary *logInfo [email protected]{loogKeyEvent:loogEventKeyStartRedirectPage,
                             loogContentKeyGroupId: @"SGBMessageViewController",
                             loogContentKeyDesc:@"消息标签页"};
    loog_Track(logInfo)

Destinations – 目标地

通过继承 BaseDestination ,接受日志流数据,并针对性的处理数据,输出到对应目标地。

YCILog

开始

// 实例化目标地,并进行配置
let YCIMobile = .....
....

// 添加目标地
YCILog.addDestination(YCIMobile)

已支持目标地:

ConsoleDestination – 控制台

  • 分级日志
  • 格式日志,支持颜色,emoji❤️💙

YCILog

属性 说明 默认值
useNSLog 使用NSLog 代替print false
useTerminalColors 使用终端中颜色 替代 Xcode 控制台❤️💙 false

示例:

        // 1. 控制台
        let console = ConsoleDestination()
        YCILog.addDestination(console)

AutoTrack – 自动追踪

通过 Objective-C 的 Runtime(运行时)特性,将日志收集方法插入有限的几个基类事件处理方法前。日志收集方法中通过控件的视图结构,生成唯一ID,以此比对配置表,收集指定日志需求。当事件触发时,在基类事件处理方法前,通过ID比对,收集指定数据,可收集控件状态,页面属性等。

YCILog

开始

// 启动 自动追踪
AutoTracker.start(options: [.PV])

日志需求配置

在应用中,添加 YCITrackNeeds.json 文件,用于设置日志配置信息。

示例:

{
    "Per6VfuG":{  
        "const": {
            "testABC":"oo^~^oo"
        },"kvc": {
            "currentTitle":"currentTitle"
        }
    }

}

eventId (事件id,调试时可通过控制台获取)

const (常量. 作为标签等)

KEY:VALUE

kvc ( KVC 方式收集self属性值,keyPath 表示属性路径)

KEY:KeyPath

支持

AutoTracker

start 启动 默认启动全部

必 AppDelegateTracker
可选 UIViewController+Track
可选 UIControl+Track

AppDelegateTracker

  • 应用生命周期信息收集
    进入前台 即记录 app_start, activeCount(激活次数,=1 表示首次启动)
    进入后台 即记录 app_end, runtime(一个周期运行时长 ms)

UIViewController+Track

  • 视图控制器生命周期信息收集
    viewDidAppear 即记录 YCI_page_begin
    viewDidDisappear 即记录 YCI_page_end

UIControl+Track

  • 监听 UIButton 点击事件
    通过混淆UIControl.endTracking方法,监听到 UIButton 的 touchUpInside相关事件,比对YCITrackNeeds.json 收集指定需求

扩展

参考已有收集方式,分析需要收集事件,选择合适基类方法,进行swizzle。

CrashReporter – 崩溃收集

使用第三方开源组件 PLCrashReporter 进行日志收集。在应用启动时,检查上次是否有崩溃日志,有则通过 YCILog.error(dic) 记录,并销毁 PLCrashReporter 内的缓存。

YCILog

开始

// 启动 崩溃日志收集
CrashReporter.shared.start()

Latest podspec

{
    "name": "YCILog",
    "version": "0.1.0",
    "summary": "u65e5u5fd7u6536u96c6u4e0au62a5u3002u652fu6301u76eeu6807u5730u6269u5c55uff0cu5d29u6e83u6536u96c6uff0cu65e0u57cbu70b9u8ffdu8e2a",
    "description": "u65e5u5fd7u7ec4u4ef6n1.u652fu6301u5206u7ea7u8c03u8bd5u65e5u5fd7n2.u652fu6301u5168u57cbu70b9u5f0fu64cdu4f5cuff0cu4e1au52a1u65e5u5fd7u6536u96c6n3.u652fu6301u79fbu52a8u5e73u53f0u76eeu7684u5730uff0cu5e76u53efu6269u5c55u6536u96c6u5230u76eeu7684u5730n4.u5d29u6e83u65e5u5fd7u6536u96c6",
    "homepage": "https://github.com/YanChen-ing/YCILog",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": {
        "YanChen-ing": "[email protected]"
    },
    "source": {
        "git": "https://github.com/YanChen-ing/YCILog.git",
        "tag": "0.1.0"
    },
    "platforms": {
        "ios": "8.0"
    },
    "swift_version": "4.1",
    "subspecs": [
        {
            "name": "Core",
            "dependencies": {
                "YCIDeviceId": []
            },
            "source_files": "YCILog/Core"
        },
        {
            "name": "AutoTrack",
            "dependencies": {
                "YCILog/Core": []
            },
            "source_files": "YCILog/AutoTrack"
        },
        {
            "name": "CrashReporter",
            "pod_target_xcconfig": {
                "ENABLE_BITCODE": "NO"
            },
            "ios": {
                "vendored_frameworks": "YCILog/CrashReporter/CrashReporter.framework"
            },
            "dependencies": {
                "YCILog/Core": []
            },
            "source_files": "YCILog/CrashReporter/*.{swift,h,m}"
        },
        {
            "name": "Destinations",
            "dependencies": {
                "YCILog/Core": []
            },
            "source_files": "YCILog/Destinations"
        }
    ]
}

Pin It on Pinterest

Share This