Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

拜读了一下XLOG #9

Closed
jacobjiangwei opened this issue Dec 28, 2016 · 23 comments
Closed

拜读了一下XLOG #9

jacobjiangwei opened this issue Dec 28, 2016 · 23 comments

Comments

@jacobjiangwei
Copy link

http://mp.weixin.qq.com/s/cnhuEodJGIbdodh0IxNeXQ

C++里已经有log4cpp了,你们说的,他们都做到了,而且02年就做好了

buffer的概念很多年前就有了

还有crash是crash,与日志有何关系?抓crash是另外的topic, log啥也不需要做什么,正常open, write, close即可。crash工具该保证日志写下去,而不是日志能crash写进去。。。

感觉因果关系倒置了

丢日志。。。就更是耸人听闻。。。那还叫日志工具吗。。。

另外还用了BOOST库,唉呀妈呀,口口声声强调为了mobile,为了性能,这就把boost库引入到手机上了?

@garryyan
Copy link
Collaborator

其实 xlog最开始最是从2012年开始的,链接的文章里也说了这个中间演变过程。最后一版是2015年完成的。你看到的2016年的日期应该是 log_crypt 中的日期,这个确实是2016年写的,是为了开源出去稍微重构了一下,新建了这个文件。

业界确实已经有很多优秀的日志组件了,比如 Log4j、LOGBack、Log4CPP等等。 只是这些日志组件大部分都是给服务端做的,有太多冗余的功能是客户端不需要的,功能和性能也都不太能满足客户端的要求。

微信的 xlog 也正是在自身开发过程中应运而生的,这里确实也借鉴了 sqlite 里用mmap 提高性能防止丢数据这个思想。

对于移动开发,其实日志是躲避不了和 crash 联系到一起,用户的手机远比我们想象中的复杂,应用经常被操作系统杀掉(kill 9), 目前 crash 捕捉工具捕捉不到。 而且还有各种闪退,这些都在 PC 时代很少遇到的。基本 crash 工具是很难保证肯定能把日志写下去的。

用了什么库和性能是没有直接关系的,除非这个库非常性能非常差。任何库说白了也是代码和我们写的代码都没区别,正是为了不重复造轮子才引入了 boost,而且主要用了 filesystem, function, shared_ptr, signals2 这些工具类。编译也都是编译的动态库,也不会对安装包的体积产生很大的影响。

感谢对mars的关注,如果发现更多问题,欢迎随时提issue/pr,我们希望能够和社区开发者共同成长。

@milomai
Copy link

milomai commented Dec 28, 2016

2016年才写的代码和经过微信亿万用户验证冲突吗?这都算吹牛?

@qiukeren
Copy link

qiukeren commented Dec 28, 2016

只能说:官方人员的态度真好。

也不至于捧谁。

对比起同样是腾讯搞出来的msec,
这个库,包括头段时间微信开源出来的coroutine库,
看代码,架构和前后的说明就知道是经过验证的,可以放心用。

一楼拿XX文件是2016年创建的说事……就太那个了,让人感觉是为了黑而黑。

想一下就知道两点原因:

  1. 迭代
  2. 开源之前正常的代码梳理

某某项目引用boost,是经常被人诟病的事情,但是直接的说,boost库的性能、稳定性比同类的开源软件只好不差,唯一的缺点,就是体积会变大。

@simpleton
Copy link
Contributor

simpleton commented Dec 28, 2016

C++里已经有log4cpp了,你们说的,他们都做到了,而且02年就做好了

开源就是给大家一种选择,你可以用Log4cpp、Log4j,也可以用xlog,多一种选择没什么不好。

buffer的概念很多年前就有了

函数式的概念1958就提出了,到今天依然很fancy。

还有crash是crash,与日志有何关系?抓crash是另外的topic, log啥也不需要做什么,正常open, write, close即可。crash工具该保证日志写下去,而不是日志能crash写进去。。。

我个人理解log和crash都是我们查问题的一个渠道,我个人是专精Android的,Android中如果有native crash,在app级别是很难有机会去拿到和写当时的crash上下文的。

丢日志。。。就更是耸人听闻。。。那还叫日志工具吗。。。

理想是好的,现实总是残酷的,总是有各种各样的坑在等着我们。

另外还用了BOOST库,唉呀妈呀,口口声声强调为了mobile,为了性能,这就把boost库引入到手机上了?

用什么库我个人觉得只是最早的开发者选型的问题,每个人都有自己的技术栈和使用偏好。如果有性能和程序大小都更优,更适合移动端的库,大家可以在社区开branch去替换掉它。


开源了就是给大家一个交流的途径,总比各自闭门造车的好。因为微信里面确实是在用这些库,微信的日活大家也看到了,“微信亿万用户验证”并没有吹什么牛呀。。。

@jacobjiangwei
Copy link
Author

既然是精简版boost 为什么不直接c++11?boost库导致库变大多少?crash工具我所知道ios的几个工具都可以抓到,与日志没关系,可以反向映射到c++。你们日志性能跟log4cpp比较过吗,性能数据看看?

@zvving
Copy link

zvving commented Dec 28, 2016

开源喷子多,赞官方态度。

@garryyan
Copy link
Collaborator

不用 C++11这个就牵涉到跨平台的原因了。iOS 很早就可以使用 C++11,但是 Android ndk 迟迟没有提供 C++11的标准库,直到今年上半年才给了一个,谷歌一给出,我们就尝试使用了,但是提供的库有 Bug,所以做了回退。所以目前 Mars 是使用 C++11编译,用了 C++11的语法糖,没有使用 C++11的标准库。前面提到的Android 平台下那个库的 Bug 我们一直在关注,看到已经解决了,后面应该会再次尝试切到 C++11,但是需要时间来验证稳定性。

iOS 相对来说没有 Android 的生态恶劣,但是iOS 下也存在有些 Crash工具是捕捉不到的,甚至 Crash 捕捉工具也会 Crash,微信收到闪退但是 Crash 捕捉模块捕捉不到 Crash 的案例数不胜数。这种情况 Android 系统下会更严重。

目前没有直接和 Log4CPP 对比过性能,如果不考虑完整性的话,只考虑耗时文章中有一组数据你可以参考:单行日志的平均耗时。 和Log4CPP 的对比我们后续也会做一下给出数据。

@oncealong
Copy link

赞官方态度。都是技术人员,有问题心平气和的提出来就好。

@Mornin5
Copy link

Mornin5 commented Dec 28, 2016

这样的项目出来,对于业界来说无疑是百利而无一害.
不同的人群各取所需, 学习, 使用 ,亦或是优化.
赞微信团队这种态度, 中国互联网需要这样的精神.
希望以后越来越多的优秀项目开源出来.

@jacobjiangwei jacobjiangwei changed the title 拜读了一下XLOG,2016年才写的代码,能不能不要吹牛说业界优秀,经过微信亿万用户验证 拜读了一下XLOG Dec 29, 2016
@agoodcoolman
Copy link

经得住多大的荣耀就要经得住多大的诋毁.
-------------- 尼古拉斯·赵四

@ghost
Copy link

ghost commented Dec 29, 2016

我是个菜鸟,但是楼主的问题和官方的解答,也让我加深了对xlog的理解。也会去注意这方面的东西。谢谢楼主和官方!! ————还是不要在issues上说些顶撞人的话,我比较乐意看到技术上的交锋!!

@shwenzhang
Copy link
Contributor

在这里我说两句吧,大家也不要去做个人攻击。

关于我们的问题,无论好的还是坏的,我们都会虚心改进,这也是我们开源的目的。我们希望微信可以跟社区共同进步,大家都可以影响到自己日常使用过程中的微信。

@anzyhui
Copy link

anzyhui commented Dec 29, 2016

喷跟讲理有时只是一念之差

@hitdavid
Copy link

你们这是逼大家mute thread吗?在issues里玩这个真无聊。

@xuyisheng
Copy link

确实 做技术先做人,没人欠你什么,开源已经是为技术做贡献了,好与不好,都是交流,拒绝无脑喷

@jacobjiangwei
Copy link
Author

jacobjiangwei commented Dec 30, 2016 via email

@yyz1542685121
Copy link

宝宝,你是想蹭热点吗?我也来蹭一个【害羞】
不管怎么样,人家团队辛辛苦苦研发的代码,贡献出来大家学习探讨~~~
脑子有洞才会有人喷吧!
如果你觉得人家写的不好,你拿出更好的方案来嘛?
一来二去说不定就真的有个完全不丢日志的工具出来啦hhh
我们的目标是----->世界充满爱⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
光说不练假把式嗷嗷嗷==
亲想上头条拿自己的实力说话啦,这种歪门邪道不可取哒~~~
(ps:微信的攻城狮大大们态度好好哦~~~路转粉ing)

@garryyan garryyan reopened this Dec 31, 2016
@garryyan
Copy link
Collaborator

garryyan commented Dec 31, 2016

之前承诺的 benchmark

另外,我 reopen 的目的是希望大家关注到 这个benchmark, 此 issue 禁止人身攻击。

@jacobjiangwei
Copy link
Author

谢谢。。性能看起来数据不错

文中提到了xlog是宏,log4cpp是函数,所以比较慢
我没仔细看,那你们的宏的用法是代码中必须这么写么?
Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, "", logPath, "MarsSample");
没搜到这个函数。是有其他的简化写法吗?
ios/android以及c++代码分别的调用方式是怎样的?

另你提到是带压缩的,是不是开发人员拿到的日志默认是压缩的,是zip的吗?

编了一下BOOST版本的总共库31M per arch
有计划去boost化吗?或者说XLOG能与common组件解耦吗?

@garryyan
Copy link
Collaborator

log4cpp 比 xlog 慢并不是因为 xlog 使用了宏。 是因为 log4cpp 同步写了磁盘,xlog没怎么做。具体细节可以谷歌存储方面的原理分析。

Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, "", logPath,"MarsSample"); 这个只是程序启动时打开xlog的函数。 其他调用接口打日志的时候通过 xverbose xinfo xdebug xwarn xerror xfatal 。当然这只是C++的接口,Objc 可以直接调用,注意传 C/C++ 的数据类型就行了。如果想直接传NSString这种,需要封装一下,demo 里有封装好的接口可以直接用或者自己封装都可以。 Android使用因为是通过JNI 调用到 C,也需要封装, demo里也有相关封装好的接口。

默认拿到的是压缩的,我们有解压的脚本也提供了,是使用的流式压缩,可以认为是zip的一种,后续可能会考虑使用 zstd替换掉,压缩率更高性能也会更高。

目前没有计划去除 boost,除非全部升到 C++11, 因为boost的跨平台封装和一些库,语法糖的封装是别的库不能比的。 全部编确实会很大,但是我们不会全部用,只使用了部分,所以并不会增大库多少。如果必要,我们尽可能不会使用boost里的功能。举个例子:一直想使用正则表达式的一些库,有其他的scanf可以替代,都没引入。

Xlog 不能和 comm 组件解耦,这里涉及到后面会尝试把STN和Xlog解耦,但是接口就需要放在comm里,实现是Xlog。 而且Xlog总需要一些基础库。 无论解耦不解耦对使用者是不可见的。

@happyjiahan
Copy link

官方的态度真好,👍

@kingson09
Copy link

“mmap提高性能防止丢失数据”,其实说白了就是mmap做的一个buffer,优势就是不会丢数据,性能应该还不如普通内存buffer

@wustwg
Copy link

wustwg commented Oct 18, 2019

“mmap提高性能防止丢失数据”,其实说白了就是mmap做的一个buffer,优势就是不会丢数据,性能应该还不如普通内存buffer

确实如此,毕竟还要将数据同步到文件中,不可能比 内存还快。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests