2015-06-26 2 views
2

Я использую Poco 1.6.0 и структуру Util::ServerApplication.Poco - отказ openApplication log вызывает отказ в работе подсистемы

В начале 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(). Код Application::run() в Poco's Application.cpp затем звонит Application::uninitialize().

Реализация Application::uninitialize() выполняет итерацию через каждую подсистему, выполняющую эту подсистему uninitialize().

Но один из них - LogFile::uninitialize(), в результате чего регистрируется следующее сообщение: Uninitializing subsystem: Logging Subsystem.

При попытке зарегистрировать это сообщение возникает исключение, так как файл журнала не может быть открыт (по той же причине, что и раньше). Это исключение поймано где-то в коде Poco, и он пытается зарегистрировать ошибку, которая вызывает исключение, и что она, наконец, завершает работу программы.

Как мне решить эту проблему? Например. можно ли подсказать подсистеме регистрации, чтобы не было никаких исключений?

Кажется, что и большая проблема; если какая-либо подсистема uninitialize() выбрасывает, это приведет к тому, что выполнение оставит цикл завершения работы подсистемы в Application.cpp, поэтому другие подсистемы также не смогут отключиться.

+0

В настоящее время работает над ним, регистрируя стартовую строку, видя, что вызывается «FileException», а затем вызывает «setChannel» с консольным каналом, так что 'chanFile' больше не привязан, но он чувствует себя взломанным и также не адресует проблема с остановкой потенциальной подсистемы –

ответ

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() цикла будет через подсистемы и итерации как отладки сообщения журнала - идея поймать проблемы перед выпуском ,

ОБНОВЛЕНИЕ: как указано в комментариях, каталог может существовать во время проверки, но может не существовать (или не быть доступным) после этого, когда ведение журнала фактически происходит. В Poco нет ничего, что защищает пользователя от этого; поэтому вам нужно будет убедиться, что каталог существует и доступен на протяжении всего жизненного цикла FileChannel, используя его. Я не нашел это препятствием на практике. Я обнаружил, что первоначальное небытие каталога является раздражающей проблемой, и есть proposal for addition такой (необязательной/настраиваемой) функции, но она еще не запланирована для включения в предстоящие выпуски.

+1

Это может привести к [времени проверки на ошибку времени использования] (https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use). Если этот путь удален между проверкой 'exists()' и фактической попыткой регистрации, то проблема все еще существует. Этот же тип ошибок является причиной того, что [страницы руководства Linux говорят, что никогда не используют 'mktemp'] (http://man7.org/linux/man-pages/man3/mktemp.3.html#BUGS). – Cornstalks

+0

Poco Logger ожидает, что каталог будет создан при создании файлов журнала. Чтобы быть на 100% уверенным, пользователь может предпринять необходимые шаги (право собственности, разрешения, блокировка и т. Д.). Если вы думаете, что это должно быть обеспечено каркасом, отправьте запрос на растяжение, и мы рассмотрим его. – Alex

+0

У меня нет времени или интереса, чтобы отправить запрос на тяну.Скорее, я замечаю, что этот ответ действительно не решает вопрос/вопрос OP. Это может быть «достаточно хорошо» для некоторых людей, но я думаю, что стоит отметить, что это не 100% исправляет проблему. – Cornstalks

Смежные вопросы