Как перехватить стандартный вывод ошибок из службы Windows? - PullRequest
6 голосов
/ 06 мая 2009

У меня есть приложение, которое использует библиотеку Mozilla LDAP. Мы диагностируем проблему, связанную с тем, что библиотеке LDAP не удается установить соединение с сервером. Я пытаюсь получить дополнительную информацию из библиотеки LDAP, добавив отладочную версию библиотеки в приложение и включив отладку с помощью ldap_set_opt. К сожалению, я думаю, что библиотека отладки отправляет строки отладки со стандартной ошибкой.

Пока я снова работаю над перекомпиляцией клиентской библиотеки LDAP, надеюсь, включив опцию, которая заставляет ее вызывать OutputDebugString вместо потоковой передачи в stderr, хорошим решением будет захват вывода stderr в файл. Приложение работает как служба Windows.

Кто-нибудь знает, как я могу перенаправить stderr в файл для приложения, работающего в качестве службы?

редактировать

Я надеюсь, что мне больше не придется изменять исходный код службы, чем у меня уже есть. Варианты в конфигурации сервиса были бы идеальными.

Ответы [ 2 ]

5 голосов
/ 06 мая 2009

Можете ли вы попробовать вручную перенаправить stderr?

    FILE* stderr_redirect = freopen( "C:/stderr.log", "w", stderr );

    // Code that writes to stderr

    fclose( stderr_redirect );

Edit:

Нет способа перенаправить stdout или stderr для службы, кроме как обрабатывать эти потоки внутри службы самостоятельно. Некоторые сервисы предоставляют возможность перенаправить эти сообщения в файл. Вы можете временно перенаправить эти потоки или добавить опцию к своему сервису, чтобы сделать его настраиваемым при следующей проблеме.

5 голосов
/ 06 мая 2009

Если вы изменяете код службы, вы можете позвонить SetStdHandle в свой ServiceMain:

SetStdHandle(STD_ERROR_HANDLE, logFileHandle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...