Poco - openApplication日志失败导致子系统关闭失败

时间:2015-06-26 05:53:53

标签: c++ poco-libraries

我正在使用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::run()中的Application.cpp代码会调用Application::uninitialize()

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

在设置文件通道之前,应确保路径存在,例如:

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()将循环遍历子系统并将迭代记录为 debug 消息 - 想法是在发布之前捕获问题。

更新:如评论中所指出的,目录可能在检查时存在,但在记录实际发生后可能不存在(或不可访问)。 Poco中没有任何东西可以保护用户免受攻击;因此,您必须确保该目录存在,并且可以在FileChannel的整个生命周期内使用它。我没有发现这是实践中的障碍。我确实发现目录的初始不存在是一个恼人的问题,并且有proposal for addition这样的(可选/可配置的)功能,但它还没有被安排包含在即将发布的版本中。