Rust中如何使用log4rs日志?

22-03-25 banq

使用 log4rs 进行高级日志记录:轮换、保留、模式、多个记录器?
我们的任务是为 rust 中的交易机器人实现日志记录。我们有几种交易策略,并希望有单独的记录器和单独的文件。我们希望对文件进行轮换,以便当文件大小达到特定点时,会创建一个新文件。此外,我们希望将旧文件压缩然后删除以节省内存并避免内存不足。

为了实现这一切,我们将使用loglog4rs crates。Log4rs 理解我们需要的一切。我们只需要设置适当的配置。此配置可以通过以下两种方式之一完成:通过YAML 文件或以编程方式。
对于我们的任务,我们将选择 YAML 文件。如果您需要更多动态,使用库实体和方法编写等效代码非常简单。我将在文章末尾分享我们案例的此类代码。


日志输出单独的日志文件
要将我们的日志消息转发到不同的文件,我们必须定义单独的记录器并将每个记录器绑定到特定的字符串。日志箱有多个宏,例如error!()、warn!()、info!()、debug!()和trace!()。
当您调用这样的宏来记录消息时,该宏应该设置当前日志事件的特定记录器。默认情况下,宏检查为调用此宏的当前模块设置的记录器,然后宏将此记录器绑定到当前日志事件。
让我们看一下示例以了解其含义。假设我们有一个名为test_crate的箱子。在这个箱子里,我们有一个带有函数func_in_test_module()的模块

mod test_module {
    use log::error;

    fn func_in_test_module() {
        error!("An error occurred!");
    }
}


当我们调用error!()宏时,它会将记录器设置为“test_crate::test_module”。如果我们用这样的名称定义我们的自定义记录器,它将用于当前的日志事件。
对于某些情况,这种方法可能是合适的,但对于其他情况,我们希望有更大的灵活性。因此,或者我们可以显式地为log 宏提供目标值:

mod test_module {
    use log::error;

    fn func_in_test_module() {
        error!(target: "foo", "An error occurred!");
    }
}


因此,我们应该使用名称“foo”定义记录器,它将绑定到当前日志事件。
现在我们可以动态地决定为特定的日志宏调用使用什么记录器,并为记录器指定我们想要的任何名称。
 
更多点击标题