我正在使用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中,因此其他子系统也将没有机会关闭。

最佳答案

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

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这样的(可选/可配置)功能,但是尚未计划将其包含在即将发布的版本中。

07-24 20:39