【Rust 日报】2021-09-12 Rust的Logging 推荐

时间:2021-09-13来源:栏目:网络营销

Rust的日志记录建议由Reddit讨论整理:目前对信任登录的推荐是什么?铁锈.简介:除了标准,还有很多选择:等。最佳做法是什么?来自Koxiaet的回复:与日志相关的板条箱通常有两种:日志接口...

Rust的日志记录建议

由Reddit讨论整理:目前对信任登录的推荐是什么?铁锈.

简介:除了标准,还有很多选择:等。最佳做法是什么?

来自Koxiaet的回复:与日志相关的板条箱通常有两种:日志接口和日志消费者。该接口提供了一个函数,当您想要记录一些东西时可以调用该函数,消费者在某个地方(stderr或file)处理结构化日志数据的格式化。两个主要接口是和。后者更强大,因为它支持结构化日志记录,但前者更常见。还有另一个结构化日志接口slog,它比旧,但使用较少。每个日志接口都有自己的生态系统,可以根据自己的需要进行选择。如果您正在编写一个库,这是一个很好的选择,因为所有的日志记录接口都与它兼容。但是如果您真的需要结构化日志记录,您可以使用它来代替,这取决于您的需求,例如您是需要写入文件还是只写入终端。

其他网友推荐:

文件日志:一个灵活的rust程序日志记录器,可以写入stderr或日志文件。(摘自cfsamson)

tracing_log-Rust的界面,当有多条交错的日志消息同时操作时特别方便。您可以根据某些属性对它们进行分组,并分别查看它们。(来自二级变态)

Estk/log4rs :a高度可配置的日志框架对于rust来说,log4rs是一个高度可配置的日志框架,它是由Java Logback和log4j库建模的。Yaml配置,sdout和file,带有文件大小限制选项,也可以配置不同级别的日志。(来自tms102)

tracing-appender-grapes . io : rust package registry是推荐者已知的唯一线程外日志记录解决方案,它不仅适用于异步应用程序。(来自Pand9)

Daboross/fern :简单、高效的日志记录来获取信任,就像Python和JS一样。(摘自《美容师》)

生锈满堆

本文是来自:全栈Rust-Blog的博客翻译。

一年前,我喜欢的语言如下:

Python用于高级代码的快速原型开发,或者用于需要第三方功能的代码。

C/C用于长期低水平项目。

当时只听说过Rust,简单用了一下。我的经验来自于用Rust编写一个小工具来处理大文件(4GB)并从中挖掘一些统计信息。我用一个库把文件映射到内存,滨瑞按顺序分析。有一些很酷的概念,比如编译器在内存映射被取消映射后静态地强制它不可访问——如果你不小心,这个错误可能会在c中出现。

但当时并没有真正吸引我,因为只是有点新奇。当我给pdblister添加了一个新功能来并行获取数千个PDB文件时,这个技巧就出现了。由于GIL,这在CPython中几乎是不可能的,但在C/C中避免并行错误是极其困难的。然而,Rust使这变得容易。我添加了tokio驱动的异步,用于生成下载PDB的新任务,并修复了编译器报告的错误。它可以正常工作。Rust编译器输出一个二进制文件,它可以在任何地方运行,而不依赖于运行时。

取代 Python

这是第一点。作为中长期工具语言,Rust是Python的优秀替代品。Python的优势在于其庞大的库和生态系统,可以通过pip直接获取。如果你想用API快速原型化交互,你可以想用多久就用多久。Rust也是如此,只要输入就可以在代码中使用。

但是在进入更长的生命周期时,Python就显现出了弊端,那就是程序的依赖性,用户需要后期使用。此外,Python由于其弱类型和错误处理能力(与Rust相比)而变得更加低劣。在这一点上,我可以用Rust比用Python更快地编写原型工具,并且我可以自信地知道,我的工具比同等的Python更容易维护,寿命也更长。但是,对于短期工具来说,Python可能仍然更好,因为它不需要启动一个项目来获得VSCode中的intellisense支持。Rust的货物脚本接近将Rust推向脚本语言领域,但不幸的是,我还没有在VSCode中找到与之集成的插件。

取代 C

Rust也是c的直接替代品,c在各个方面都更好,可以与遗留c代码进行本机互操作,实现增量替换。Rust最大的改进是生态系统:如上所述,Rust生态系统中现有的库很容易使用。如果你从来没有用过C,那你就是幸运的。事实上,在C语言中使用高级函数的最好方法是自己编写。

生态系统是支离破碎和脆弱的。是ABI还是建造了这个系统?

有一致的标准:

由于缺乏 ABI 一致性,你不能跨平台或操作系统使用相同的二进制文件。 所以你必须从源代码构建。

由于缺乏一致的构建系统,你不能简单地和应用程序一起构建 C 库,必须修补或重写要使其与你的库兼容的库的构建系统。

C 库很少跨平台兼容,因为它们缺乏可以依赖的共享抽象。

然后还有 Rust 最特色的安全改进――我就不展开了。但根据我的经验 - 安全性在很大程度上是一种工具,可以让第三方库开发人员更容易强迫我正确使用他们的库,这是 C 库不能做的事情。

全栈 Rust

总而言之,在过去的一年中,我一直在堆栈的所有部分使用 Rust,而我之前使用过其他语言。我已经使用 Rust 来实现引导加载程序:xenia-project/xell-rs: Xell Bootloader, rewritten in Rust because _(ツ)_/ ,我已经使用它通过 pdblister 和 panamax 中的高级 HTTP/HTTPS 和其他技术来镜像文件。我利用并贡献了优秀的 gdbstub 库,用于控制由自定义 VMM 运行的 VM。这些项目都是在堆栈的不同级别完成的,而 Rust 非常适合所有级别。 我已经开始在我的个人项目中专门使用 Rust,并在适合的时候推动它在我的工作中使用。

tagged_cell:快速、可初始化和线程安全的静态变量

通过 和 类型实现,为了安全操作, 的每个实例都必须是唯一的。然后必须通过 初始化 ,它使用用户提供的函数或闭包初始化底层数据,然后返回一个特殊的零大小的 用于访问 Cell 的数据。为了确保每个单元格使用唯一的标签类型, 提供宏。该宏根据变量的名称创建一个新的标记类型,并将其应用到声明中。

usetagged_cell::tagged_cell;

tagged_cell!{

staticBAR: TaggedCell = TaggedCell::new();

}

lettag = BAR.init(||vec![,10,20]);

letvec = BAR.get(tag);

assert_eq!(vec[2],20);

为了允许跨线程使用,只有第一次调用 才会初始化 Cell 的数据。所有未来的 调用都将返回一个新标签。未确定哪个线程将初始化 Cell 的数据。

usestd::thread;

usetagged_cell::tagged_cell;

tagged_cell!{

staticTABLE: TaggedCell = TaggedCell::new();

}

thread::spawn(move|| {

lettag = TABLE.init(||vec![,10,20]);

lettable = TABLE.get(tag);

assert_eq!(table[2],20);

});

thread::spawn(move|| {

lettag = TABLE.init(||vec![,10,20]);

lettable = TABLE.get(tag);

assert_eq!(table[1],10);

});

GitHub:Dasch0/tagged_cell: Fast, initializable, and thread safe static variables

ukanren-rs: Kanren 的 Rust 实现

Kanren 是一种轻量级关系编程语言

原始的 Schema 实现在这里:jasonhemann/microKanren: The implementation of microKanren, a featherweight relational programming language

相关参考:miniKanren.org

useukanren::*;

fn appendo(first: Value, second: Value, out: Value) -> BoxedGoal {

eq(&first, &())

.and(eq(&second, &out))

.or(fresh(move |a: Value, d: Value, res: Value| {

eq(&(a.clone(), d.clone()), &first)

.and(eq(&(a.clone(), res.clone()), &out))

.and(appendo(d.clone(), second.clone(), res))

}))

.boxed()

}

let goal = fresh(|x,y| appendo(x,y, [1,2,3,4,5].to_value()));

assert_eq!(

goal.run(2).collect::(),

vec![

state![(), [1,2,3,4,5]],

state![[1], [2,3,4,5]],

state![[1,2], [3,4,5]],

state![[1,2,3], [4,5]],

state![[1,2,3,4], [5]],

state![[1,2,3,4,5], ()],

],

);

GitHub:ekzhang/ukanren-rs: Rust implementation of Kanren, a featherweight relational programming language.

rust-counter-strings:快速定位字符串位置

字符串中的每个星号都出现在由紧接前面的数字指定的位置。因此,29 后面的星号是该字符串中的第 29 个字符。可以在任何地方砍掉字符串的末尾,并且确切地知道它在哪里被剪掉了。比如不用数就知道字符串 正好有 18 个字符。当处理 50 万个字符时会比较省事。

$./rust-counter-strings 50

#2*4*6*8*11*14*17*20*23*26*29*32*35*38*41*44*47*50*

这就是个小工具,代码也只有几十行。

GitHub:thomaschaplin/rust-counter-strings: Generate self-describing strings of a given length to help aid software testing

From 日报小组 长琴

社区学习交流平台订阅:

1.本站部分来源于互联网用户自主整合上传,如有侵权,请联系我们删除;

2.文章内容并不代表本站的观点或立场,如有关于文章内容,版权或其它问题请联系删除;

3.本文地址:https://jiatu888.com/wlyx/83608.html

rust logging 接口

最新文章

网站介绍

本站部分内容收集于互联网,如有侵犯贵司(个人)版权,请联系本站删除。

Copyright@2018-2021 www.jiatu888.com 嘉图网 All Rights Reserved 粤ICP备20051635号 网站地图 tag列表

嘉图网