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

Shut down/release log + log4rs logger so it can be reconfigured in a new PyO3 call?

提问人:mike rodent 提问时间:9/19/2023 最后编辑:mike rodent 更新时间:9/20/2023 访问量:60

问:

我正在使用板条箱和 .loglog4rs

我正在尝试一种情况,即我的 Python 代码(我使用的是 PyO3)可以再次调用所涉及的启用 Rust Python 的函数,以重新运行内容。

我有一个文件 logging.rs 与配置日志记录的 lib.rs 位于同一目录中。Python 第二次调用 Rust 函数时 Rust 会崩溃,可能是因为日志记录中使用的某些资源未发布。2 秒日志中的一个文件,实际上执行滚动日志记录 (RollingFileAppender)。这可能是相关的。configure_loggingAppender

我发现有一个方法.这可能(但可能没有)足以关闭事情。为了最初设置 log4rs 记录器,我这样做了,并构建了配置对象:RollingFileAppenderflush

log4rs::init_config(config)?;

我尝试在函数的第一次 Rust 运行结束时调用该对象。没有变化。我还尝试获取回溯跟踪,但这似乎没有显示 logging.rs 文件中的哪一行导致了问题:flushlogger()

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 模块,则在终止时释放文件......?
lib4rslog

我尝试过的东西

pub fn shut_down_logging(){
    drop(logger());
}

...在退出 Rust Python 可调用函数之前调用。不起作用。

伐木 配置 PYO3型

评论

0赞 kmdreko 9/20/2023
log4js::init_config()毫无疑问,它调用了 log::set_logger,它说“此函数在程序的生命周期中只能调用一次。因此,是的,您应该避免在后续调用中重新配置记录器。
0赞 mike rodent 9/20/2023
是的,我看到了。这在非 PyO3 上下文中是有道理的。我的问题是特定于 PyO3 上下文的。某些东西仍然挂在文件句柄(或其他任何东西)上的事实向我表明,这个线程是不允许死亡的。但是,如何在第二次 Rust 模块调用时仍然可以访问记录器设置呢?
0赞 kmdreko 9/20/2023
static当 Rust 库加载到 Python 程序中时,会分配变量,并且不会在每次调用时重新创建。它们会一直持续到整个程序结束(或者如果你让 Python 卸载 Rust 库,但我不知道该怎么做)。
0赞 mike rodent 9/20/2023
啊,有用的技术信息。我假设 log/log4rs 设置必须涉及一个或多个静态变量。

答:

0赞 mike rodent 9/20/2023 #1

了不起!!!

我更改如下:

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

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