gpt4 book ai didi

c++ - poco-打开应用日志失败导致子系统关闭失败

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:32 24 4
gpt4 key购买 nike

我正在使用 Poco 1.6.0 和 Util::ServerApplication 结构。

在我的主类中 int main(const ArgVec& args) 的开头,我将所有日志记录重定向到一个文件:

Poco::AutoPtr<Poco::FileChannel> chanFile = new Poco::FileChannel;
chanFile->setProperty("path", "C:\\doesnotexist\\file.log");
Poco::Util::Application::instance().logger().setChannel(chanFile);

如果无法打开日志文件,则会引发异常,我会捕获该异常,并从 main() 返回错误代码。 Poco 的 Application.cpp 中的 Application::run() 代码然后调用 Application::uninitialize()

Application::uninitialize() 的实现遍历每个执行该子系统的 uninitialize() 的子系统。

但其中之一是 LogFile::uninitialize(),它会导致记录以下消息:Uninitializing subsystem: Logging Subsystem

当它尝试记录该消息时,由于无法打开日志文件(出于与之前相同的原因)而抛出异常。该异常在 Poco 的代码中的某处被捕获,它尝试记录一个错误,这会导致异常,并且该异常最终会终止程序。

我该如何处理这个问题?例如。是否可以告诉日志子系统不要抛出任何异常?

似乎还有一个更大的问题;如果任何子系统 uninitialize() 抛出,这将导致执行离开 Application.cpp 中的子系统关闭循环,因此其他子系统也没有机会关闭。

最佳答案

在设置文件 channel 之前,请确保该路径存在,例如:

if (Poco::File("C:\\doesnotexist").exists())
{
Poco::AutoPtr<Poco::FileChannel> chanFile = new Poco::FileChannel;
chanFile->setProperty("path", "C:\\doesnotexist\\file.log");
Poco::Util::Application::instance().logger().setChannel(chanFile);
}

Application::unitialize() 将遍历子系统并将迭代记录为调试 消息 - 这个想法是在发布之前发现问题。

更新:正如评论中所指出的,该目录在检查时可能存在,但之后可能不存在(或不可访问),当记录实际发生时。 Poco 中没有任何东西可以保护用户不受此影响;因此,您必须确保该目录存在并且在使用它的 FileChannel 的整个生命周期中都可以访问。我没有发现这在实践中是一个障碍。我确实发现目录最初不存在是一个恼人的问题,并且有一个 proposal for addition此类(可选/可配置)功能的一部分,但尚未计划将其包含在即将发布的版本中。

关于c++ - poco-打开应用日志失败导致子系统关闭失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com