24 个版本 (4 个重大变更)
0.5.2 | 2024 年 7 月 16 日 |
---|---|
0.5.0 | 2024 年 6 月 15 日 |
0.4.0 | 2024 年 1 月 29 日 |
0.1.7 | 2023 年 12 月 26 日 |
0.1.5 | 2023 年 7 月 1 日 |
#226 在 Rust 模式
每月 1,555 次下载
在 29 个 crate 中使用 (6 直接使用)
32KB
762 代码行
错误和日志消息紧密相关 - 两者都是事件,日志实时输出(到终端或远程记录器)而不影响执行流程,错误则替代成功结果向上传递给其他上下文以进行记录或丢弃。两者都提供有关事件发生时情况的信息,包括堆栈上下文(发生了什么,作为更大动作的一部分,以及与其他实体的关系)。
使用此库,您可以构建一棵 Log
对象树以在多个级别存储上下文,并且 Log
对象具有用于记录和创建包含完整上下文树的错误的函数。
use loga::{
ea,
ResultContext,
INFO,
};
fn main1() -> Result<(), loga::Error> {
// All errors stacked from this will have "system = main"
let log = &loga::Log::new_root(INFO).fork(ea!(system = "main"));
// Convert the error result to `loga::Error`, add all the logger's attributes, add
// a message, and add additional attributes.
let res =
http_req(
"https://example.org",
).stack_context_with(log, "Example.org is down", ea!(process = "get_weather"))?;
match launch_satellite(res.body) {
Ok(_) => (),
Err(e) => {
let e = e.stack_context(log, "Failed to launch satellite");
if let Err(e2) = shutdown_server() {
// Attach incidental errors
return Err(e.also(e2.into()));
}
return Err(e);
},
}
if res.code == 295 {
return Err(loga::err("Invalid response"));
}
log.log(INFO, "Obtained weather");
return Ok(());
}
fn main() {
match main1() {
Ok(_) => (),
Err(e) => loga::fatal(e),
}
}
目标
本 crate 的目标是使生成具有完整上下文的清晰和详细日志消息和错误变得简单。为此,创建错误和日志消息以及添加上下文必须简单易行。
只有在不影响使用和表达能力的情况下,才会考虑优化。
事件结构
事件(错误和日志消息)还具有树状结构,以下是一些维度
- 当前上下文级别的属性
- 一个或多个此错误添加上下文的错误(原因)
- 在尝试处理此错误时发生的一个或多个错误(偶然)
错误仅用于人类消费。任何可能需要程序性处理的信息应包含在非错误返回中。
使用技巧
在可能在不同上下文中共享的非日志函数或对象中,而不是从调用者那里接收记录器,内部启动一个新的(空白)Log 树可能更简单,或者只需使用 .context
。调用者可以稍后使用 .stack_context
根上下文,或者记录器的上下文将自然添加到 log.log_err
。
注意
目前日志仅写入 stderr。将来添加更多日志目的地和格式将很棒。
依赖项
~4–12MB
~137K SLoC