Meituan-Dianping / Logan

Logan is a lightweight case logging system based on mobile platform.
https://tech.meituan.com/logan_open_source.html
MIT License
5.63k stars 861 forks source link

android13长时间使用之后, 出现无法写入日志的情况 #486

Open dengzhiguiios opened 11 months ago

dengzhiguiios commented 11 months ago

android13长时间使用之后, 出现无法写入日志的情况 检查设备剩余空间---剩余几十G, 正常 重启app---一样无法写入日志和上传日志 写入储存权限关闭再打开---日志可以重新写入和上传日志 在小于android13设备使用---正常 在android13设备短期使用---正常 在android13设备长期使用---无法写入日志

测试设备---三星android13平板 日志文件存储位置---context.fileDir, 这是应用内部存储目录, 按道理不需要写入存储权限

猜测和android13的媒体权限改动有关, 在android13申请WRITE_EXTERNAL_STORAGE会得到永久拒绝的回调, 还有应用长时间不使用会自动回收权限

Richard-Cao commented 11 months ago

测试下换个目录呢?比如用cacheDir

dengzhiguiios commented 11 months ago

日志使用时间不定, 不知道要用多久会无法写入, 比较难重现, 但是在android13上使用问题是有的, 出现了好多次

Richard-Cao commented 11 months ago

日志使用时间不定, 不知道要用多久会无法写入, 比较难重现, 但是在android13上使用问题是有的, 出现了好多次

换个目录试试呢,换个不需要WRITE_EXTERNAL_STORAGE权限的

dengzhiguiios commented 5 months ago

找到问题所在了, 版本是1.2.4, 没找到更新的版本使用 LoganThread里面的private boolean mIsWorking;是非原子性的 在上传日志的时候, 把Logan日志的保存目录下文件全部删除掉, 本来是为了2分钟左右上传一次日志(浏览器加载太多日志会奔溃) 删除日志文件的过程中, mIsWorking的值一直为true, 导致写入日志失败

解决方案: 创建一个volatile关键词修饰的变量, 保存删除日志文件中的状态, 在删除中就禁止写入日志, 这样避免mIsWorking的值被修改

Richard-Cao commented 5 months ago

你是删除的了当天的日志?

dengzhiguiios commented 5 months ago

是全部日志删除, 因为产生比较多网络请求日志, 不能太长时间再上传, 一个文件太多日志在浏览器会内存不足网页奔溃. 看官方的删除日志是删除.copy文件, 删除这个在下次上传的时候会叠加以前的日志, 达不到预期效果, 所以直接整个日志目录里面全部日志文件都删除了