3个版本
0.1.8 | 2021年10月6日 |
---|---|
0.1.7 | 2021年8月10日 |
0.1.6 | 2021年4月11日 |
0.1.2 |
|
#302 in 调试
72KB
274 行
logsley
这是一个具有偏见的Rust日志库。
功能
- 通过一个函数调用配置日志记录器
- 线程作用域变量
- 任务作用域变量,启用
async
功能 - 从测试中查看日志输出
- 与使用
log
、slog
、slog-scope
和slog-scope-futures
的库协同工作。 - 默认情况下记录JSON。将环境变量
DEV_LOG_FORMAT=full
设置为在终端中获得格式化的输出。 - 使用简单的字符串参数调整模块的日志详细程度,并通过
RUST_LOG 环境变量
覆盖它。例如:RUST_LOG=some::spammy::module=warn,my::buggy::module=trace
。有关详细信息,请参阅slog-envlogger
。 - 由Logsley的罗宾爵士批准
限制
- 使用宏
示例
// 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");
文档
替代方案
发布流程
- 编辑
Cargo.toml
并增加版本号。 - 运行
./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 - 首次发布版本
待办事项
- 已完成 - 尝试使此 crate 符合 Rust API 指南。
- 已完成 - 将 Readme.md 中的信息包含在 crate 的文档中。
- 已完成 - 使存储库公开
- 已完成 - 设置持续集成测试和横幅。
- 已完成 - 添加一些文档测试
- 已完成 - 发布到 creates.io
- 已完成 - 阅读通过 https://crate-ci.github.io/index.html
- 已完成 - 添加和更新变更日志
- 从经验丰富的 Rustacean 获得代码审查
- 添加功能:线程、未来、终端
许可证:Apache-2.0
依赖项
~8–18MB
~233K SLoC