提问人:mike rodent 提问时间:9/19/2023 最后编辑:mike rodent 更新时间:9/20/2023 访问量:60
关闭/释放日志 + log4rs 记录器,以便可以在新的 PyO3 调用中重新配置它?
Shut down/release log + log4rs logger so it can be reconfigured in a new PyO3 call?
问:
我正在使用板条箱和 .log
log4rs
我正在尝试一种情况,即我的 Python 代码(我使用的是 PyO3)可以再次调用所涉及的启用 Rust Python 的函数,以重新运行内容。
我有一个文件 logging.rs 与配置日志记录的 lib.rs 位于同一目录中。Python 第二次调用 Rust 函数时 Rust 会崩溃,可能是因为日志记录中使用的某些资源未发布。2 秒日志中的一个文件,实际上执行滚动日志记录 (RollingFileAppender)。这可能是相关的。configure_logging
Appender
我发现有一个方法.这可能(但可能没有)足以关闭事情。为了最初设置 log4rs 记录器,我这样做了,并构建了配置对象:RollingFileAppender
flush
log4rs::init_config(config)?;
我尝试在函数的第一次 Rust 运行结束时调用该对象。没有变化。我还尝试获取回溯跟踪,但这似乎没有显示 logging.rs 文件中的哪一行导致了问题:flush
logger()
stack backtrace:
0: std::panicking::begin_panic_handler
at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library\std\src\panicking.rs:578
1: core::panicking::panic_fmt
at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library\core\src\panicking.rs:67
2: core::result::unwrap_failed
at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library\core\src\result.rs:1687
3: populate_index::my_extension
4: std::panicking::try
5: populate_index::my_extension
...
也许那里的信息减少了,因为我将其作为 PyO3 模块运行?
我什至愿意接受这样的想法,即一旦配置,日志记录将在我的第一个 PyO3 调用结束后仍然存在?因此,在第二次调用时,我不应该进行配置,并以某种方式尝试并捎带到先前设置的配置。这似乎不太可能,因为我没有为日志记录在其自己的线程或进程中运行做出任何规定。
确认:
因此,在运行了一次此 PyO3 模块,但没有终止 Python 应用程序后,我去检查了当前的日志文件。我能够打开它,但无法编辑它:“共享违规”。这似乎表明,在离开 PyO3 模块后,所涉及的线程没有放开文件。然而,我假设(或)涉及某种机制来释放资源,例如如果只是运行一个普通的 Rust 模块,则在终止时释放文件......?lib4rs
log
我尝试过的东西
pub fn shut_down_logging(){
drop(logger());
}
...在退出 Rust Python 可调用函数之前调用。不起作用。
答:
了不起!!!
我更改如下:
// logging::configure_logging().expect("logging configure problem");
match logging::configure_logging() {
Ok(()) => (),
Err(e) => {
println!("error was {e}");
}
}
info!("Starting...");
...对此模块的第二次调用将找到现有的日志设置和“正在启动...”被记录!注意,错误消息是“在日志记录系统已初始化后尝试设置记录器”。
评论
log4js::init_config()
毫无疑问,它调用了 log::set_logger
,它说“此函数在程序的生命周期中只能调用一次。因此,是的,您应该避免在后续调用中重新配置记录器。static
当 Rust 库加载到 Python 程序中时,会分配变量,并且不会在每次调用时重新创建。它们会一直持续到整个程序结束(或者如果你让 Python 卸载 Rust 库,但我不知道该怎么做)。