Страницы

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

понедельник, 16 декабря 2019 г.

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

#c_sharp #алгоритм


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

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

ИТОГО: Интересуют два момента:

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


Ответы

Ответ 1



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

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

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