aliyun / aliyun-log-android-sdk

MIT License
180 stars 40 forks source link

日志上报混乱 #68

Closed nichbar closed 3 years ago

nichbar commented 3 years ago

项目最近从老旧的上传 SDK (2.0.0) 更新到了新版上传 SDK ,旧有日志上报的触发条件和逻辑维持原状,上线市场后发现上报的 logStore 出现了错乱的问题

代码中指定为 A logStore 的日志被随机发送到 B, C, D 等其它 logStore

据初步统计,单日上报接近有 5% 数据的 logStore 是错误的

下面是 SDK 的一些配置,希望对排查问题有帮助

val config = LogProducerConfig(ENDPOINT, PROJECT, logStore, ACCESS_KEY_ID, ACCESS_KEY_SECRET).apply {
            // 1 开启断点续传功能, 0 关闭
            // 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
            setPersistent(1)
            // 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件
            setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/log.dat")
            // 是否每次AddLog强制刷新,高可靠性场景建议打开
            setPersistentForceFlush(1)
            // 持久化文件滚动个数,建议设置成10。
            setPersistentMaxFileCount(10)
            // 每个持久化文件的大小,建议设置成1-10M
            setPersistentMaxFileSize(1024 * 1024)
            // 本地最多缓存的日志数,不建议超过1M,通常设置为65536即可
            setPersistentMaxLogCount(65536)

            //网络连接超时时间,整数,单位秒,默认为10
            setConnectTimeoutSec(15)
            //日志发送超时时间,整数,单位秒,默认为15
            setSendTimeoutSec(15)
            //flusher线程销毁最大等待时间,整数,单位秒,默认为1
            setDestroyFlusherWaitSec(2)
            //sender线程池销毁最大等待时间,整数,单位秒,默认为1
            setDestroySenderWaitSec(2)
            //日志时间与本机时间之差,超过该大小后会根据 `drop_delay_log` 选项进行处理。
            //一般此种情况只会在设置persistent的情况下出现,即设备下线后,超过几天/数月启动,发送退出前未发出的日志
            //整数,单位秒,默认为7*24*3600,即7天
            setMaxLogDelayTime(7 * 24 * 3600)
            //对于超过 `max_log_delay_time` 日志的处理策略
            //0 不丢弃,把日志时间修改为当前时间; 1 丢弃,默认为 1 (丢弃)
            setDropDelayLog(0)
            //是否丢弃鉴权失败的日志,0 不丢弃,1丢弃
            //默认为 0,即不丢弃
            setDropUnauthorizedLog(0)
        }

从结果上看应该与 https://github.com/aliyun/aliyun-log-android-sdk/issues/62 类似

麻烦检查下出现混乱的原因,5% 已经是个挺大的数字了 : (

cnbleu commented 3 years ago
// 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件
setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/log.dat")

配置 A、B、C、D logstore 时,setPersistentFilePath() 方法传入的都是同一个文件目录吗?配置多个 logstore 时,setPersistentFilePath方法需要传入不同的文件目录

nichbar commented 3 years ago
// 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件
setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/log.dat")

配置 A、B、C、D logstore 时,setPersistentFilePath() 方法传入的都是同一个文件目录吗?配置多个 logstore 时,setPersistentFilePath方法需要传入不同的文件目录

确认是使用了同一个文件目录,我这边尝试下每个 logstore 使用不同文件目录,晚点有数据了再检查一下

谢谢你的回复 : )

cnbleu commented 3 years ago
// 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件
setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/log.dat")

配置 A、B、C、D logstore 时,setPersistentFilePath() 方法传入的都是同一个文件目录吗?配置多个 logstore 时,setPersistentFilePath方法需要传入不同的文件目录

确认是使用了同一个文件目录,我这边尝试下每个 logstore 使用不同文件目录,晚点有数据了再检查一下

谢谢你的回复 : )

现在数据还有重复吗

nichbar commented 3 years ago
// 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件
setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/log.dat")

配置 A、B、C、D logstore 时,setPersistentFilePath() 方法传入的都是同一个文件目录吗?配置多个 logstore 时,setPersistentFilePath方法需要传入不同的文件目录

确认是使用了同一个文件目录,我这边尝试下每个 logstore 使用不同文件目录,晚点有数据了再检查一下 谢谢你的回复 : )

现在数据还有重复吗

经检查没有错乱的数据了,谢谢