#logging #log

proglog

线程安全的进度日志

2个不稳定版本

0.3.0 2022年8月8日
0.2.0 2022年8月5日

#631并发

Download history 34/week @ 2024-03-13 47/week @ 2024-03-20 53/week @ 2024-03-27 56/week @ 2024-04-03 36/week @ 2024-04-10 21/week @ 2024-04-17 102/week @ 2024-04-24 83/week @ 2024-05-01 93/week @ 2024-05-08 113/week @ 2024-05-15 52/week @ 2024-05-22 9/week @ 2024-05-29 34/week @ 2024-06-05 19/week @ 2024-06-12 47/week @ 2024-06-19 28/week @ 2024-06-26

129 每月下载量
2 crates 中使用

Unlicense/MIT

23KB
345

🦫 proglog

Build Status license Version info

文档 Crates.io

这是一个简单、线程安全、基于计数的进度记录器。

概述

proglog 集成到你的现有 log 实现中(即 env_logger),每当它看到 unit 个项目时,就会输出一个日志消息。有两个主要方法,record()record_with(Fn() -> impl Display)record() 简单地增加计数器,当计数器对 unit 取模等于 0 时,将输出日志消息。 record_with(Fn() -> impl Display) 接受一个函数,该函数输出任何实现了Display的任何内容,并将附加到日志消息中。

如何使用此库

添加到您的依赖项中

cargo add proglog

用法

请参阅 rayon 示例

use proglog::ProgLogBuilder;

// Note a `log` backend needs to be globally initialized first
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();

let logger = ProgLogBuilder::new().build();
for i in 0..10_000 {
    logger.record_with(|| format!("Logged item: {}", i));
}

// The logger will flush when it is dropped, writing a final progress message no mater the count.
// Alternatively you can call .flush() or .flush_with().

需要注意的事项

如果 unit 太小,且你的循环太紧密,这将输出很多日志消息,这将像任何日志一样在热循环中减慢你的程序速度。如果 unit 足够大,这应该可以安全地放在热循环中,因为它所做的只是增加一个原子 u64 的更新。

如果您的循环紧凑,unit就很小,并且您正在使用rayon或多线程更新日志信息,那么日志信息可能最终会顺序混乱。提交日志信息到记录器的顺序没有保证。因此,线程A可能会首先遇到第一个unit的断点,而线程B可能会同时遇到第二个点,但是线程B会先提交其日志信息。拥有足够大的unit可以减轻这种情况,但您不应该依赖于这里的日志输出顺序。所做出的权衡是为了增加速度,因此可以将此放入热点循环中,而不是保证输出顺序。

特性

pretty_counts

pretty_counts特性打开了对日志消息中数字进行格式化的功能。将ProgLogBuilder::count_formatter设置为CountFormatterKind之一,数字将相应地格式化。例如,使用CountFormatterKind::Underscore,将100000000格式化为100_000_000

测试

cargo test

直接灵感

  • fgpyo中发现的ProgressLogger
  • fgbio中的ProgressLogger

依赖项

~93KB