#log #udp #key-value #log-level #kv #logging #value

udp-logger-rs

为 log 的 kv-unstable 后端和 UDP 套接字日志提供日志宏

5 个版本

0.1.4 2021年8月24日
0.1.3 2021年8月20日
0.1.2 2021年8月17日
0.1.1 2021年8月9日
0.1.0 2021年8月9日

#809 in 文本处理

MIT/Apache

28KB
395

udp-logger-rs

crates.io version build status downloads docs.rs docs

为 log 的 kv-unstable 后端提供日志宏。

动机

我想在我的结构体中构建键值对上下文,并在 impl fn 中记录日志。除此之外,我还想将日志记录的责任与日志文件管理以及任何相关的业务逻辑分开。

考虑一个在相同主机上运行多个容器的架构。一个是服务器,另一个是日志处理器。通过这种分离,服务器执行日志记录并免受该日志处理的干扰。同时,日志处理器确定如何处理日志消息,这本身可能相当复杂。

此外,我决定可能需要将日志级别映射到源端口和/或目标端口。这里的想法是,这可能简化了处理,因为源端口和/或目标端口暗示了日志级别。

最后,通过分离它们,服务器开发可以使用与生产不同的日志处理器,而生产日志处理可以在不依赖于服务器的情况下进行测试。

示例

use udp_logger_rs::info;

fn main() {
    udp_logger_rs::UdpLogger::default().init().unwrap();
    info!("hello");
    info!("hello",);
    info!("hello {}", "cats");
    info!("hello {}", "cats",);
    let ctx: Vec<(String, String)> = vec![
        ("cat_1".into(), "chashu".into()),
        ("cat_2".into(), "nori".into()),
    ];
    info!(kvs: &ctx, "hello {}", "cats",);
}

UDP 客户端可以是这样的简单

use smol::Async;
use std::io::{self};
use std::net::UdpSocket;

fn main() -> io::Result<()> {
    let _result = futures_lite::future::block_on(async {
        let socket = Async::<UdpSocket>::bind(([127, 0, 0, 1], 4010))?;
        let mut buf = [0u8; 1024 * 32];
        loop {
            let (len, addr) = socket.recv_from(&mut buf).await?;
            let logmsg = std::str::from_utf8(&buf[..len]).expect("invalid utf8");
            println!("{} from={}", logmsg, addr);
        }
        // This hack of unreachable code cements the return type
        #[allow(unreachable_code)]
        io::Result::Ok(())
    });
    Ok(())
}

安装

$ cargo add udp-logger-rs

安全性

此 crate 使用 #![forbid(unsafe_code)] 来确保所有内容都使用 100% 安全的 Rust 实现。

贡献

想要加入我们?查看我们的 "贡献" 指南 并查看一些这些问题

参考文献

无。

许可证

MITApache-2.0

依赖项

~1.5MB
~23K SLoC