网上有类似的帖子了,为什么我还要再重复造轮子?
网上的帖子大多是几年前的,而现在已经是24年了,有些环境现在都不在了。
环境
安装python2
本人是linux(manjaro)环境,首先需要安装python2.7,直接运行
sudo pacman -Ss python
或
yay -S python2
安装好之后版本为 Python 2.7.18
创建venv
这里我用的pycharm生成的venv环境,对python命令行不熟悉的人来说,pycharm真是神器。
创建密钥
在Mars源码目录下找到mars/mars/log/crypt/gen_key.py
安装依赖:
1. pyelliptic 最新版本
venv2.7/bin/pip install pyelliptic
如果你遇到了 “AttributeError: 'module' object has no attribute 'ECC'” 错误 ,请安装如下版本
venv2.7/bin/pip install bloxroute-pyelliptic
2. 确保已安装openssl。linux自带的应该就有,可遇到问题的时候再安装。
执行gen_key.py文件
$ venv2.7/bin/python2.7 gen_key.py
save private key
******************
appender_open's parameter:
********************************************
将私钥和公钥分别配置到decode_mars_crypt_log_file.py中
...
PRIV_KEY = "*************"
PUB_KEY = "****************"
...
修改xlog初始化代码
Xlog.open(true,
Xlog.LEVEL_DEBUG, //日志打印级别
Xlog.AppednerModeAsync, //日志同步方式
cachePath, //缓存路径
dir, //日志储存路径
"xLog", //日志文件前缀
"*********pub key*********"
)
解密日志文件
venv2.7/bin/python2.7 mars/log/crypt/decode_mars_crypt_log_file.py xx_20211118.xlog
如果不需要解密,则可直接使用“mars/mars/xlog/crypt/decode_mars_nocrypt_log_file.py
”脚本解压缩日志。
遇到的问题
解密xlog日志后,发现日志不是最新的,跟当前时间有一定间隔。
该问题可能有几个原因:
1. 如果写日志的进程处于运行状态,日志还在内存中缓存着,还没有刷新到mmap3文件中。
2. 如果写日志的进程已经处于停止状态,那最新日志肯定就在mmap3文件中了,单单解密xlog文件是看不到最新的日志的。
几种解决方案:
1. 杀掉进程:这时缓存中的日志会刷新到mmap3文件中。重新启动:日志会从mmap3文件转存到xlog文件中。这时再获取xlog文件解密就可以读取到杀掉进程时的最新日志。
2. 在应用进入后台时(这个需要自己实现,有人说xlog实现了该接口,但是我实测没有效果),调用appenderFlush方法,刷新日志到xlog文件中。
3. 假设现在mmap3中已经存在最新日志并且也有xlog文件,有没有办法同时解密mmap3和xlog文件呢?当然有。把mmap3文件和当前的xlog文件放在一个目录中,然后执行如下命令。
cat xLog.mmap3 xLog_20240828.xlog > aa.xlog && venv2.7/bin/python2.7 mars/mars/xlog/crypt/decode_mars_nocrypt_log_file.py aa.xlog
最终mmap3和xlog的日志一起解密好的内容就在aa.log中。