Tencent / mars

Mars is a cross-platform network component developed by WeChat.
Other
17.27k stars 3.63k forks source link

日志解析错误 #1118

Closed agoodcoolman closed 1 year ago

agoodcoolman commented 1 year ago

现象描述:第1天,我把当天日志导出可以正常解析,手机没关。下班未关闭手机。第2天。仅重新跑了一遍程序,导出昨天的日志。解析报错。

raceback (most recent call last): File "D:\document\lanyan\mars\mars-master\mars\log\crypt\decode_mars_nocrypt_log_file.py", line 124, in DecodeBuffer tmpbuffer = decompressor.decompress(str(tmpbuffer)) error: Error -3 while decompressing: invalid stored block lengths Traceback (most recent call last): File "D:\document\lanyan\mars\mars-master\mars\log\crypt\decode_mars_nocrypt_log_file.py", line 133, in DecodeBuffer tmpbuffer = decompressor.decompress(str(decompress_data)) error: Error -3 while decompressing: too many length or distance symbols use wrong decode script use wrong decode script use wrong decode script

是不是前一天的日志没Flush进去昨天的日志里面。然后第二天就有问题。

agoodcoolman commented 1 year ago

542 #816 #1108

排查了,目前自己忘记了再Application的onTerminal中增加close的监听方法。

通过手动修改时间,目前是可以让日志导出正常解析。

agoodcoolman commented 1 year ago

image

如果是类似这种中文乱码,用记事本打开是乱码。用开发工具打开正常。打开的工具的问题。

agoodcoolman commented 1 year ago

后台又报这样的错误

[F]decode_log_file.py decompress err, Error -3 while decompressing: invalid stored block lengths

再等它输出一会,我再次导出一个文件,还是这个文件,我再次解压,就正常了。没有报错,估计是还有一部分文件没有flush进去,导致解析的时候头不全。

agoodcoolman commented 1 year ago

现在直接解压失败,日志打不开。我服了。

agoodcoolman commented 1 year ago

在上传日志文件之前,我想把缓存都写进去,但是只要我在上传文件之前调用 Log.appenderFlushSync(true) 一定会出现以下错误 error: Error -3 while decompressing: invalid stored block lengths

代码: `

               val file = File(AndroidSecurityFileUtils.getBigCacheFile(MyApplication.instance()).absolutePath  + ".xlog")
                // 只要调用了这个方法,一定会报错。谁能告诉我。是不是正在写文件,然后我把文件上传了。但是我直接再从文件中把日志复制出来,同样解压也报错。
                Log.appenderFlushSync(true)

                if (file.exists()) {
                    builder.addFormDataPart(  "file",   file.name,  RequestBody.create(
                        MediaType.parse("application/octet-stream"), file))
                } else {
                    withContext(Dispatchers.Main) {
                        ToastUtils.show("未发现日志文件,无法为您上传日志文件,请尝试打开文件读取权限")
                    }
                    return@launch
                }

                val sharedPreferences = MyApplication.instance().getSharedPreferences(
                    SharedpreferenceConstants.CONFIG, Context.MODE_PRIVATE)
                val name: String? = sharedPreferences!!.getString(SharedpreferenceConstants.USERNAME, "")

                builder.addFormDataPart("account", name)
                    .addFormDataPart("mobileBrand", android.os.Build.BRAND)
                    .addFormDataPart("systemVersion", android.os.Build.VERSION.RELEASE)
                    .addFormDataPart("context", questionContent.get())
                    .addFormDataPart("softVersion", SystemUtils.getPackageVerionName(
                        MyApplication.instance()).toString())

                val parts = builder.build().parts()

                val uploadErrorLog = NetworkService.apiService.uploadErrorLog(parts)
                if (uploadErrorLog.getBoolean("success")) {
                    withContext(Dispatchers.Main) {
                        ToastUtils.show("上传成功")
                        finish()
                    }
                } else {
                    withContext(Dispatchers.Main) {
                        ToastUtils.show("上报失败")
                    }
                }`
agoodcoolman commented 1 year ago

Log.appenderFlushSync(false) Log.appenderFlushSync(true)

Log.appenderFlush()

上传文件之前,调用这三个方法任意一个都有会出现以下问题。 [F]decode_log_file.py decompress err, Error -3 while decompressing: invalid stored block lengths

agoodcoolman commented 1 year ago

有没有可能,在调试的过程中,正在写日志,然后我重新跑程序,这个时候会造成日志的损坏?

agoodcoolman commented 1 year ago

使用今天更新的包,编译的包。报错以下内容。

[F]decode_log_file.py decompress err, Error -3 while decompressing: invalid stored block lengths [F]decode_log_file.py decode error len=16060, result:_buffer[831196]:0 != MAGIC_NUM_START [F]decode_logfile.py log seq:2-52759 is missing �d#j]� ����=x/�06 � �����$]� ������ 6,L,� [F]decode_log_file.py decode error len=3676, result:_buffer[847324]:255 != MAGIC_NUM_START [F]decode_log_file.py log seq:52761-39167 is missing [F]decode_log_file.py decode error len=1535, result:_buffer[851075]:255 != MAGIC_NUM_START [F]decode_log_file.py log seq:39169-23138 is missing 3�8[F]decode_log_file.py decode error len=538, result:_buffer[852690]:0 != MAGIC_NUM_START [F]decode_log_file.py log seq:23140-17154 is missing "�S2�2�= gO ���A�#gO ���o<by�� )� [F]decode_log_file.py decode error len=3284, result:_buffer[853344]:0 != MAGIC_NUM_START [F]decode_log_file.py log seq:17156-48877 is missing [F]decode_log_file.py decode error len=3419, result:_buffer[856702]:0 != MAGIC_NUM_START [F]decode_log_file.py log seq:48879-16524 is missing [F]decode_log_file.py decode error len=1594, result:_buffer[860196]:0 != MAGIC_NUM_START [F]decode_log_file.py log seq:16526-4874 is missing

agoodcoolman commented 1 year ago

我发现只要有这个出现一定会报错。~ end of mmap ~[14797,14797][2023-05-25 +0800 16:34:37] 后面就会解析不了。

agoodcoolman commented 1 year ago

主观认为,我是多进程,因为另外一个进程是百度的。我想着我APplication初始化,我想着我也没用那个打印,应该不影响的。

目前根据不同进程,分别初始化到不同的进程里面。测试看效果。

agoodcoolman commented 1 year ago

后续观察,看是否解决了。

agoodcoolman commented 1 year ago

果然根源还是咱们使用了多个进程。 我是在Application里面初始化的,启动另外一个进程的时候,也是从这个Application初始化的。由于我没判断,使用了同一个缓存地址,虽然我在第二个进程没有去使用,日志输出。但是这个日志输出框架是自带输出的,然后就导致了问题了。在Application分开后,一天之后是可以用最新的解码脚本解码的。