我的应用程序中有一项小型服务,该服务会创建大量日志。由于这些日志很重要,因此即使我显示它们可以同时使用,我还是希望将其本地保存以备后用。我决定使用一个小型会议室数据库来存储这些日志。通过这种方式,我的服务可以轻松创建这些日志,并且我的应用程序可以将这些日志显示给用户。
我的日志非常简单。假设我的Entity
和Dao
的定义如下:
@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用于我的日志的想法不合适,我欢迎任何新建议。
答案 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 中。
参考:
请访问官方网站here。
此外,这里是此库的some basic tutorial。
log4j.properties tutorial
答案 2 :(得分:0)
@Query("SELECT * FROM LogsData ORDER BY insertDate DESC LIMIT 10")
您可以使用此查询获取最后 10 行,但您必须添加插入日期以使用它对行进行排序