#logging #structured #projects #json

木材加工厂

简单的结构化日志

10个版本

0.2.0 2023年6月21日
0.1.4 2023年6月3日
0.1.3 2023年5月6日
0.1.2 2023年4月9日
0.0.4 2023年4月7日

#401调试

Download history 24/week @ 2024-03-28 12/week @ 2024-04-04

每月 68 次下载

MIT 许可证

180KB
792

🪓 木材加工厂

Crates.io Documentation

简单的结构化日志。

Screenshot of log output

使用方法

use lumbermill::{info, Logger}

fn main() {
  // Initialize the logger early
  Logger::default().init();

  // Log a single line
  info!("Incoming connection from {:?} {}", addr, port);

  // Attach key-value pairs with the log message
  info!(addr.ip = ip, addr.port = port, "Listening on {}", port);
  // Or use the shorthand if the key's name is the same as the variable:
  info!(addr.ip, port, "Listening on {}", port);

  // Attach key-value pairs with the log message, formatting them using their
  // `Debug` trait (useful when variables do not implement `Display`)
  info!(addr.ip = ?ip, addr.port = port, "Listening on {}", port);
  // Or in the shorthand notation:
  info!(?addr.ip, port, "Listening on {}", port);
}

trace!debug!info!warn!error!fatal! 严重受到 tracing 宏的启发,因为它们很棒。

默认日志记录器仅将格式化的日志打印到 stdout,但您可以将 Logger 配置为以不同的方式执行

use lumbermill::{LogFormat, LogLevel, RollInterval};

Logger::builder()
  .format(LogFormat::Compact) // Set the format of logs
  .level(LogLevel::Info) // Set the minimum log level
  .stdout(false) // Stop printing to stdout
  .file("./logs", RollInterval::Daily) // Log to a directory; one file per day

  // Shorthands
  .pretty() //  .format(LogFormat::Pretty)
  .compact() // .format(LogFormat::Compact)
  .pretty_structured() // .format(LogFormat::PrettyStructured)
  .json() // .format(LogFormat::Json)

  // Remember to call `init` after configuration!
  .init();

您可以使用 #![cfg] 宏在不同的场景中拥有不同的活动配置

// Pretty logs on stdout during development
#[cfg(debug_assertions)]
Logger::default().level(LogLevel::Trace).pretty().init();

// Compact logs on rolling files in production
#[cfg(not(debug_assertions))]
{
  let dir = "./logs";
  std::fs::create_dir_all(dir)?;
  Logger::default()
    .level(LogLevel::Info)
    .compact()
    .file(dir, lumbermill::RollInterval::Hourly)
    .init();
}

示例

示例 是了解库的好起点。这样运行它们

$ cargo run --example 01-defaults # Or replace this wil a different example's name

文档 通常在您熟悉了事物后会更详细。

为什么?

tracing 生态系统很棒,但它对于只需要结构化日志而不需要分布式跟踪解决方案的许多应用程序来说却是过度的。 log 包是明显的替代品,但它的 kv 模块仍在开发中。您也无法以不方便的方式记录不实现 Display 的键值对。

这个包是一个临时解决方案,直到 log::kv 稳定。它将 tracing 的出色 event! 宏与 log 的简单性相结合。计划是最终删除这个包中的自定义宏,并直接与 log 集成。

MSRV

这个包目前至少需要 Rust 1.70

致谢

依赖项

~1.2–6MB
~27K SLoC