#log #logging #log-entries #database-schema #debugging

db_logger

用于与log crate配合的数据库日志记录器

1 个不稳定版本

0.1.0 2022年4月12日

#2050数据库接口

Apache-2.0

65KB
1K SLoC

用于与log crate配合的数据库日志记录器

crates.io docs.rs

db_logger是一个Rust crate,提供对log crate日志封装的实现,将结构化日志条目写入数据库。只需在程序开头添加几行代码,所有日志都将保存以供后续分析,特别适合(分布式)服务。

db_logger目前支持PostgreSQL和SQLite,由sqlx crate提供支持。

db_logger的最新版本是0.1.0,发布于2022-04-12。

使用方法

要使用db_logger,您需要在项目中添加正确的功能依赖项,创建一个具有预期模式的数据库,然后在程序初始化期间初始化记录器。

作为日志封装实现,db_logger应仅从二进制crate(而不是从库)依赖。

与PostgreSQL一起使用

  1. 将以下内容添加到Cargo.toml中的依赖项列表中

    [dependencies.db_logger]
    version = "0.1"
    default-features = false
    features = ["postgres"]
    
  2. 创建一个PostgreSQL数据库,并使用schemas/postgres.sql模式初始化它。

  3. 在代码中使用以下任一方法初始化记录器

    • 显式配置

      use db_logger::postgres;
      let conn = postgres::connect_lazy(postgres::ConnectionOptions {
          host: "some host".to_owned(),
          port: 5432,
          database: "some database".to_owned(),
          username: "some username".to_owned(),
          password: "some password".to_owned(),
          ..Default::default()
      });
      let _handle = db_logger::init(conn).await;
      
    • 基于环境的配置

      use db_logger::postgres;
      let conn = postgres::connect_lazy(
          postgres::ConnectionOptions::from_env("LOGGER").unwrap());
      let _handle = db_logger::init(conn).await;
      

      这将使程序识别形式为LOGGER_HOSTLOGGER_PORTLOGGER_DATABASELOGGER_USERNAMELOGGER_PASSWORD的变量来配置PostgreSQL连接。

  4. 请确保在异步上下文中保持_handle活跃,因为在异步上下文中,handle保持后台日志任务活跃。

与SQLite一起使用

  1. 将以下内容添加到Cargo.toml中的依赖项列表中

    [dependencies.db_logger]
    version = "0.1"
    default-features = false
    features = ["sqlite"]
    
  2. 创建一个SQLite数据库,并使用schemas/sqlite.sql模式初始化它。

  3. 使用

    use db_logger::sqlite;
    let conn = sqlite::connect(sqlite::ConnectionOptions {
        uri: "file:/path/to/database?mode=rw",
        ..Default::default()
    }).await.unwrap();
    let _handle = db_logger::init(conn).await;
    
  4. 请确保在异步上下文中保持_handle活跃,因为在异步上下文中,handle保持后台日志任务活跃。

环境配置

db_logger识别RUST_LOG环境变量来配置要记录的日志消息的最大级别,就像env_logger crate一样。

模式初始化

如上所述,您应在使用schemas目录中提供的参考文件建立连接之前,手动创建数据库及其模式。这是一个一次性操作。

您还可以选择调用Connection::create_schema()方法来初始化数据库模式。在生产环境中可能不想这样做,但如果您使用临时SQLite数据库,这将非常有用。

限制

这个crate中的代码是从EndBASIC云服务提取出来的,然后为了单独发布而进行了清理。这段代码是作为该服务的一部分进行的有趣实验,并且没有接受过大量的实际测试。因此,请期待它会有很多限制,包括

  • 因为db_logger在进程内运行,记录器必须过滤掉在写入数据库时可能生成的任何日志消息(否则它将进入无限循环)。这包括其自身依赖的日志消息,例如由sqlx或tokio发出的消息,这意味着如果您使用此crate,您不会将这些日志保存到数据库中。

  • 性能不佳。虽然记录器试图通过缓冲日志消息来避免阻塞调用者代码,但如果您记录很多,您的应用程序将变慢。我相信进行一些性能分析可以使它变得更好,而无需付出太多努力,但我只是还没有花时间去做。

  • 没有跟踪支持。这个crate可能是一个死胡同。将原始日志保存到数据库很有趣,但更有趣的是保存与跟踪crate集成时生成的跟踪(以便跟踪异步服务器中流动的单独请求,这是最初的想法)。

  • stderr污染。目前,在将日志持久化到数据库时遇到的任何错误以及被过滤掉的任何日志消息都将以临时格式输出到stderr。这种行为应该是可配置的,但不是。

依赖项

~19–27MB
~594K SLoC