3个版本

0.1.8 2021年10月6日
0.1.7 2021年8月10日
0.1.6 2021年4月11日
0.1.2 2020年11月27日

#302 in 调试

Apache-2.0

72KB
274

logsley

这是一个具有偏见的Rust日志库。

功能

  • 通过一个函数调用配置日志记录器
  • 线程作用域变量
  • 任务作用域变量,启用 async 功能
  • 从测试中查看日志输出
  • 与使用 logslogslog-scopeslog-scope-futures 的库协同工作。
  • 默认情况下记录JSON。将环境变量 DEV_LOG_FORMAT=full 设置为在终端中获得格式化的输出。
  • 使用简单的字符串参数调整模块的日志详细程度,并通过 RUST_LOG 环境变量 覆盖它。例如: RUST_LOG=some::spammy::module=warn,my::buggy::module=trace。有关详细信息,请参阅 slog-envlogger
  • 由Logsley的罗宾爵士批准
    Cary Elwes as Robin Hood in the film Robin Hood Men in Tights (1993)

限制

  • 使用宏

示例

// You should do logging like this.

let _global_logger_guard =
  logsley::configure("info").unwrap();
logsley::thread_scope("main", || {
  // Log named values:
  logsley::error!("err {}", 1; "x" => 2);
  // {"time_ns":1604899904064111000,
  // "time":"2020-11-08T21:31:44.064-08:00",
  // "module":"opinion",
  // "level":"ERROR",
  // "message":"err 1",
  // "thread":"main",
  // "x":2}
  logsley::warn!("warn {}", 1; "x" => 2);
  logsley::info!("info {}", 1; "x" => 2);
  logsley::debug!("debug {}", 1; "x" => 2);
  logsley::trace!("trace {}", 1; "x" => 2);

  // Log simple messages:
  log::info!("log {}", 1);
  // {"time_ns":1604899904065070000,
  // "time":"2020-11-08T21:31:44.065-08:00",
  // "module":"opinion",
  // "level":"INFO",
  // "message":"log 1",
  // "thread":"main"}

  std::thread::spawn(|| {
    logsley::thread_scope("thread1", || {
      logsley::info!("in thread {}", 1; "x" => 2);
  })})
  .join()
  .unwrap();
  // {"time_ns":1604899904065111000,
  // "time":"2020-11-08T21:31:44.065-08:00",
  // "module":"opinion",
  // "level":"INFO",
  // "message":"in thread 1",
  // "thread":"thread1",
  // "x":2}

  async_std::task::block_on(
    logsley::task_scope("task1", async move {
      logsley::info!(
        "logsley in task {}", 1; "x" => 2);
  }));
  // {"time_ns":1604899904065241000,
  // "time":"2020-11-08T21:31:44.065-08:00",
  // "module":"opinion",
  // "level":"INFO",
  // "message":"logsley in task 1",
  // "task":"task1",
  // "thread":"main",
  // "x":2}

  panic!("uhoh");
  // {"time_ns":1604899904955593000,
  // "time":"2020-11-08T21:31:44.955-08:00",
  // "module":"log_panics",
  // "level":"ERROR",
  // "message":"thread 'main' panicked at 'uhoh': examples/opinion.rs:30\n
  //   0: backtrace::backtrace::libunwind::trace\n
  //             at /.../backtrace-0.3.54/src/backtrace/libunwind.rs:90:5\n
  //      backtrace::backtrace::trace_unsynchronized\n
  //             at /.../backtrace-0.3.54/src/backtrace/mod.rs:66:5\n
  //   1: backtrace::backtrace::trace\n
  //             at /.../backtrace-0.3.54/src/backtrace/mod.rs:53:14\n
  //   2: backtrace::capture::Backtrace::create\n
  //             at /.../backtrace-0.3.54/src/capture.rs:176:9\n
  //   3: backtrace::capture::Backtrace::new\n
  //             at /.../backtrace-0.3.54/src/capture.rs:140:22\n
  //   4: log_panics::init::{{closure}}\n
  //             at /.../log-panics-2.0.0/src/lib.rs:52:25\n
  //   5: std::panicking::rust_panic_with_hook\n
  //             at /.../library/std/src/panicking.rs:581:17\n
  //   6: std::panicking::begin_panic::{{closure}}\n
  //             at /.../library/std/src/panicking.rs:506:9\n
  //   7: std::sys_common::backtrace::__rust_end_short_backtrace\n
  //             at /.../library/std/src/sys_common/backtrace.rs:153:18\n
  //   8: std::panicking::begin_panic\n
  //             at /.../library/std/src/panicking.rs:505:12\n
  //   9: opinion::main::{{closure}}\n
  //             at examples/opinion.rs:30:9\n
  //  10: slog_scope::scope\n
  //             at /.../slog-scope-4.3.0/lib.rs:248:5\n
  //  11: logsley::thread_scope\n
  //             at src/lib.rs:179:5\n
  //  12: opinion::main\n
  //             at examples/opinion.rs:5:5\n
  //  13: core::ops::function::FnOnce::call_once\n
  //             at /.../library/core/src/ops/function.rs:227:5\n
  //  14: std::sys_common::backtrace::__rust_begin_short_backtrace\n
  //             at /.../library/std/src/sys_common/backtrace.rs:137:18\n
  //  15: std::rt::lang_start::{{closure}}\n
  //             at /.../library/std/src/rt.rs:66:18\n
  //  16: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once\n
  //             at /.../library/core/src/ops/function.rs:259:13\n
  //      std::panicking::try::do_call\n
  //             at /.../library/std/src/panicking.rs:381:40\n
  //      std::panicking::try\n
  //             at /.../library/std/src/panicking.rs:345:19\n
  //      std::panic::catch_unwind\n
  //             at /.../library/std/src/panic.rs:382:14\n
  //      std::rt::lang_start_internal\n
  //             at /.../library/std/src/rt.rs:51:25\n
  //  17: std::rt::lang_start\n
  //             at /.../library/std/src/rt.rs:65:5\n
  //  18: _main\n",
  // "thread":"main"}
  });
}

有关可运行的示例,请参阅 examples/opinion.rs

将默认日志级别设置为 info。程序将发出 info 级别及其以上的日志消息。

let _global_logger_guard = logsley::configure("info");
log::error!("emitted");
log::warn!("emitted");
log::info!("emitted");
log::debug!("not emitted");
log::trace!("not emitted");

将默认日志级别设置为 info 并将 chatty::module1 的级别设置为 warn

let _global_logger_guard =
    logsley::configure("info,chatty::module1=warn");

使用环境变量覆盖默认日志级别。 module1 仍然具有其特殊的日志级别。

std::env::set_var("RUST_LOG", "debug");
let _global_logger_guard =
    logsley::configure("info,module1=warn");

使用环境变量将 module1 设置为 debug

std::env::set_var("RUST_LOG", "module1=debug");
let _global_logger_guard =
    logsley::configure("info");

文档

https://docs.rs/logsley

替代方案

发布流程

  1. 编辑 Cargo.toml 并增加版本号。
  2. 运行 ./release.sh

变更日志

  • v0.1.8 - 添加 async 功能
  • v0.1.7 - 修复错误。
  • v0.1.6 - 添加缺少的 slog 重新导出。
  • v0.1.5 - 将 OutputFormat::JSON 重命名为 Json 以满足夜间 clippy。
  • v0.1.4 - 更新文档。
  • v0.1.3 - 修复缺少的 slog_scope::logger 错误
  • v0.1.2 - 修复 configure_for_test 中的恐慌
  • v0.1.1 - 使示例代码适合 crates.io 的 60 列代码视图。
  • v0.1.0 - 首次发布版本

待办事项

许可证:Apache-2.0

依赖项

~8–18MB
~233K SLoC