5 个版本
0.1.0 | 2024 年 3 月 7 日 |
---|---|
0.0.4 | 2023 年 11 月 25 日 |
0.0.3 | 2023 年 10 月 7 日 |
0.0.2 | 2023 年 10 月 7 日 |
0.0.1 | 2023 年 9 月 14 日 |
#594 在 数据库接口 中
每月 104 次下载
9KB
109 行
x-log4rs-sqlite
实验性 log4rs 追加器,用于写入 SQLite 数据库。
尚未准备好用于生产环境,但如果您希望以程序方式处理日志,并且可以承受性能成本,则可能有用。
使用方法
要通过配置文件(例如 log4rs.yaml
)使用自定义追加器,您必须在配置反序列化器中注册该追加器,然后在配置文件中引用该追加器。
目前日志条目在追加器中被缓冲在内存中,然后以批量方式写入数据库。这在一个写入日志的线程中以阻塞方式发生,这意味着这种方式的日志记录成本很高。
需要显式使用 log::logger().flush()
清除缓冲的条目,否则它们将会丢失。
缓冲区大小目前不可配置,并硬编码为值 1024
。
示例最小程序
use log::info;
fn main() -> anyhow::Result<()> {
let deserializers = {
let mut d = log4rs::config::Deserializers::new();
d.insert("sqlite", x_log4rs_sqlite::SqliteLogAppenderDeserializer {});
d
};
log4rs::init_file("log4rs.yaml", deserializers)?;
info!("hello, world");
log::logger().flush();
Ok(())
}
示例 log4rs.yaml
配置文件
appenders:
sqlite:
kind: sqlite
path: log.sqlite
root:
level: debug
appenders:
- sqlite
模式
如果数据库文件不存在,则将使用默认模式创建它,该模式目前为
create table if not exists entry (
id varchar(128) not null primary key,
ts varchar(128) not null,
level varchar(128) not null,
message varchar(8192) not null
);
create index if not exists entry_ts_i on entry (ts);
字段包括
id
:条目的 uuid,由追加器在记录日志时生成,ts
:日志条目的时间戳作为字符串,由追加器计算,格式为2023-09-23 19:20:30.401272
,在 UTC 时区,但没有时区指示符,具有微秒精度,level
:log4rs 日志级别作为字符串,message
:日志条目消息作为字符串。
示例数据
sqlite> select id, level, ts, message from entry order by ts desc, id desc limit 5;
78a00529-625f-4d3c-af74-806b7c74b955|INFO|2023-09-26 18:47:26.413391|test log message 999999
09a402b5-ae3f-43ef-91ce-fe6e6c9e6fdb|INFO|2023-09-26 18:47:26.413386|test log message 999998
a906fc6c-44b1-4147-a268-8ea88aac119b|INFO|2023-09-26 18:47:26.413381|test log message 999997
151240f6-75c2-4163-85ba-ff316bffc028|INFO|2023-09-26 18:47:26.413375|test log message 999996
41f3456a-ea9e-488c-a6d8-7b171ee909a3|INFO|2023-09-26 18:47:26.413370|test log message 999995
如果日志文件存在,但其模式与上述不兼容,则日志将会丢失,并且 log4rs 将在记录日志时将错误消息打印到标准输出。
数据库模式,如整个 crate,应被视为实验性和不稳定的,并且可以在不发出警告的情况下在不兼容的方式下在版本之间更改。
依赖关系
~25MB
~477K SLoC