#io-operations #io-read #io #logging #io-write #networking #async

logged-stream

记录所有读写操作、错误和底层 IO 对象的销毁

14 个版本

0.4.0 2024年7月3日
0.3.5 2024年2月24日
0.3.4 2023年10月7日
0.3.2 2023年6月12日

84调试 中排名

Download history 5/week @ 2024-04-22 7/week @ 2024-04-29 1/week @ 2024-05-06 13/week @ 2024-05-20 31/week @ 2024-06-03 9/week @ 2024-06-10 74/week @ 2024-06-17 160/week @ 2024-07-01 68/week @ 2024-07-08 30/week @ 2024-07-15 1/week @ 2024-07-22 140/week @ 2024-07-29 23/week @ 2024-08-05

198 每月下载次数
用于 2 代码包

MIT/Apache

59KB
961

logged-stream

Crates.io Released API docs Master API docs Rust version License Workflow Status

目录

描述

结构

logged-stream 是一个 Rust 库,它提供了一个 LoggedStream 结构,可以用于包装实现 std::io::Writestd::io::Read 特性或它们的异步等价物来自 tokio 库的底层 IO 对象,以启用对所有读写操作、错误和销毁的记录。

LoggedStream 结构由四个部分组成

  • 底层 IO 对象,必须实现 std::io::Writestd::io::Read 特性或它们的异步等价物来自 tokio 库:tokio::io::AsyncReadtokio::io::AsyncWrite
  • 缓冲区格式化部分,必须实现本库提供的 BufferFormatter 特性。LoggedStream 这一部分负责显示输入和输出的字节格式。目前,本库提供了以下 BufferFormatter 特性的实现:LowercaseHexadecimalFormatterUppercaseHexadecimalFormatterDecimalFormatterBinaryFormatterOctalFormatter。此外,BufferFormatter 是一个公开的特性,您可以自由地构建自己的实现。
  • 过滤部分,必须实现本库提供的 RecordFilter 特性。LoggedStream 这一部分负责日志记录的过滤。目前,本库提供了以下 RecordFilter 特性的实现:DefaultFilter(接受所有日志记录)和 RecordKindFilter(接受在构造期间指定的类型的日志)。此外,RecordFilter 是一个公开的特性,您可以自由地构建自己的实现。
  • 日志部分,必须实现本库提供的 Logger 特性。LoggedStream 这一部分负责对构造、格式化和过滤后的日志记录进行进一步的操作。例如,可以将它们输出到控制台、写入文件、写入数据库、写入内存以供进一步使用或通过通道发送。目前,本库提供了以下 Logger 特性的实现:ConsoleLoggerMemoryStorageLoggerChannelLoggerFileLogger。此外,Logger 是一个公开的特性,您可以自由地构建自己的实现。

用例

  • 网络流量监控
    • 监控并记录服务器或客户端应用中的所有传入和传出网络流量。
    • 适用于调试网络协议、跟踪数据交换和确保安全合规性。
  • I/O 操作调试
    • 记录所有读取和写入操作以诊断文件或网络 I/O 问题。
    • 有助于识别瓶颈、数据损坏和 I/O 操作中的意外行为。
  • 性能分析
    • 通过记录每次读取/写入操作所需的时间来分析 I/O 操作的性能。
    • 有助于识别性能问题并优化 I/O 密集型应用程序。
  • 数据库活动记录
    • 记录与数据库的所有交互,包括查询、更新和事务详情。
    • 有助于数据库性能调整、调试查询问题以及维护审计日志。
  • 代理服务器
    • 在代理服务器中实现日志记录以监控和记录所有转发的流量。
    • 适用于调试代理行为和确保正确的数据路由。

使用方法

要使用 logged-stream,请将以下行添加到您的 Cargo.toml

[dependencies]
logged-stream = "0.4"

或运行以下 Cargo 命令到您的项目目录中

$ cargo add [email protected]

示例

这是一个使用 LoggedStream 结构的简单使用示例,其中使用 std::net::TcpStream 作为底层 IO 对象,连接到某个 echo-server,小写十六进制格式化器,默认过滤器和控制台记录器。

fn main() {
    env::set_var("RUST_LOG", "debug");
    env_logger::init();

    let mut client = LoggedStream::new(
        net::TcpStream::connect("127.0.0.1:8080").unwrap(),
        LowercaseHexadecimalFormatter::new(None),
        DefaultFilter::default(),
        ConsoleLogger::new_unchecked("debug"),
    );

    let send = [0x01, 0x02, 0x03, 0x04];
    client.write_all(&send).unwrap();
    let mut response = [0u8; 4];
    client.read_exact(&mut response).unwrap();

    let send = [0x05, 0x06, 0x07, 0x08];
    client.write_all(&send).unwrap();
    let mut response = [0u8; 4];
    client.read_exact(&mut response).unwrap();

    let send = [0x09, 0x0a, 0x0b, 0x0c];
    client.write_all(&send).unwrap();
    let mut response = [0u8; 4];
    client.read_exact(&mut response).unwrap();

    let send = [0x01, 0x02, 0x03, 0x04];
    client.write_all(&send).unwrap();
    let mut response = [0u8; 4];
    client.read_exact(&mut response).unwrap();
}

输出到控制台

[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] > 01:02:03:04
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] < 01:02:03:04
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] > 05:06:07:08
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] < 05:06:07:08
[2023-04-18T08:18:45.895Z DEBUG logged_stream::logger] > 09:0a:0b:0c
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] < 09:0a:0b:0c
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] > 01:02:03:04
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] < 01:02:03:04
[2023-04-18T08:18:45.896Z DEBUG logged_stream::logger] x Deallocated.

此示例的完整版本可以在这里找到。

相同的示例,但使用异步 API 重新编写,可以在这里找到。

许可

许可证为以下之一

由您选择。

贡献

除非您明确表示,否则根据Apache-2.0许可协议定义的,您有意提交并包含在作品中的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

约3.5–5MB
约78K SLoC