Skip to content

Instantly share code, notes, and snippets.

@MOON-CLJ
Last active February 2, 2018 04:44
Show Gist options
  • Save MOON-CLJ/4666697179f9d5620af3075b0c17e16b to your computer and use it in GitHub Desktop.
Save MOON-CLJ/4666697179f9d5620af3075b0c17e16b to your computer and use it in GitHub Desktop.
libmc discuss:use plog

希望发起对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,这些情况我们都不用临时打包上线的流程。能够更及时的观察问题。

下面我介绍下如果用plog的话的具体做法,

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文件删除代码行。

https://github.com/douban/libmc/pull/75/commits/487219217ae83d4a8522440c37ecd0550e020d14#diff-16740fce2bf6bb3cb79b8bea9dd24824L25

这样的话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

https://github.com/douban/libmc/pull/75/commits/cb5e511779498ed4a1d859732062cd2ec91aabe3#diff-37c5166a9c75d2421c1f7000487d1f41L69

撤销在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 以上就是整个情况。

@youngsofun
Copy link

youngsofun commented Feb 2, 2018

lgtm

从 lijun pr 最终结果出发, 总结一下讨论点

  1. 加强 log 是lijun 的需求(1. go 需要锁,2 runtime log)。子问题:
    1. 要 2选 1: 引入 plog or 自己实现: 加锁加 flag
    2. “是否 开启 runtime log” 作为编译选项
  2. 如果引入 plog,如何引入? 子问题:
    1. 放到 third party? (顺带将 llvm 和 rapidjson 也放过去)
    2. 要不要 删除plog 用不到的文件,以减少引入代码量?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment