iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

15 | 日志监控:怎样获取 App 中的全量日志?

戴铭 2019-04-13
你好,我是戴铭。
我在前面的第 12、13 和 14 三篇文章中,和你分享了崩溃、卡顿、内存问题的监控。一旦监控到问题,我们还需要记录下问题的详细信息,形成日志告知开发者,这样开发者才能够从这些日志中定位问题。
但是,很多问题的定位仅靠问题发生的那一刹那记录的信息是不够的,我们还需要依赖更多的日志信息。
在以前公司还没有全量日志的时候,我发现线上有一个上报到服务器的由数据解析出错而引起崩溃的问题。由于数据解析是在生成数据后在另一个线程延迟执行的,所以很难定位到是谁生成的数据造成了崩溃。
如果这个时候,我能够查看到崩溃前的所有日志,包括手动打的日志和无侵入自动埋点的日志,就能够快速定位到是由谁生成的数据造成了崩溃。这些在 App 里记录的所有日志,比如用于记录用户行为和关键操作的日志,就是全量日志了。
有了更多的信息,才更利于开发者去快速、精准地定位各种复杂问题,并提高解决问题的效率。那么,怎样才能够获取到 App 里更多的日志呢
你可能会觉得获取到全量的日志很容易啊,只要所有数据都通过相同的打日志库,不就可以收集到所有日志了吗?但,现实情况并没有这么简单。
一个 App 很有可能是由多个团队共同开发维护的,不同团队使用的日志库由于历史原因可能都不一样,要么是自己开发的,要么就是使用了不同第三方日志库。如果我们只是为了统一获取日志,而去推动其他团队将以前的日志库代码全部替换掉,明显是不现实的。因为,我们谁也无法确定,这种替换日志库的工作,以后是不是还会再来一次。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • Geek_97bcf5
    一般大厂的app都不会用NSLog来打印日志的,我不知道滴滴打车是否用NSLog来打印日志,所以,本文的方案并不符合生产环境。日志是需要分类的,需要压缩,需要加密,实时染色等。NSLog根本不可能完成这些功能,所以,大厂的app都有专门的日志框架。各个模块中也不会用NSLog来输出日志。

    作者回复: 对,大厂都有自己的日志框架。可能是一套或者多套。也有很多直接包装了CocoaLumberjack。加解密一般都是安全团队统一处理的,不光用在日志上。

    2019-04-13
    1
    11
  • daniel
    static void(*orig_nslog) (NSString *format,...); 这里声明的时候是*号不是&号,声明是一个对象,估计老师那边打错了
    还有下面这段代码
    va_list va;
        va_start(va,format);
        NSLogv(format, va);
        va_end(va);
    可以换成orig_nslog(format) ,这时候我们的orig_nslog就是原来NSLog在Mach-o中的地址了,这时候可以直接拦截使用了,老师希望课里面代码可以检查仔细点再发出来,好多次直接报错,然后又找不到原因,这样挺打击人的。。。还有注释可以再清楚点
    2019-05-31
    2
  • Ant
    温故而知新, 对我来说是反过来说的, 知新而温故。
    main函数执行之前
    加载可执行文件、
    加载动态链接库rebase指针调整和bind符号绑定、
    运行时开始处理,
    objc类注册,category注册,selector唯一性检查,
    load方法,attribute修饰函数调用,
    创建c++静态全局变量
    2019-04-17
    1
  • drunkenMouse
    所以,几个人的小团队直接使用统一的日志库就可以了?

    syslogd是一个进程,保护系统接收分发日志消息的进程?

    CocoaLumberJack这段有点乱,整理了一下:

    captureAslLogs方法对ASL日志的处理措施是:将日志消息转换成char * 字符串类型,然后再转成NSString类型,随后将其记录。
    记录使用DDLog:log:message:方法。
    记录时需要将NSString转成DDLogMessage类型,而DDLogMessage设置了日志级别,所以转换类型后也要设置日志级别。

    NSLog的日志级别是Verbose。

    最后,iOS10之后,为了兼容新的统一日志系统,需要对NSLog日志的输出进行重定向。iOS10之后CocoaLumberJack获取不到NSLog的日志了?

    作者回复: 是的

    2019-04-13
    1
  • dingdongfm
    如果需要获取最终用户手机上的日志来定位问题的话,一般怎么获取日志?
    2019-06-10
  • mersa
    写文件不是耗电,还有影响app运行性能么。这个产线情况怎么能够保存全量日志同时性能和耗电都能最低
    2019-06-02
  • 二木又土
    对App来说,网络请求使用AFNetworking,怎么把网络请求的log优雅点的过滤打印出来?另外log,在控制台还会遇到字符串太长显示被截断的问题
    2019-04-25
  • lianleven
    老师问个问题:如果服务端几乎同时到达客户端1000条消息,这个时候该如何用多线程处理
    2019-04-19
  • James
    因为团队不大,项目日志采用的方式为freopen重定向stderr类型的日志到本地文件的方式,并没有引入三方库,请问这种方式有什么缺点?
    另外大厂的所谓日志框架具体是怎么记录日志的?难道底层实现完全不用NSLog或print吗?
    2019-04-18
  • jimbo
    static void (&orig_nslog)(NSString *format, ...); 这里是不是应该变成 static void (*orig_nslog)(NSString *format, ...); 不然报错
    2019-04-16
  • Geek_f0e049
    上周才第一次用CocoaLumberjack做了日志系统,并且看了fishhook的原理,这次看这篇文章就全用上了,太nice了,对两者的使用和理解更深了。哈哈😄

    作者回复: 赞

    2019-04-14
  • drunkenMouse
    ASL在iOS10.0之后没法用了。所以CocoaLumberJack无法获取到所有的日志,但除了NSLog日志外,别的日志都能获取到吗?

    作者回复: CocoaLumberJack 其他日志不受影响

    2019-04-13
收起评论
12
返回
顶部