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

Android 中App意外退出导致日志无法解压而带来日志丢失的问题 #447

Closed
gzhsgit opened this issue Nov 30, 2022 · 10 comments

Comments

@gzhsgit
Copy link

gzhsgit commented Nov 30, 2022

缓存使用逻辑:

现在Logan使用了mmap做内存缓存,如果缓存中的数据被写入文件,则清空缓存。
当App意外退出时,如果缓存中的数据来不及写入文件,则会被系统帮我们写回.map2文件中,下次应用启动的时候,检查.map2文件是否为空,如果不为空,则将内容追加到日志文件中,这也是日志不丢失的基本原理。

写日志逻辑:

当调用clogan_write写日志时,会调用clogan_write_section->clogan_write2->clogan_zlib_compress;
在clogan_zlib_compress中,先试用deflate进行压缩,然后调用AES进行加密,然后将加密的结果写入缓存中,当压缩大小达到一个压缩单元时,调用clogan_zlib_end_compress完成一个单元的压缩。当压缩出来的数据不是16的整数倍时,剩下的数据保存在内存中(注:这部分内存是没有mmap保护的),下次再有数据时,凑够16字节再加密,这是我目前使用版本的逻辑,不知道后来有没有改过。

Bug:

1.当App 退出时,如果缓存中的数据不够一个压缩单元,也就是clogan_zlib_compress没有被调用,下次启动即使这部分数据被找回来,解密之后进行解压缩的时候,由于不是一个完整的压缩单元也会报错,导致解压失败,导致日志丢失。
2.当App退出时,如果有剩余未加密的余留数据,这部分数据由于只是在内存中,也会丢失,并且没法恢复,最终也会是和1同样的结果。

针对这两个问题,不知道作者是否已经做了优化,或者是不是有好的优化思路,感谢!

@Richard-Cao
Copy link
Member

切到后台flush一下试试呢

@gzhsgit
Copy link
Author

gzhsgit commented Dec 1, 2022

@Richard-Cao 嗯,这种策略是有的,但是如果App发生了Crash,那可能就没机会flush了,当然也可以监听Crash然后Flush,但显得有些笨拙,不是根本上解决问题

@Richard-Cao
Copy link
Member

@Richard-Cao 嗯,这种策略是有的,但是如果App发生了Crash,那可能就没机会flush了,当然也可以监听Crash然后Flush,但显得有些笨拙,不是根本上解决问题

确实,不过内部应该已经处理了这个问题,可能是没更新到开源仓库来

@gzhsgit
Copy link
Author

gzhsgit commented Dec 5, 2022

好的,那我就自己改一版先用着

@xiexiang89
Copy link

@Richard-Cao 嗯,这种策略是有的,但是如果App发生了Crash,那可能就没机会flush了,当然也可以监听Crash然后Flush,但显得有些笨拙,不是根本上解决问题

确实,不过内部应该已经处理了这个问题,可能是没更新到开源仓库来

请教下,这个问题现在有更新到开源仓库嘛

@Richard-Cao
Copy link
Member

@Richard-Cao 嗯,这种策略是有的,但是如果App发生了Crash,那可能就没机会flush了,当然也可以监听Crash然后Flush,但显得有些笨拙,不是根本上解决问题

确实,不过内部应该已经处理了这个问题,可能是没更新到开源仓库来

请教下,这个问题现在有更新到开源仓库嘛

目前我看没有呢

@xiexiang89
Copy link

@Richard-Cao 嗯,这种策略是有的,但是如果App发生了Crash,那可能就没机会flush了,当然也可以监听Crash然后Flush,但显得有些笨拙,不是根本上解决问题

确实,不过内部应该已经处理了这个问题,可能是没更新到开源仓库来

请教下,这个问题现在有更新到开源仓库嘛

目前我看没有呢

有计划什么时候更新到开源仓库么 @Richard-Cao

@Richard-Cao
Copy link
Member

@Richard-Cao 嗯,这种策略是有的,但是如果App发生了Crash,那可能就没机会flush了,当然也可以监听Crash然后Flush,但显得有些笨拙,不是根本上解决问题

确实,不过内部应该已经处理了这个问题,可能是没更新到开源仓库来

请教下,这个问题现在有更新到开源仓库嘛

目前我看没有呢

有计划什么时候更新到开源仓库么 @Richard-Cao

不知道呢,我已经不在美团啦

@dachongdouniwan
Copy link

@gzhsgit 请教一下,这个问题又导致crash的可能吗,我遇到一个crash显示崩溃在gzread函数里

@dachongdouniwan
Copy link

image

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

4 participants