Logan icon indicating copy to clipboard operation
Logan copied to clipboard

Android日志解析失败

Open ethanhua opened this issue 4 years ago • 12 comments

感谢作者提供的这个库,但在我使用过程中出现了日志上报失败的问题,服务端使用的Logan的服务端代码,返回错误码是EXCEPTION, 源码报错位置如图: 截屏2021-12-26 下午10 36 12

将服务端解析代码拷贝到客户端对上报的log文件进行解析时 发现

#53行
byte[] encrypt = new byte[wrap.getInt()];

这一句中的wrap.getInt()返回负值导致创建byte数组异常

截屏2021-12-26 下午10 38 51

改为 #321 所示的代码后,不会再拿到为负值的数据了, 截屏2021-12-26 下午10 55 27

logan在我们项目中集成很久了,最近的版本出现解析失败的问题

ethanhua avatar Dec 26 '21 14:12 ethanhua

改了之后能正常解析出来吗

Richard-Cao avatar Dec 27 '21 02:12 Richard-Cao

上报正常的日志我解析出来也是乱码 所以不太确定是否改完之后正常

ethanhua avatar Dec 27 '21 04:12 ethanhua

上报正常的日志我解析出来也是乱码 所以不太确定是否改完之后正常

这个我帮你艾特一下几个同学一起看看 @jiangteng @Mr-xiaojun @zlLuo

Richard-Cao avatar Dec 27 '21 05:12 Richard-Cao

感谢,我现在能正常解析出文本了,之前的解密代码里面由于我认为是客户端解析没有经过网络请求所以我自己去掉了GZIPStream的逻辑 加上就好了,现在在验证出错的情况下,使用新修改的代码是否能正常解析,且日志信息相对完整。

#321 提供的代码只能解析出第一条数据,需要进一步修改成这样:

#origin
while (wrap.hasRemaining()) {
                while (wrap.get() == ENCRYPT_CONTENT_START) {
                    byte[] encrypt = new byte[wrap.getInt()];
                    if (!tryGetEncryptContent(encrypt) || !decryptAndAppendFile(encrypt)) {
                        Log.e("hhy", "parse error old");
                        break;
                    }
                }
            }
# new
 while (wrap.hasRemaining()) {
                byte next = wrap.get();
                Log.e("hhy", "next byte:" + next);
                while (next == ENCRYPT_CONTENT_START && wrap.hasRemaining()) {
                    Log.e("hhy", "ENCRYPT_CONTENT_START" + (byte) ENCRYPT_CONTENT_START);
                    int tmpSize = wrap.getInt();
                    Log.e("hhy", "wrap getInt size:" + tmpSize);
                    byte[] encrypt = new byte[tmpSize];
                    if (!tryGetEncryptContent(encrypt) || !decryptAndAppendFile(encrypt)) {
                        Log.e("hhy", "parse error");
                        break;
                    }
                    next = wrap.get();
                    Log.e("hhy", "next byte2:" + next);
                    Log.e("hhy", "ENCRYPT_CONTENT_START2" + (byte) ENCRYPT_CONTENT_START);
                }
            }

ethanhua avatar Dec 27 '21 06:12 ethanhua

@Richard-Cao 这样写可以解析成功,但可能导致如果遇到解析失败的数据后面的数据就不再进行解析了可能会造成日志丢失,楼主可以看下客户端什么情况下会出现这种写入异常的问题吗?

ethanhua avatar Dec 27 '21 06:12 ethanhua

感谢,我现在能正常解析出文本了,之前的解密代码里面由于我认为是客户端解析没有经过网络请求所以我自己去掉了GZIPStream的逻辑 加上就好了,现在在验证出错的情况下,使用新修改的代码是否能正常解析,且日志信息相对完整。

#321 提供的代码只能解析出第一条数据,需要进一步修改成这样:

#origin
while (wrap.hasRemaining()) {
                while (wrap.get() == ENCRYPT_CONTENT_START) {
                    byte[] encrypt = new byte[wrap.getInt()];
                    if (!tryGetEncryptContent(encrypt) || !decryptAndAppendFile(encrypt)) {
                        Log.e("hhy", "parse error old");
                        break;
                    }
                }
            }
# new
 while (wrap.hasRemaining()) {
                byte next = wrap.get();
                Log.e("hhy", "next byte:" + next);
                while (next == ENCRYPT_CONTENT_START && wrap.hasRemaining()) {
                    Log.e("hhy", "ENCRYPT_CONTENT_START" + (byte) ENCRYPT_CONTENT_START);
                    int tmpSize = wrap.getInt();
                    Log.e("hhy", "wrap getInt size:" + tmpSize);
                    byte[] encrypt = new byte[tmpSize];
                    if (!tryGetEncryptContent(encrypt) || !decryptAndAppendFile(encrypt)) {
                        Log.e("hhy", "parse error");
                        break;
                    }
                    next = wrap.get();
                    Log.e("hhy", "next byte2:" + next);
                    Log.e("hhy", "ENCRYPT_CONTENT_START2" + (byte) ENCRYPT_CONTENT_START);
                }
            }

优秀啊

Richard-Cao avatar Dec 27 '21 08:12 Richard-Cao

@Richard-Cao 这样写可以解析成功,但可能导致如果遇到解析失败的数据后面的数据就不再进行解析了可能会造成日志丢失,楼主可以看下客户端什么情况下会出现这种写入异常的问题吗?

有可能是切到后台的时候没及时flush,这个android和iOS不太一样应该

Richard-Cao avatar Dec 27 '21 08:12 Richard-Cao

我们已经在前后台切换的时候调用flush了,但不能完全解决这个问题,有什么方式可以彻底解决这个问题吗?或者当写入失败的时候爆出一些日志 方便定位问题

ethanhua avatar Dec 27 '21 08:12 ethanhua

我们已经在前后台切换的时候调用flush了,但不能完全解决这个问题,有什么方式可以彻底解决这个问题吗?或者当写入失败的时候爆出一些日志 方便定位问题

这个情况看着不像是写入失败,有可能是写到最后压缩符没写进去

Richard-Cao avatar Dec 27 '21 10:12 Richard-Cao

嗯 估计是写入的时候没有完整写入导致数据格式异常解析不出来,作者有计划对这块排查优化下吗?我这边先服务端解析逻辑兼容处理下

ethanhua avatar Dec 28 '21 09:12 ethanhua

嗯 估计是写入的时候没有完整写入导致数据格式异常解析不出来,作者有计划对这块排查优化下吗?我这边先服务端解析逻辑兼容处理下

这个情况之前排查过,某些极端情况确实可能出现,先服务端兼容下吧

Richard-Cao avatar Dec 28 '21 09:12 Richard-Cao

你们说的没有完整写入是前端写二进制文件吗

752546272 avatar Nov 06 '23 03:11 752546272