Вход [закрытых] лучших практик

Если вы видите документацию для C ++ REST SDK из github, вы найдете ссылку typedef

C ++ Rest SDK - полезное имя пространства имен

typedef std::string     string_t;

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

323
задан Erik Funkenbusch 23 February 2009 в 03:25
поделиться

8 ответов


Обновление: Для расширений System.Diagnostics, обеспечивающих некоторые из недостающих слушателей, которые могут вам понадобиться, см. Essential.Diagnostics в CodePlex ( http: //essentialdiagnostics.codeplex. com / )


Frameworks

Q: Какие среды вы используете?

A: System.Diagnostics.TraceSource, встроенный в .NET 2.0.

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

Есть некоторые области, в которых дополнительные функциональные возможности полезны, или иногда функциональные возможности существуют, но недостаточно хорошо документированы, однако это не означает, что вся структура ведения журнала (которая предназначена для расширения) должна быть отброшена и полностью заменена, например некоторые популярные альтернативы (NLog, log4net, Common.Logging, и даже EntLib Logging).

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

Мне кажется другие фреймворки, даже EntLib, просто страдают от синдрома Not Invented Here, и я думаю, что они зря потратили время, изобретая основы, которые уже отлично работают в System.Diagnostics (например, как вы пишете операторы журнала), вместо того, чтобы заполнять немногие существующие пробелы. Короче говоря, не используйте их - они не нужны.

Возможности, о которых вы, возможно, не знали:

  • Использование перегрузок TraceEvent, принимающих строку формата и аргументы, может повысить производительность, поскольку параметры хранятся в виде отдельных ссылок до тех пор, пока не завершится успешно Filter.ShouldTrace (). Это означает, что никаких дорогостоящих вызовов ToString () для значений параметров до тех пор, пока система не подтвердит, что сообщение действительно будет зарегистрировано.
  • Trace.CorrelationManager позволяет сопоставлять операторы журнала об одной и той же логической операции (см. Ниже).
  • VisualBasic.Logging.FileLogTraceListener удобен для записи в файлы журнала и поддерживает ротацию файлов. Хотя он и находится в пространстве имен VisualBasic, его можно так же легко использовать в проекте C # (или на другом языке), просто включив DLL.
  • При использовании EventLogTraceListener, если вы вызываете TraceEvent с несколькими аргументами и с пустой или пустой строкой формата, тогда аргументы передаются непосредственно в EventLog.WriteEntry (), если вы используете локализованные ресурсы сообщений.
  • Инструмент Service Trace Viewer (из WCF) полезен для просмотра графиков коррелированных файлов журнала активности (даже если вы не используете WCF). Это действительно может помочь отладить сложные проблемы, когда задействовано несколько потоков / действий.
  • Избегайте накладных расходов, очистив всех слушателей (или удалив значение по умолчанию); в противном случае Default передаст все в систему трассировки (и вызовет все эти накладные расходы ToString ()).

Области, которые вы, возможно, захотите расширить (при необходимости):

  • Прослушиватель трассировки базы данных
  • Цветной прослушиватель трассировки консоли
  • Прослушиватели трассировки MSMQ / Email / WMI (при необходимости)
  • Реализуйте FileSystemWatcher для вызова Trace.Refresh для динамических изменений конфигурации

Другие рекомендации:

Используйте структурированные идентификаторы событий и ведите список ссылок (например, документ их в перечислении).

Имея уникальный идентификатор события ' s для каждого (значимого) события в вашей системе очень полезно для корреляции и поиска конкретных проблем. Легко вернуться к конкретному коду, который регистрирует / использует идентификаторы событий и может упростить предоставление рекомендаций по распространенным ошибкам, например, ошибка 5178 означает неправильную строку подключения к базе данных и т. Д.

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

например, первая цифра может указывать на общий класс: 1xxx может использоваться для Операции «Start», 2xxx для нормального поведения, 3xxx для отслеживания активности, 4xxx для предупреждений, 5xxx для ошибок, 8xxx для операций «Stop», 9xxx для фатальных ошибок и т. Д.

Вторая цифра может указывать на область, например 21xx для информации о базе данных (41xx для предупреждений базы данных, 51xx для ошибок базы данных), 22xx для режима расчета (42xx для предупреждений о расчетах и ​​т. Д.), 23xx для другого модуля и т. Д.

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

Q: Если вы используете трассировку, воспользуетесь ли вы Trace.Correlation.StartLogicalOperation?

A: Trace.CorrelationManager очень полезен для корреляции операторов журнала в любой многопоточной среде (что довольно много чего угодно в наши дни).

Вам необходимо установить ActivityId по крайней мере один раз для каждой логической операции для корреляции.

Start / Stop и LogicalOperationStack могут затем использоваться для простого контекста на основе стека. Для более сложных контекстов (например, асинхронных операций) использование TraceTransfer для нового ActivityId (до его изменения) позволяет корреляцию.

Инструмент Service Trace Viewer может быть полезен для просмотра графиков активности (даже если вы не используете WCF).

Q: Вы пишете этот код вручную или используете некоторую форму аспектно-ориентированного программирования для выполнения Это? Хотите поделиться фрагментом кода?

A: Вы можете создать класс области видимости, например, LogicalOperationScope, который (а) устанавливает контекст при создании и (б) сбрасывает контекст при удалении.

Это позволяет вам чтобы написать следующий код для автоматического переноса операций:

  using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
  {
    // .. do work here
  }

При создании область может сначала установить ActivityId, если необходимо, вызвать StartLogicalOperation, а затем записать сообщение TraceEventType.Start. При Dispose он может записать сообщение Stop, а затем вызвать StopLogicalOperation.

Q: Предоставляете ли вы какую-либо форму детализации источников трассировки? Например, WPF TraceSources позволяет настраивать их на различных уровнях.

A: вам может понадобиться один источник трассировки для каждой сборки или для каждого основного раздела вашего приложения.

Если вам нужен еще более точный контроль, добавьте отдельные логические переключатели, чтобы включить / выключить определенную трассировку большого объема, например дампы необработанных сообщений. (Или можно использовать отдельный источник трассировки, аналогичный WCF / WPF).

Вы также можете рассмотреть отдельные источники трассировки для отслеживания активности и общего (другого) ведения журнала, так как это может немного упростить настройку фильтров именно так, как вы хотите.

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


Listeners

Q: Какие выходные данные журнала вы используете?

Это может зависеть от какой тип приложения вы пишете и какие вещи регистрируются. Обычно разные вещи идут в разных местах (т.е. несколько выходов).

Обычно я делю выходные данные на три группы:

(1) События - Журнал событий Windows (и файлы трассировки)

например, если вы пишете сервер / службу, то лучше всего в Windows использовать журнал событий Windows (у вас нет пользовательского интерфейса).

В этом случае все критические события, ошибки, предупреждения и информационные события (уровня обслуживания) должны попадать в журнал событий Windows. Информационный уровень должен быть зарезервирован для этих типов событий высокого уровня, тех, которые вы хотите записать в журнал событий, например, «Служба запущена», «Служба остановлена», «Подключено к Xyz» и, возможно, даже «Запущено по расписанию» , «Пользователь вошел в систему» ​​и т. Д.

В некоторых случаях вы можете захотеть сделать запись в журнал событий встроенной частью вашего приложения, а не через систему трассировки (т.е. записывать записи в журнал событий напрямую). Значит, может t случайно выключить. (Обратите внимание, что вы по-прежнему хотите отметить то же событие в своей системе трассировки, чтобы вы могли коррелировать).

Напротив, приложение Windows GUI обычно сообщает об этом пользователю (хотя они также могут регистрироваться в журнале событий Windows) .

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

т.е. если пользователь видит сообщение об ошибке в определенное время, вы сможете найти то же сообщение об ошибке в журнале событий Windows, а затем то же событие с той же меткой времени в журнал трассировки (вместе с другими подробностями трассировки).

(2) Действия - файлы журнала приложений или таблица базы данных (и файлы трассировки)

Это обычная операция, которую выполняет система, например, обслуживание веб-страницы, размещение сделок на фондовом рынке, принятие ордеров, выполнение расчетов и т. Д.

Отслеживание активности (запуск, остановка и т. Д.) Здесь полезно (с правильной степенью детализации).

Кроме того, очень часто используется определенный журнал приложений (иногда называемый журналом аудита). Обычно это таблица базы данных или файл журнала приложения, который содержит структурированные данные (то есть набор полей).

Здесь все может быть немного размыто в зависимости от вашего приложения. Хорошим примером может быть веб-сервер, который записывает каждый запрос в веб-журнал; подобными примерами могут быть система обмена сообщениями или система вычислений, где каждая операция регистрируется вместе с деталями, относящимися к конкретному приложению.

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

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

Как правило, вам следует координировать ведение журнала действий в разных системах, т. е. записывать в журнал своего приложения одновременно с увеличением счетчика производительности и входом в систему трассировки. Если вы делаете все одновременно (или сразу друг за другом в коде), тогда отлаживать проблемы проще (чем если бы все они возникали в разное время / в разных местах кода).

(3) Debug Trace - Text файл, или, может быть, XML или база данных.

Это информация на уровне подробностей и ниже (например, настраиваемые логические переключатели для включения / выключения дампов необработанных данных). Это дает представление о том, что система делает на уровне подактивности.

Это уровень, на котором вы хотите иметь возможность включать / выключать отдельные разделы вашего приложения (отсюда и несколько источников). Вы же не хотите, чтобы эти вещи загромождали журнал событий Windows. Иногда используется база данных, но более вероятно, что это скользящие файлы журнала, которые очищаются через определенное время.

Большое различие между этой информацией и файлом журнала приложений состоит в том, что он неструктурирован. В то время как журнал приложения может иметь поля для To, From, Amount и т. Д., Подробные трассировки отладки могут быть такими, какие вводит программист, например, «проверка значений X = {value}, Y = false» или случайные комментарии / маркеры, такие как « Готово, пробую еще раз ».

Одна из важных практик - убедиться, что вещи, которые вы помещаете в файлы журнала приложений или журнал событий Windows, также записываются в систему трассировки с такими же деталями (например, отметкой времени). Это позволяет вам затем сопоставлять различные журналы при исследовании.

Если вы планируете использовать определенную программу просмотра журналов из-за наличия сложной корреляции, например, Service Trace Viewer, тогда вам необходимо использовать соответствующий формат, например XML. В противном случае обычно достаточно простого текстового файла - на более низких уровнях информация в значительной степени неструктурирована, поэтому вы можете найти дампы массивов, дампы стека и т. Д. При условии, что вы можете связать обратно с более структурированными журналами на более высоких уровнях, все должно

Q: Если вы используете файлы, вы используете скользящие журналы или только один файл? Как сделать журналы доступными для использования людьми?

A: Для файлов, как правило, вам нужны скользящие файлы журналов с точки зрения управляемости (с System.Diagnostics просто используйте VisualBasic.Logging.FileLogTraceListener).

Доступность снова зависит от системы. Если вы говорите только о файлах, то для сервера / службы можно получить доступ к скользящим файлам, когда это необходимо. (Журнал событий Windows или журналы приложений базы данных будут иметь свои собственные механизмы доступа.)

Если у вас нет простого доступа к файловой системе, то отладка трассировки в базу данных может быть проще. [т.е. реализовать TraceListener базы данных].

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

Если, однако произошел сбой или возникла проблема, тогда файл не был удален. Либо если он обнаружит ошибку, либо при следующем запуске он заметит файл, а затем может предпринять действия, например сжать его (например, 7zip) и отправить его по электронной почте или иным образом сделать доступным.

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


Просмотр

В: Какие инструменты вы используете для просмотра журналов?

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

Notepad / vi / Notepad ++ или любой другой текстовый редактор является основным для текстовых журналов.

Если у вас есть сложные операции, например, действия с переносами, то вы, очевидно, должны использовать специализированный инструмент, такой как Service Trace Viewer. (Но если он вам не нужен, то проще текстовый редактор).

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

Обычно журнал событий Windows также делает эти важные события доступными для инструментов мониторинга, таких как MOM или OpenView.

Другое -

Если при входе в базу данных можно легко фильтровать и сортировать информацию (например, увеличивать масштаб определенного идентификатора действия. (С текстовыми файлами вы можете использовать Grep / PowerShell или аналогичные средства для фильтрации по конкретному идентификатору GUID)

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

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

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

Меня действительно раздражает, что несколько фреймворков (log4net, EntLib и т. Д.) Потратили впустую время, изобретая колесо, и повторно реализовали базовое ведение журнала, фильтрацию и ведение журнала в текстовые файлы, журнал событий Windows и файлы XML, каждый по-своему (операторы журнала разные в каждом); Затем каждый реализовал свою собственную версию, например, регистратора базы данных, когда большая часть из них уже существовала и все, что требовалось, - это еще пара прослушивателей трассировки для System.Diagnostics. Поговорим о большой трате повторяющихся усилий.

Q: Если вы создаете решение ASP.NET, вы также используете мониторинг работоспособности ASP.NET? Включаете ли вы вывод трассировки в события монитора работоспособности? А как насчет Trace.axd?

Эти вещи можно включать / выключать по мере необходимости. Я считаю, что Trace.axd весьма полезен для отладки реакции сервера на определенные действия, но обычно он бесполезен в интенсивно используемой среде или для долгосрочной трассировки.

Q: А как насчет настраиваемых счетчиков производительности?

Для профессионала приложение, особенно сервер / сервис, Я ожидаю увидеть его полностью оснащенным как счетчиками монитора производительности, так и ведением журнала событий Windows. Это стандартные инструменты Windows, и их следует использовать.

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

Это хорошая причина для практики разработки без прав администратора (иметь отдельную учетную запись администратора для когда вам нужно установить службы и т. д.). При записи в журнал событий .NET автоматически создаст отсутствующий журнал при первой записи в него;

232
ответ дан 23 November 2019 в 00:56
поделиться

Я должен присоединиться к хору, рекомендующему log4net, в моем случае, прибывающем из гибкости платформы (настольный .NET / Компактная Платформа, 32/64-bit) точка зрения.

Однако обертывание его в частной марке API главный антишаблон . log4net.ILogger дубликат .NET эти палата общин, Регистрирующаяся обертка , API уже, таким образом связываясь уже минимизирован для Вас, и так как это - также библиотека Apache, это не обычно даже беспокойство, потому что Вы не бросаете управления: разветвите его, если Вы должны.

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

  1. Используя глобальный одноэлементный регистратор (или эквивалентно статическая точка входа), который теряет высокое разрешение рекомендуемого шаблон регистратора в классе ни для какого другого усиления селективности.
  2. Отказ выставить дополнительное Exception аргумент , ведя к многочисленным проблемам:
    • Это вырабатывает политику входа исключения, еще более трудную поддержать, таким образом, ничто последовательно не делается за исключениями.
    • Даже с последовательной политикой, форматируя исключение далеко в строку теряет данные преждевременно. Я записал пользовательское ILayout декоратор, который выполняет подробную развертку на исключении для определения цепочки событий.
  3. Отказ выставить эти IsLevelEnabled свойства , который отбрасывает способность пропустить форматирование код, когда области или уровни входа выключены.
40
ответ дан Jeffrey Hantin 4 November 2019 в 10:33
поделиться

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

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

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

Мы пользуемся библиотекой входа свободного городского населения Apache перенесенный Log4J.

Hope это помогает!

* Редактирование *

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

17
ответ дан Steve Moyer 4 November 2019 в 10:33
поделиться

, Какие платформы Вы используете?

Мы используем соединение регистрирующегося блока приложений и пользовательского помощника входа, который работает вокруг битов платформы .NET. LAB настроен для вывода довольно обширных файлов журнала включенные отдельные общие файлы трассировки для сервисной записи/выхода метода и определенные ошибочные файлы для неожиданных проблем. Конфигурация включает дату/время, поток, pId и т.д. для помощи отладки, а также полной детали исключения и стека (в случае непредвиденной исключительной ситуации).

пользовательский помощник входа использует Трассировку. Корреляция и особенно удобна в контексте входа в систему WF. Например, у нас есть конечный автомат, который вызывает серию последовательных рабочих процессов. В каждом из них вызывают операции, мы регистрируем запуск (использующий StartLogicalOperation), и затем в конце мы останавливаемся, логическая операция с gereric возвращают обработчик событий.

Это оказалось полезным несколько раз при попытке отладить отказы в сложных бизнес-последовательностях, поскольку это позволяет нам определять вещи как то, Если/Еще выборы при разветвлении и т.д. более быстро на основе выполнения действия упорядочивают.

, Какие выводы журнала Вы используете?

Мы используем текстовые файлы и XML-файлы. Текстовые файлы настроены через блок приложений, но у нас есть выводы XML также от нашего сервиса WF. Это позволяет нам получить события во время выполнения (персистентность и т.д.), а также универсальные бизнес-исключения типа. Текстовые файлы прокручивают журналы, которые прокручиваются днем и размер (я полагаю, что общий размер 1 МБ является динамической точкой).

, Что инструменты Вам используют для просмотра журналов?

Мы используем Блокнот и Сервисное Средство просмотра трассировки WCF, в зависимости от которой выходной группы мы смотрим на. Сервисное Средство просмотра трассировки WCF действительно действительно удобно, если Вы имеете свою выходную установку правильно и можете сделать чтение вывода намного более простым. Тем не менее, если я знаю примерно, где ошибка так или иначе - просто чтение хорошо аннотируемого текстового файла хорошо также.

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

8
ответ дан Steve Godbold 4 November 2019 в 10:33
поделиться

Мы используем Log4Net на работе как регистрирующийся поставщик с одноэлементной оберткой для экземпляра журнала (хотя одиночный элемент рассматривается, подвергая сомнению, являются ли они хорошей идеей или не).

Мы выбрали его по следующим причинам:

  • Простая конфигурация / реконфигурирование на различных средах
  • Большое количество предварительно созданного appenders
  • Одному из CMS, который мы используем уже, создали его в
  • Хорошее количество уровней журнала и конфигураций вокруг них

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

, я вижу некоторые достоинства в использовании Трассировки, которая находится в платформе.NET, но я не полностью продаюсь на нем, главным образом потому что компоненты, с которыми я работаю, действительно не делают никаких вызовов Трассировки. Единственная вещь, которую я часто использую, который делает, System.Net.Mail от того, что я могу сказать.

, Таким образом, у нас есть библиотека, которая переносит log4net и в рамках нашего кода, который мы просто должны наполнить как это:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

В рамках методов мы делаем проверку, чтобы видеть, включен ли регистрирующийся уровень, таким образом, у Вас нет избыточных вызовов к log4net API (поэтому, если Отладка не включена, операторы отладки проигнорированы), но когда я получу некоторое время, я буду обновлять его для представления их так, чтобы можно было сделать проверки сами. Это предотвратит оценки, предпринимаемые, когда они не были должны, например:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

Это станет:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(Экономят немного времени выполнения)

По умолчанию мы регистрируемся в двух местах:

  1. Файловая система веб-сайта (в неподаваемом расширении файла)
  2. электронная почта, посылающая за Ошибкой & Фатальный

Файлы сделаны как прокрутка каждого дня или 10 МБ (IIRC). Мы не используем EventLog, поскольку он может потребовать повышения уровня защиты, чем мы часто хотим дать сайт.

я нахожу, что Блокнот работает просто великолепно для чтения журналов.

9
ответ дан Aaron Powell 4 November 2019 в 10:33
поделиться

Как авторы инструмента, мы, конечно, используем SmartInspect для входа и трассировки приложений.NET. Мы обычно используем протокол именованного канала для живого входа и (зашифровали) двоичные файлы журнала для журналов конечного пользователя. Мы используем Консоль SmartInspect в качестве средства просмотра и контролирующего инструмента.

существует на самом деле довольно много платформ журналирования и инструментов для.NET там. Существует обзор и сравнение различных инструментов на DotNetLogging.com .

6
ответ дан Dennis G. 4 November 2019 в 10:33
поделиться

Мы используем log4net на наших веб-приложениях.

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

Это также позволяет Вам быть нацеленными на определенные классы или атрибуты для входа под. Это очень удобно, когда у Вас есть идея, где ошибка происходит. Классическим примером является NHibernate, где Вы хотите видеть просто SQL, идущий в базу данных.

Редактирование:

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

1
ответ дан Jeffrey Cameron 4 November 2019 в 10:33
поделиться

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

Платформы

  • Использование платформа абстракции регистратора - как slf4j (или самокрутка), так, чтобы Вы отделили реализацию регистратора от своего API. Я видел, что много платформ регистратора приходят и уходят, и Вы - более обеспеченная способность принять новую без большого количества стычки.
  • Попытка найти платформу, которая поддерживает множество выходных форматов.
  • Попытка найти платформу, которая поддерживает плагины / пользовательские фильтры.
  • Использование платформа, которая может быть настроена внешними файлами, так, чтобы Ваши клиенты / потребители могли настроить вывод журнала легко так, чтобы это могло быть считано коммерческими приложениями для управления журналом легко.
  • убедиться не пойти за борт на пользовательских уровнях входа, иначе Вы не можете перемещаться в различные платформы журналирования.

Вывод Регистратора

  • Старается избегать журналов стиля XML/RSS для входа, который мог встретиться с катастрофическими отказами. Это важно, потому что, если выключатель питания отключен без Вашего регистратора, пишущий закрытие </xxx> тег, Ваш журнал повреждается.
  • потоки Журнала. Иначе может быть очень трудно отследить поток Вашей программы.
  • , Если необходимо интернационализировать журналы, можно хотеть иметь разработчика, только входят в систему английский язык (или предпочтительный язык).
  • Иногда наличие опции вставить регистрирующиеся операторы в SQL-запросы может быть спасителем в отладке ситуаций. Такой как:
    -- Invoking Class: com.foocorp.foopackage.FooClass:9021
    SELECT * FROM foo;
  • Вы хотите вход уровня класса. Вы обычно не хотите статические экземпляры регистраторов также - это не стоит микрооптимизации.
  • отмечание и категоризация зарегистрированных исключений иногда полезны, потому что не все исключения создаются равные. Так зная подмножество важных исключений голова времени полезна, если у Вас есть монитор журнала, который должен отправить уведомления на критические состояния.
  • фильтры Дублирования сохранят Ваше зрение и жесткий диск. Вы действительно хотите видеть, что тот же регистрирует оператор, повторенный 10^10000000 времена? Не был бы это быть лучше только получить сообщение как: This is my logging statement - Repeated 100 times

Также см. этот мой вопрос .

18
ответ дан Community 4 November 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: