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