保存事件类型日志

Posted

技术标签:

【中文标题】保存事件类型日志【英文标题】:Save event type logs 【发布时间】:2018-05-11 18:07:43 【问题描述】:

我们希望在现有应用程序中添加报告功能。 为此,我们通过HTTPSJSON 中的事件发送到服务器应用程序。

我们需要记住无法发送到服务器的事件对象(没有互联网,服务器无法访问......)。我们正在考虑将事件存储在 SQLite 数据库中,并丢弃所有超过 24 小时的事件,以防止存储空间泛滥。

另一种选择是将 JSON 对象写入文件,并在无法发送到服务器时连接每个新事件。这个解决方案的问题是,我们很难丢弃超过 24 小时的日志。

我们将事件存储在一个带有列的表中:

|编号 | json | created_at |

谁能推荐这个用例的最佳实践?

目前我们倾向于使用sqlite 解决方案,但我们想知道是否有任何我们不知道的警告。

【问题讨论】:

【参考方案1】:

如果您不介意使用第三方库,我可以推荐 android-priority-jobqueue。您可以轻松实现您想要做的事情。您始终可以创建工作,它会自行处理。你可以设置它是否需要网络,如果它是持久的(没有网络时保存到数据库中),甚至你可以自定义你自己的重试逻辑。

这是一个小例子。

public class PostTweetJob extends Job 
    public static final int PRIORITY = 1;
    private String text;
    public PostTweetJob(String text) 
        // This job requires network connectivity,
        // and should be persisted in case the application exits before job is completed.
        super(new Params(PRIORITY).requireNetwork().persist());
    
    @Override
    public void onAdded() 
        // Job has been saved to disk.
        // This is a good place to dispatch a UI event to indicate the job will eventually run.
    
    @Override
    public void onRun() throws Throwable 
        // yours code here
    
    @Override
    protected RetryConstraint shouldReRunOnThrowable(Throwable throwable, int runCount,
            int maxRunCount) 
        // An error occurred in onRun.
        return RetryConstraint.createExponentialBackoff(runCount, 1000);
    

你这样称呼它。

jobManager.addJobInBackground(new PostTweetJob("It works"));

【讨论】:

这能很好地处理许多工作吗?我们的应用每天可以产生多达一万个事件。 我想是的。它在内部使用 SQLite,所以我认为它会很好。【参考方案2】:

在此解决方案中使用 JobService(Android 5+ - lollipop 及更高版本)和 AlarmManager(适用于 android sdk

附: 在这种情况下,您不需要任何第三方库和其他依赖项,例如 firebase/google play services(例如 FirebaseDispatcher)

【讨论】:

以上是关于保存事件类型日志的主要内容,如果未能解决你的问题,请参考以下文章

二进制日志

MySQL HA高可用

在 postgres 中,如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)

MySQL 二进制日志的结构

Linux 124课程 10分析存储日志

Oracle 跟踪事件 set event