我已经在 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/