自定义 xlog 加密

xlog 的具体实现可以参考微信终端跨平台组件 Mars 系列(一) - 高性能日志模块 xlog)

在自定义日志加密算法前,先来了解一下日志的结构:

|magic start(char)|seq(uint16_t)|begin hour(char)|end hour(char)|length(uint32_t)|crypt key(uint32_t)|log|magic end(char)|

以上结构为一个日志结构体,在 Xlog.AppednerModeSync (同步模式)下,每写一行日志都会组装成一个日志结构体写入到日志文件中。在 Xlog.AppednerModeAsync (异步模式)下,mmap 中的数据是是一个日志结构体,每当往 mmap 中写入一行日志数据时,同时会修改结构体中的 length 的值。

所以结构体中有四部分是不能去除的:magic start、length、log、magic end。其他部分可以根据需要增减。

日志默认是提供 ecdh +tea的混合加密算法,具体使用方法见 Xlog 加密指引。如果你只是想更改加密算法的话,只需要修改两个函数(注意,老版本是需要单独把log_crypt.h和log_crypt.cc文件单独复制到上层代码里实现。最新版本已经不需要这么做):

  1. void CryptSyncLog(const char* const _log_data, size_t _input_len, char* _output, size_t& _output_len);
  2. void CryptAsyncLog(const char* const _log_data, size_t _input_len, char* _output, size_t& _output_len);

自定义加密算法后,一定要修改解密 xlog 的 python 脚本。修改python的解压逻辑需要注意:因为日志是先压缩后再让你重定义加密的,所以解密脚本中需要先解密再解压,而且需要注意解密脚本中有两种类型:同步日志和异步日志,注意和你的加密算法对应上。