coder-dongjiayi / MXLogger

MXLogger 是基于mmap内存映射机制的跨平台日志库,支持AES CFB 128位加密,支持iOS Android Flutter。核心代码使用C/C++实现, Flutter端通过ffi调用,性能几乎与原生一致。 底层序列化使用Google开源的flat_buffers实现,高效稳定。
Other
142 stars 18 forks source link

删除日志后无法继续写入 #15

Closed mml237 closed 1 year ago

mml237 commented 1 year ago

清理所有日志后,再次写入日志,并查找日志文件,发现找不到 复现步骤:

  1. 调用mxLogger?.removeAllData()
  2. 继续写入日志
  3. 读取日志文件:mxLogger?.logFiles(),结果为空数组
  4. 重启app之后,读取mxLogger?.logFiles(),有数据

下图是我的mxLogger的创建方式: image

mml237 commented 1 year ago

补充:mxLogger?.removeAllData()之后,继续写入日志,沙盒文件中始终没有创建新的日志文件

coder-dongjiayi commented 1 year ago

当前写入文件被删除,日志无法写入。正常情况是不能删除当前正在写入的文件的,如果删了 需要重新初始化mxlogger对象

mml237 commented 1 year ago

当前写入文件被删除,日志无法写入。正常情况是不能删除当前正在写入的文件的,如果删了 需要重新初始化mxlogger对象

如何实现?以下写法会崩溃: image image

coder-dongjiayi commented 1 year ago

你的需求要把本地所有的日志文件都删掉么? 正常的逻辑是:

  1. 创建logger对象(如果业务层封装的是单利的话 则logger对象不释放)
  2. 只删除过期文件

我提供了释放对象的方法 是对于非单利的业务情况 比如 你们的app 是一个大工程,其中某一个模块是其他团队在维护。你的app中集成了这个模块 当进入这个模块的时候创建logger对象 离开这个模块的时候调用销毁的方法(我的demo logger就是在一个二级页面创建的 当前controller 出栈的时候 logger销毁)

如果你不属于上面的情况,正常来说 日志对象在业务层的单利里面不会释放 ,应该不会调用销毁的方法。

mml237 commented 1 year ago

你的需求要把本地所有的日志文件都删掉么? 正常的逻辑是:

  1. 创建logger对象(如果业务层封装的是单利的话 则logger对象不释放)
  2. 只删除过期文件

我提供了释放对象的方法 是对于非单利的业务情况 比如 你们的app 是一个大工程,其中某一个模块是其他团队在维护。你的app中集成了这个模块 当进入这个模块的时候创建logger对象 离开这个模块的时候调用销毁的方法(我的demo logger就是在一个二级页面创建的 当前controller 出栈的时候 logger销毁)

如果你不属于上面的情况,正常来说 日志对象在业务层的单利里面不会释放 ,应该不会调用销毁的方法。

没有那么复杂,就是日常开发时,日志太多不方便看。 如何将已有日志全部清除(包括尚未写入磁盘的),然后重新开始记录?期待增加此功能

coder-dongjiayi commented 1 year ago

能不能写一个demo 复现一下你上面的崩溃,发上来。 我从你的截图来看 没看出问题来。

mml237 commented 1 year ago

能不能写一个demo 复现一下你上面的崩溃,发上来。 我从你的截图来看 没看出问题来。

MXDemo.zip

coder-dongjiayi commented 1 year ago

MXDemo 里面ViewController 持有MXLogger对象(m1),当第二次创建MXLogger对象(m2)的时候 ,会触发m1对象的delloc方法,这个delloc方法 里面有这样一行代码mx_logger::delete_namespace(_nameSpace.UTF8String, _directory.UTF8String); 意思就是通过namespace和directory 去释放对应的C++对象.所以m2调用对应的c++对象就野指针了。

从你代码逻辑来看,不符合我设计这个框架的初衷。实际的开发情况日志本身就很多,很杂,不太容易查看,这种情况应该从日志解析端入手解决 而不是清理原始数据。Demo中调用释放的方法,更多原因是希望告诉开发者这是一个多例的设计,允许在一些复杂 特殊的业务场景里面 创建多个logger对象。正常情况下logger 在业务层应该是一个单例的设计 不应该被释放。