我正在使用板条箱
log
和 log4rs
。
我试图让我的 Python 代码(我使用 PyO3)可以再次调用支持 Rust Python 的函数来重新运行。
我在与 lib.rs 相同的目录中有一个文件logging.rs,它配置日志记录。 Python 第二次调用 Rust
configure_logging
函数时,Rust 会发生恐慌,可能是因为日志记录中使用的某些资源未释放。 2 个 Appender
之一记录到文件,实际上执行滚动日志记录 (RollingFileAppender)。这可能是相关的。
我发现
RollingFileAppender
有一个方法flush
。这可能(但可能不足以)足以关闭一切。为了最初设置 log4rs 记录器,我这样做,构建了配置对象:
log4rs::init_config(config)?;
我尝试在函数第一次 Rust 运行结束时在
flush
对象上调用 logger()
。不用找了。我也尝试获取回溯,但这似乎没有显示logging.rs文件中的哪一行导致了问题:
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 模块后,所涉及的线程没有释放该文件。但我认为
lib4rs
(或 log
)涉及某种机制,如果只是运行正常的 Rust 模块,则可以在终止时释放文件等资源...?
我尝试过的东西
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...");
...第二次调用此模块找到现有的日志设置并记录“正在启动...”!请注意,错误消息是“在日志记录系统已初始化后尝试设置记录器”。