关闭/释放日志+ log4rs 记录器,以便可以在新的 PyO3 调用中重新配置它?

问题描述 投票:0回答:1

我正在使用板条箱

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 rust configuration pyo3
1个回答
0
投票

太棒了!!!

我改变如下:

// logging::configure_logging().expect("logging configure problem");
match logging::configure_logging() {
    Ok(()) => (),
    Err(e) => {
        println!("error was {e}");
    }
}
info!("Starting...");

...第二次调用此模块找到现有的日志设置并记录“正在启动...”!请注意,错误消息是“在日志记录系统已初始化后尝试设置记录器”。

© www.soinside.com 2019 - 2024. All rights reserved.