2个不稳定版本

0.2.0 2023年5月7日
0.1.0 2022年8月20日

#675 in 调试


2 crate 中使用

MIT/Apache

12KB
105

logerr

无缝错误类型日志记录。

它做什么?

logerr 旨在使将错误日志记录作为 std::result::Result 的一部分变得简单且无阻碍。它提供了一个 trait,LoggableError,该 trait 在多种常见的 Result 变体上实现。所有 trait 函数都具有一个特殊属性,即它们 未修改地传递 Result 类型

这样,常规错误处理就不会受到任何阻碍,并且可以在处理错误的同时进行日志记录。

如何使用它

一旦您有一个支持错误类型的 Result,您只需这样做

use anyhow::{anyhow, Context};
use logerr::LoggableError;  // Must include to get access to trait functions

fn main() {
    Err(anyhow!("an error occured"))
        .context("this is just a demo")
        .to_stderr()                     // <-- Magic!
        .unwrap()
}

有一些特性标志控制日志记录的行为。默认情况下,LoggableError 使用对所有实现 Error 的错误类型通用的实现,并使用它们的 Display 实现打印错误,如果实现了 Error::source(),则打印错误链。

如果您想使用更多高级功能,或为您的自定义错误类型(包括自定义日志记录)添加特殊实现,请禁用默认功能并自行实现该 trait。

特性标志

特性兼容性矩阵

以下是一个矩阵表示,显示可以安全组合的特性。一个 X 表示特性可以组合。

log anyhow generic
log X X
anyhow X
generic X

选择要使用的特性

我只想要记录错误!

在这种情况下,默认特性(loggeneric)可能非常适合您

我希望完全使用自己的错误格式化!

目前这仅适用于你或你的代码拥有的错误类型(由于孤儿规则)。在这种情况下,放弃所有默认功能,自己实现 LoggableError 特性。如果你需要灵感,可以查看源代码。

我在所有的错误处理中都使用 anyhow!

使用 anyhow 功能标志,你就可以开始了。

log

引入了 log crate,并为 to_log 添加了默认实现,将错误打印到 log::error!

注意:记录的消息将不包含调用该模块的信息。这是 Rust 语言的缺点,一旦 #87417 合并后,将得到修复。

anyhow

引入了 anyhow crate,并为 anyhow::Result(即 Result<_, anyhow::Error)添加了特定实现,使用默认的 anyhow 调试格式打印整个错误链。你的应用程序必须使用 anyhow::Result 类型才能正常工作。

generic

为所有实现 Error 特性的错误类型添加了 LoggableError 特性的泛型实现。结果看起来像这样

ERROR: an error occured
because: something bad happened
because: file doesn't exist

根本原因是最后打印的错误。

依赖项

~120KB