Страницы

Поиск по вопросам

пятница, 30 ноября 2018 г.

Как правильно логировать работу приложения?

Иногда хочется знать, что происходит с приложением в релизном варианте в боевом режиме под руками безжалостного пользователя... Возникают ошибки в приложении, а польз ователь ничего не может сказать, что он нажимал, куда мышкой водил, и какой текст набирал - как всегда оно само сломалось. Возникает вопрос, как правильно построить логику программы, чтобы было удобно логировать ее работу, а также удобно внедрять в готовые продукты. Сам экспериментирую на небольших программных продуктах (до 3000 строчек функционального кода на C#, но на мой взгляд пока не нашел идеального варианта). Из того что пробовал: Создание класса, со свойствами (для управления уровнем логирования, предварительных настроек). Класс инициализируется при старте программы, после из основного модуля ему передаются настройки, вызывается из основного модуля функция записи в лог. Сам класс решает писать ему только в свой список, в контрол, который ему передали, в файл. Нужно ли вообще писать это сообщение в зависимости от уровня логирования. ну и прочие фишечки рюшечки. недостаток того, что в каждой функции, которую хочется залогировать, приходится явно вызывать этот класс, требуется точно быть уверенным что он создан (ну это обходится созданием функции записи в лог, с проверкой созданного класса логирования и отловлей эксепшенов от него). Недостаточно глубоко в классы можно залезть. Создание класса приемерно такого же, за тем исключением, что запись вызывается путем отловли пользовательского сообщения на уровне приложения. Проблемы примерно такие же. Приходится каждое действие отдельно описывать в момент выполнения действий, что не удобно и загромождает полезный код программы. НУ и в случае падения программы, в лог данные могут не попасть, т.к. приложение не примет сообщение. Тоже что и выше, только ловля сообщений происходит в отдельном потоке - пробелемы схода - более менее серьезное падение программы приводит к повисанию потока, который соответственно сообщение не примет и не запишет в лог. Вариант с отдельным процессом для меня видится не лучшим вариантом. т.к. это лишние проблемы и не нужные вещи, к которым я крайне плохо отношусь. ИТОГО: Интересуют два момента: как писать в лог, не загромождая полезный код программы и не усложняя его чтение. как зафиксировать наиболее подробный лог, даже в случае падения, повисания программы.


Ответ

По общему вопросу. Log4Net - почти стандарт (не нужно изобретать велосипед) Может помочь AOP (типа PostSharp), в таком случае не нужно "коверкать" исходный код. как писать в лог, не загромождая полезный код программы и не усложняя его чтение. Писать в отдельный лог-файл или другое хранилище, очевидно же. Ну или в том же log4Net используются различные уровни записей. как зафиксировать наиболее подробный лог, даже в случае падения, повисания программы. Наиболее подробный лог получается, как ни странно, при логировании исключения. Во-первых что-бы иметь актуальный стек, ошибка не должна скрываться во "внутренних деталях реализации" и дойти до глобального обработчика ошибок в своем начальном виде или со своими дополнениями. Во-вторых, должна обработаться либо с записью в какое-то хранилище, либо передана по почте разработчикам и прочее.

Комментариев нет:

Отправить комментарий