(Это в некоторой степени специфично для Windows / .NET, но именно это вы указали в вопросе, и я думаю, что это весьма полезная информация в этом контексте. )
Если ваше приложение не является строго однопоточным, вам нужен файл дампа (который даст вам как минимум стек для всех потоков), а не только трассировку стека для потока, генерирующего исключение.
Создание не слишком большого дампа, содержащего достаточно информации, чтобы предоставить вам полезную трассировку управляемого стека, немного сложно, но есть очень полезная утилита под названием clrdump , которая справится с некоторыми из более ужасных подробности для вас.
Clrdump - это в основном оболочка для Microsoft DbgHelp.dll. Вы можете использовать DbgHelp напрямую - см. этот вопрос - но тогда вы получите «полный минидамп» размером с виртуальное адресное пространство вашего приложения, которое может быть довольно большим. Clrdump отлично справляется с созданием небольшого дампа, содержащего только трассировки стека, плюс достаточно информации, чтобы SOS могла их прочитать.
Вы не упоминаете о ведении журнала процессов (например, syslog в Linux, Event Viewer для Windows?). Поскольку у меня также есть опыт системного администратора, я действительно ценю программы с возможностью ведения журнала. Еще лучше, если можно будет выбрать уровень детализации.
Это хорошо для вас, чтобы узнать больше об этой среде, и для ваших пользователей, если им придется выполнять какую-то интеграцию с другими инструментами.
Если ваши пользователи более технические, вы можете попросить их установить максимальную степень детализации журнала и воспроизвести ошибку еще раз.
По сути, не существует Золотого правила, которому вы должны следовать и применять в каждом приложении. В зависимости от вашего бизнес-приложения и сценария для сбора информации при возникновении ошибки лучше всего включать разные вещи.
Те, которые вы упомянули, в порядке, но есть еще кое-что, что хорошо для регистрации:
пример: поток вашей программы подобен автомату состояний, и у вас есть 5 состояний, и вы достигли состояния 3.
если у вас есть приложение, которое является сервером -client, собирать оба журнала - со стороны поставщика и потребителя.
дамп памяти обычно не является хорошим предложением - делайте это только тогда, когда вам нужно понять проблемы в фреймворках или JVM (например), которые вы не можете контролировать. OutOfMemoryError например
Я не вижу в вашем списке наиболее важной информации (когда мы говорим об уровне кода dotnet / java).
Тип исключения, сообщение и трассировка.
Вы можете использовать простой код, чтобы перехватить любое исключение, и «записать в журнал» / «отправить прямо на электронную почту».
LA Transtar также ведет ключевой журнал, который сохраняется только на случай сбоев. Этот журнал содержит ввод и отслеживание работы программы. Журнал сбрасывается в начале каждой новой транзакции.
А теперь из лагеря паранойи :(
Подумайте, на какую отрасль нацелено программное обеспечение. Сбор любой информации о пользователе (даже имя Active Directory) или сети может привести к тому, что ваше приложение будет зачернено и потенциально повлечет за собой ответственность. т.е. что делать, если ваша база данных ошибок скомпрометирована и эта информация используется для взлома сети банка или государственных лабораторий. Будет ли замечен отчет об ошибке, содержащий их IP-адреса?Можно ли подать в суд? Может быть...
Например, если вам нужно собрать сетевые данные для диагностики сетевых проблем, подумайте о том, чтобы ваше приложение заменило любые системные имена или IP-адреса заполнителями, прежде чем данные будут отправлены вам обратно. (emailSrvr1, bankAcctNumSrv, становится srvr1 и srvr2) Это большая боль в отслеживании проблем, но, возможно, это того стоит. Это по-прежнему фиксирует информацию, которая может привести вас к неприятностям, но может помочь.
Я работаю с высококлассными предприятиями и правительством в течение нескольких лет, что окрашивает мою перспективу, но, вероятно, стоит подумать о том, что вы собираете и как это хранится.