使用Room存储系统日志

时间:2019-02-18 06:56:06

标签: android android-room

我的应用程序中有一项小型服务,该服务会创建大量日志。由于这些日志很重要,因此即使我显示它们可以同时使用,我还是希望将其本地保存以备后用。我决定使用一个小型会议室数据库来存储这些日志。通过这种方式,我的服务可以轻松创建这些日志,并且我的应用程序可以将这些日志显示给用户。

我的日志非常简单。假设我的EntityDao的定义如下:

@Entity(tableName = "logs_db")
public class LogsData {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int mId;
    @ColumnInfo(name = "level")
    private int mLevel;
    @NonNull
    @ColumnInfo(name = "desc")
    private String mDesc;

    public LogsData() {
    }

    @Ignore
    public LogsData(int level, @NonNull String desc) {
        mId = 0;
        mLevel = level;
        mDesc = desc;
    }

    public int getId() {
        return mId;
    }

    public void setId(int id) {
        mId = id;
    }

    public int getLevel() {
        return mLevel;
    }

    public void setLevel(int level) {
        mLevel = level;
    }

    public String getDesc() {
        return mDesc;
    }

    public void setDesc(@NonNull String desc) {
        mDesc = desc;
    }
}

@Dao
public interface LogsDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void addLog(LogsData logs);

    @Query("DELETE FROM logs_table")
    void deleteAll();

    @Query("SELECT * FROM logs_table")
    LiveData<List<LogsData>> getAllLogs();
}

好,现在这是我的问题。假设我的表当前有100行,并且我通过addLog()再添加1条日志条目。 getAllLogs()将返回101行日志,因为它查询整个表。因此,使用getAllLogs()是从表中读取日志的最糟糕的主意。因为对于logs_db中的每个插入,我将获得表的全部内容,而只有新日志很重要

我正在尝试更改Doa和/或Entity,以便找到仅添加最近日志的方法。这意味着,例如,如果表中有10行日志,并添加了2条新记录,那么我得到的是更新的2条。知道怎么做吗?

顺便说一句,如果您认为将Room DB用于我的日志的想法不合适,我欢迎任何新建议。

3 个答案:

答案 0 :(得分:0)

我认为没有使用Room实施此方法的优雅方法。但是,您可以为带有@Insert批注的方法设置返回类型Long。

@Insert(onConflict = OnConflictStrategy.REPLACE)
void addLog(LogsData logs): Long; 

之后,您可以使用这些ID从数据库中检索最后添加的记录。

答案 1 :(得分:0)

我了解您的需求。而库log4j正是实现此目的所需要的。 您可以打印实时日志,也可以根据需要将它们存储在日志文件或数据库中。

因此,您可以打印日志

static Logger log = Logger.getLogger(log4jExample.class.getName());
log.trace("Trace Message!");
log.debug("Debug Message!");
log.info("Info Message!");
log.warn("Warn Message!");
log.error("Error Message!");
log.fatal("Fatal Message!");

要将日志保存到文件或数据库中,您需要配置log4j.properties文件。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

LogManager CLASSPATH 中查找名为log4j.properties的文件。因此,您需要将此文件放入 CLASSPATH 中。

参考:

  1. 请访问官方网站here

  2. 此外,这里是此库的some basic tutorial

  3. log4j.properties tutorial

答案 2 :(得分:0)

@Query("SELECT * FROM LogsData ORDER BY insertDate DESC LIMIT 10")

您可以使用此查询获取最后 10 行,但您必须添加插入日期以使用它对行进行排序