Rust - 跟踪调试器 - 想要简单说明如何使用

Rust - Tracing Debugger - Want Simple Explanation Of How To Use

use std::fmt::Debug;
use tracing::{span, Level, event, instrument};

fn main() {
    pub fn calculate<T: Debug, const N: usize>(data_set: [T; N]) -> (i32, i32) {
    
        // Tracing BoilerPlate
        event!(Level::INFO, "something happened");
        let span = span!(Level::INFO, "my_span");
        let _guard = span.enter();
        
        // Key Code 
        let _var = data_set.get(0);
        println!("Output_1: {:?}", data_set.get(0)); 
        
        event!(Level::DEBUG, "something happened inside my_span");
        
        // Ignore
        return (0, 0)
    }

    let data = [1509, 1857, 1736, 1815, 1576];
    let _result = calculate(data);
}

跟踪文档:https://docs.rs/tracing/0.1.29/tracing/

我这里有一个非常简单的代码示例,它只是想获取我传入的列表的第一项。我一直在尝试实现 rust-tracing 来尝试调试应用程序,但坦率地说,文档是太复杂了,我无法完全理解。

具体到这里,我不明白在哪里可以查看event!日志。他们似乎没有打印到任何 window 或文件或任何东西。

有人可以告诉我在哪里可以找到这些调试日志,或者向我提供有关如何使用 tracing 模块的简单说明吗?

这是 tracing 的基本实现,它将信息输出到 日志文件(存储库根目录中的debug.log)and/or stdout(带有更多代码)使用名为 tracing-subscriber

的合作伙伴 crate

要找到这些有关如何将 tracingtracing-subscriber 结合在一起的具体示例,您必须深入研究文档:转到 tracing-subscriber 箱子,然后转到Layer 特征,然后转到 Module level documentationHere is an alternative link.

frankly the documentation is too sophisticated for me to completely understand.

我认为这两个箱子的文档还有很多工作要做。客观上,它并不能让初学者很容易理解发生了什么。文档用高度复杂的语言描述了板条箱,但未能正确地向新手教授基础知识。需要针对此主题创建更完整的资源或快速入门指南。

更简单的调试工具可用,正确地教你如何使用它的 crateFlexi-logger 提供了一个 code examples documentation page ,它熟练地解释了如何使用 crate。 Flexi-loggerLog crate 协同工作以输出 log files 以及 stdoutstderr.

Here is the Tracing Implementation


use tracing_subscriber::{filter, prelude::*};
use std::{fs::File, sync::Arc};

// A layer that logs events to stdout using the human-readable "pretty"
// format.
fn main() {
    let stdout_log = tracing_subscriber::fmt::layer()
        .pretty();

    // A layer that logs events to a file.
    let file = File::create("debug.log");
    let file = match file  {Ok(file) => file,Err(error) => panic!("Error: {:?}",error),};
    let debug_log = tracing_subscriber::fmt::layer()
        .with_writer(Arc::new(file));

    // A layer that collects metrics using specific events.
    let metrics_layer = /* ... */ filter::LevelFilter::INFO;

    tracing_subscriber::registry()
        .with(
            stdout_log
                // Add an `INFO` filter to the stdout logging layer
                .with_filter(filter::LevelFilter::INFO)
                // Combine the filtered `stdout_log` layer with the
                // `debug_log` layer, producing a new `Layered` layer.
                .and_then(debug_log)
                // Add a filter to *both* layers that rejects spans and
                // events whose targets start with `metrics`.
                .with_filter(filter::filter_fn(|metadata| {
                    !metadata.target().starts_with("metrics")
                }))
        )
        .with(
            // Add a filter to the metrics label that *only* enables
            // events whose targets start with `metrics`.
            metrics_layer.with_filter(filter::filter_fn(|metadata| {
                metadata.target().starts_with("metrics")
            }))
        )
        .init();

    // This event will *only* be recorded by the metrics layer.
    tracing::info!(target: "metrics::cool_stuff_count", value = 42);

    // This event will only be seen by the debug log file layer:
    tracing::debug!("this is a message, and part of a system of messages");

    // This event will be seen by both the stdout log layer *and*
    // the debug log file layer, but not by the metrics layer.
    tracing::warn!("the message is a warning about danger!");

}