rust - 在 log4rs 中动态设置文件路径

标签 rust

我已经在 Rust subreddit 上问过这个问题,但也想在这里问。

我正在使用 log4rs crate 并想找到一种方法来生成多个日志文件。我使用创建的 file appender 设置了一个 YAML 文件,并试图让路径是唯一的,这样它就不必附加或截断原始文件。

appenders:
  file:
    kind: file
    path: "log/{h({d(%H:%M:%S)})}.log"

但这不起作用并给我这个错误:

log4rs:反序列化附加文件时出错:文件名、目录名或卷标语法不正确。 (操作系统错误 123)

我知道 log4rs 有办法做到 patterns但它似乎并不专门用于 path 参数。

我还看到了另一个名为 log4rs_routing_appender 的箱子这看起来很有希望,但我不知道我是否需要使用它。

最后,我希望能够以非编程方式执行此操作(即仅使用一个 YAML 文件),并且我想知道在 log4rs 中是否可行

非常感谢!

最佳答案

我不相信使用 yaml 配置可以实现您想要的。然而,log4rs 提供了另一种构建它的记录器的方法,即通过 log4rs::Config::builder():

// get current date
let date = chrono::Utc::now();

// create log file appender
let logfile = FileAppender::builder()
  .encoder(Box::new(PatternEncoder::default()))
  // set the file name based on the current date
  .build(format!("log/{}.log", date))
  .unwrap();

// add the logfile appender to the config
let config = Config::builder()
  .appender(Appender::builder().build("logfile", Box::new(logfile)))
  .build(Root::builder().appender("logfile").build(LevelFilter::Info))
  .unwrap();

// init log4rs
log4rs::init_config(config).unwrap();
log::info!("Hello, world!");
Ok(())

我了解到您想使用 YAML 配置。但是,正如您所说,模式似乎不适用于路径变量,因为写入失败:

path:
  pattern: "log/requests-{d}-{m}-{n}.log"

另一种选择是使用 serde_yaml ( which log4rs actually uses internally ) 手动解析 yaml,并使用正则表达式解析自定义变量。

关于rust - 在 log4rs 中动态设置文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64393344/

相关文章:

rust - 返回实现多个特征的对象——装饰器模式

vector - 无法将 &u8 与 u8 进行比较

HashSet 作为其他 HashSet 的键

rust - 如何调用返回多种类型的不同函数指针的 C 函数?

visual-studio-code - 如何在 Visual Studio Code 的 Rust 项目中查看外部库的源代码?

command-line - 如何访问 Rust 中的命令行参数?

rust - 使用 .unwrap() 应该被视为不好的做法吗?

rust - 递归结构的最佳实现是什么?

parsing - Rust 编译器如何标记泛型中的 '>' 与 '>>'?

api - 使用 JSON 作为内容操作结果类型