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 在 调试 中排名
198 每月下载次数
用于 2 代码包
59KB
961 行
logged-stream
描述
结构
logged-stream
是一个 Rust 库,它提供了一个 LoggedStream
结构,可以用于包装实现 std::io::Write
和 std::io::Read
特性或它们的异步等价物来自 tokio
库的底层 IO 对象,以启用对所有读写操作、错误和销毁的记录。
LoggedStream
结构由四个部分组成
- 底层 IO 对象,必须实现
std::io::Write
和std::io::Read
特性或它们的异步等价物来自tokio
库:tokio::io::AsyncRead
和tokio::io::AsyncWrite
。 - 缓冲区格式化部分,必须实现本库提供的
BufferFormatter
特性。LoggedStream
这一部分负责显示输入和输出的字节格式。目前,本库提供了以下BufferFormatter
特性的实现:LowercaseHexadecimalFormatter
、UppercaseHexadecimalFormatter
、DecimalFormatter
、BinaryFormatter
和OctalFormatter
。此外,BufferFormatter
是一个公开的特性,您可以自由地构建自己的实现。 - 过滤部分,必须实现本库提供的
RecordFilter
特性。LoggedStream
这一部分负责日志记录的过滤。目前,本库提供了以下RecordFilter
特性的实现:DefaultFilter
(接受所有日志记录)和RecordKindFilter
(接受在构造期间指定的类型的日志)。此外,RecordFilter
是一个公开的特性,您可以自由地构建自己的实现。 - 日志部分,必须实现本库提供的
Logger
特性。LoggedStream
这一部分负责对构造、格式化和过滤后的日志记录进行进一步的操作。例如,可以将它们输出到控制台、写入文件、写入数据库、写入内存以供进一步使用或通过通道发送。目前,本库提供了以下Logger
特性的实现:ConsoleLogger
、MemoryStorageLogger
、ChannelLogger
和FileLogger
。此外,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 License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可协议(《LICENSE-MIT》或https://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示,否则根据Apache-2.0许可协议定义的,您有意提交并包含在作品中的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。
依赖项
约3.5–5MB
约78K SLoC