希望发起对douban/libmc#75 的讨论,pr内容可以先不看,我下面会简单介绍。
1,首先引入对multi thread logging 的支持。对于dae-go这种有自己的pool实现,里面放了golibmc的Client。这样一来 多个goruntine可能会拿多个Client同时操作。需要有线程唯一的mutex来保证log不会串。同理对于python多线程程序(或gevent)来讲 如果要用libmc也会面临类似问题。引入plog能够解决这一点。
https://github.com/SergiusTheBest/plog/blob/master/include/plog/Appenders/ConsoleAppender.h#L28 https://github.com/SergiusTheBest/plog/blob/master/include/plog/Appenders/ConsoleAppender.h#L56 https://github.com/SergiusTheBest/plog/blob/master/include/plog/Util.h#L360 https://github.com/SergiusTheBest/plog/blob/master/include/plog/Util.h#L310 https://github.com/douban/libmc/pull/75/files#diff-6b049cde08edceed2718a5acad05442eR83
2,runtime config log level。 还是拿dae-go举例子,我这次debug,需要dae配合,帮忙在一台机器上单独生效 包含patch过的libmc的代码的 docker image,并且重启该节点上的应用, 才能看到warning level及以下的log。这不是很方便。 另外我们需要经常回答各种来自开发者的疑问,有时候我们怀疑是dae机器的网络问题,但是我们没有证据。 如果有runtime config log level,这些情况我们都不用临时打包上线的流程。能够更及时的观察问题。
pr https://github.com/douban/libmc/pull/75/commits 一共7个commit。我就分commit说我分别做了什么。
前三个commit一起说,具体commit内容甚至可以不看。
1, include plog header files 2,no patch, just delete files 3, not rm plog win32code
这个pr由于是后来整理的,所以第一个commit提交的其实是对plog的代码裁剪的最厉害的。第2,3个commit分别revert了部分裁剪。
裁剪完了的最小状态是,
wc -l plog/* plog/*/*
28 plog/Init.h
48 plog/Log.h
73 plog/Logger.h
171 plog/Record.h
49 plog/Severity.h
242 plog/Util.h
45 plog/Appenders/ConsoleAppender.h
15 plog/Appenders/IAppender.h
32 plog/Formatters/TxtFormatter.h
703 total
第2个commit撤销了用patch文件删除代码行。
这样的话plog的代码回来一些
wc -l plog/* plog/*/*
72 plog/Init.h
113 plog/Log.h
73 plog/Logger.h
171 plog/Record.h
49 plog/Severity.h
349 plog/Util.h
4 plog/WinApi.h
46 plog/Appenders/ConsoleAppender.h
15 plog/Appenders/IAppender.h
110 plog/Appenders/RollingFileAppender.h
24 plog/Converters/UTF8Converter.h
53 plog/Formatters/CsvFormatter.h
32 plog/Formatters/TxtFormatter.h
1111 total
第3个commit撤销了用https://github.com/douban/libmc/pull/75/commits/3307a4a6eb57cef94ffc53adb316814b13e48734#diff-89d52e43a440bcd53a686f2b11c9ce38L1 这个脚本直接删除_WIN32 相关的代码行。
这样的代码又回来一些
wc -l plog/* plog/*/*
95 plog/Init.h
113 plog/Log.h
73 plog/Logger.h
174 plog/Record.h
49 plog/Severity.h
403 plog/Util.h
136 plog/WinApi.h
62 plog/Appenders/ConsoleAppender.h
15 plog/Appenders/IAppender.h
118 plog/Appenders/RollingFileAppender.h
28 plog/Converters/UTF8Converter.h
53 plog/Formatters/CsvFormatter.h
32 plog/Formatters/TxtFormatter.h
1351 total
还有直接删没有用到的文件,没有revert,如果也revert的话,就是完整的plog代码了
wc -l plog/* plog/*/*
95 plog/Init.h
113 plog/Log.h
73 plog/Logger.h
174 plog/Record.h
49 plog/Severity.h
403 plog/Util.h
136 plog/WinApi.h
47 plog/Appenders/AndroidAppender.h
101 plog/Appenders/ColorConsoleAppender.h
62 plog/Appenders/ConsoleAppender.h
16 plog/Appenders/DebugOutputAppender.h
111 plog/Appenders/EventLogAppender.h
15 plog/Appenders/IAppender.h
118 plog/Appenders/RollingFileAppender.h
44 plog/Converters/NativeEOLConverter.h
28 plog/Converters/UTF8Converter.h
53 plog/Formatters/CsvFormatter.h
23 plog/Formatters/FuncMessageFormatter.h
23 plog/Formatters/MessageOnlyFormatter.h
32 plog/Formatters/TxtFormatter.h
1716 total
所以讨论点1,需不需要裁剪,内部的意见是不裁剪。即用plog完整的代码。
4, use snprintf directly
撤销在ifndef _GNU_SOURCE的情况下,自定义asprintf的做法,直接使用固定大小buf,然后snprintf
讨论点2 这里需要一个 类printf的func 将log内容format到c char array再给到plog的c++ stream。有两种做法,第一种,用asprintf,但是ifndef _GNU_SOURCE的情况下,需要单独封装下vsnprintf,第二种是直接用snprintf print固定大小的buffer,现默认长度是250,但是有xiufeng提到的问题,如果log mc key的话,250肯定不够。
5, add WITH_PLOG to enable plog or not
讨论点3,这点要做应该没什么疑问,但是也mark下。将plog作为条件编译项,默认不开启,跟这个pr之前的行为保持一致。
6,fix cppcheck supp
没什么说的,略。
7,mv plog llvm & rapidjson to 3rd_patry
将plog llvm和rapidjson的代码从include已到3rd_party。这点改动的出发点是如果不这样处理的话,需要额外mask一行plog的代码才能过cppcheck。 https://github.com/douban/libmc/pull/75/commits/0690be8684187a7d70af742f838712c3decf0fdc#diff-1eb7cb39d7fb760c3246250645ce1d68L1 也去掉了对llvm的mask。
讨论点4,内部觉得分开到3rd_patry是不错的做法。
讨论点5,增加对需求的支持,是引入外部项目plog,还是自己实现,有待讨论?
@pan @yang @pc 以上就是整个情况。
lgtm
从 lijun pr 最终结果出发, 总结一下讨论点