4个版本

0.1.3 2024年7月18日
0.1.2 2024年7月18日
0.1.1 2024年7月16日
0.1.0 2024年7月16日

#120 in 压缩

Download history 223/week @ 2024-07-13 35/week @ 2024-07-20 27/week @ 2024-07-27

每月285次下载

GPL-3.0许可证

34KB
705

GitHub Actions Workflow Status Crates.io Version docs.rs

Firo

firo是一个简单的crate,受std::fs::File启发,提供必要的API来实现旋转文件。

它目前支持

  • 基于时间的旋转触发
  • 基于大小的旋转触发
  • 文件压缩(在旋转时进行)
  • 最大大小限制,如果所有文件的大小总和超过限制,将开始删除最旧的文件
  • 透明地读取旋转文件

使用示例

基本

use firo::{File, OpenOptions, Trigger, Compression};
use std::io::Write;
use std::time::Duration;

let td = tempfile::tempdir().unwrap();

// we initialize a rotating file options
let mut f = File::options()
    // file will rotate every hours
    .trigger(Duration::from_secs(3600).into())
    // finally create the file
    .create_append(td.path().join("test.log")).unwrap();

// one can use File as std::fs::File
for _ in 0..1000 {
    writeln!(f, "rotating every hour").unwrap();
}

高级

基于大小旋转文件,当总大小达到给定阈值时启用压缩和删除旧文件。

use firo::{File, OpenOptions, Trigger, Compression};
use huby::ByteSize;
use tempfile;
use std::io::{BufReader, BufRead, Write};

let td = tempfile::tempdir().unwrap();
let p = td.path().join("test.log");
// we initialize a rotating file options
let opts = File::options()
    // file will rotate when reaching 1 KB
    .trigger(ByteSize::from_kb(1).into())
    // gzip compression is enabled (at rotation time)
    .compression(Compression::Gzip)
    // we start deleting oldest file when total size > 1 GB
    .max_size(ByteSize::from_gb(1));

let mut f = opts
    // finally create the file
    .create_append(&p).unwrap();

// one can use File as std::fs::File
for i in 0..100_000 {
    writeln!(f, "{i}").unwrap();
}

// make sure there are no pending writes
f.sync().unwrap();

// one can also read a rotating file
let f = opts.open(p).unwrap();
// we check that file is actually made of several
// files on disk (just for the demo)
assert!(f.files_sorted_by_index().unwrap().len() > 1);
let reader = BufReader::new(f);
let mut lines = reader.lines();

for i in 0..100_000 {
    let line = lines.next().unwrap().unwrap();
    let cmp = line.parse::<u32>().unwrap();
    assert_eq!(i, cmp);
}

依赖关系

~2–11MB
~124K SLoC