Регистрация ошибок в C#

Я перехожу с программирования на C++ на C#. Мне нужно заменить мою макросистему регистрации ошибок / отчетов C++ чем-то похожим на C#.

В моем исходнике на C++ я могу написать

LOGERR («Некоторая ошибка»); или же LOGERR ("Ошибка с входами% s и% d", строковая переменная, intvar);

Затем код макроса и вспомогательной библиотеки передает сообщение в формате (возможно, varargs) в базу данных вместе с исходным файлом, исходной строкой, именем пользователя и временем. Те же данные также вставляются в структуру данных для последующего сообщения пользователю.

Есть ли у кого-нибудь фрагменты кода C# или указатели на примеры, которые делают этот базовый отчет об ошибках / ведение журнала?

Редактировать: В то время, когда я задавал этот вопрос, я был новичком в .NET и не знал о System.Diagnostics.Trace. System.Diagnostics.Trace был тем, что мне было нужно в то время. С тех пор я использовал log4net в проектах, где требования к ведению журнала были больше и сложнее. Просто отредактируйте этот файл конфигурации XML из 500 строк, и log4net сделает все, что вам когда-либо понадобится :)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
73
0
89 717
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Хотя я лично ненавижу это, log4net кажется фактическим стандартом для ведения журнала C#. Пример использования:

log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Error(“Some error”);
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);

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

Ben Hoffstein 29.09.2008 09:06

Я использовал log4net и ценю его мощный инструмент (и NHibernate и другие его используют). Но мне любопытно, почему людям не нравится использовать встроенную трассировку .NET 2.0? С другим типом слушателей и несколькими инструментами это кажется намного менее беспорядочным, чем log4net, который является портом java.

Chris S 29.09.2008 13:35

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

Ted 30.09.2008 22:09

@Ted: хорошая идея - не могли бы вы порекомендовать пару проектов, чтобы изучить их, чтобы узнать о ведении журнала?

fostandy 16.12.2009 16:36

Я очень рекомендую посмотреть log4Net. Этот Почта охватывает большую часть того, что вам нужно для начала работы.

«В начале каждого класса объявляйте экземпляр регистратора следующим образом ...» Вы потеряли меня там. :-)

Kos 10.08.2012 12:44

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

Я могу легко войти в любое место, создав экземпляр регистратора

private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name]));

а затем зарегистрировать ошибку.

_log.Error("Error messsage", ex);

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

Настоятельно рекомендуется.

EL может даже отправлять электронные письма в рамках регистрации. Очень удобно при сообщении об ошибках в продукте.

StingyJack 29.09.2009 00:12

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

Еще одна хорошая библиотека для ведения журналов - NLog, которая может вести журнал во множестве разных мест, таких как файлы, базы данных, журнал событий и т. д.

Ответ принят как подходящий

Здесь много сторонников log4net, поэтому я уверен, что это будет проигнорировано, но я добавлю свои собственные предпочтения:

System.Diagnostics.Trace

Сюда входят прослушиватели, которые прослушивают ваши методы Trace(), а затем записывают в файл журнала / окно вывода / журнал событий, в структуру входят DefaultTraceListener, TextWriterTraceListener и EventLogTraceListener. Он позволяет вам указывать уровни (Предупреждение, Ошибка, Информация) и категории.

Класс трассировки в MSDN
Запись в журнал событий в веб-приложении
UdpTraceListener - записывает сообщения XML, совместимые с log4net, в средство просмотра журналов, такое как log2console.

+1 Небольшое дополнение, Trace активен тогда и только тогда, когда вы скомпилировали с символом препроцессора TRACE.

user7116 28.09.2009 23:58

Следует отметить, что TextWriterTraceListener не делает отметок времени.

Chris S 09.04.2010 16:46

Вы можете переопределить метод WriteLine() в TextWriterTraceListener для достижения возможности автоматической отметки времени в файле журнала. См. эта статья CodeProject, раздел 6.

Robert Harvey 07.10.2010 23:55

Хороший совет @ user7116. Я хочу упомянуть, что компиляция с предшественником Trace снизит производительность; и вы можете включить его в «Свойства проекта> Сборка> Определить константу TRACE».

Mahmood Jenami 03.09.2015 11:20

В дополнение к паре комментариев, касающихся использования методов System.Diagnostics для ведения журнала, я также хотел бы отметить, что инструмент DebugView очень удобен для проверки вывода отладки при необходимости - если он вам не нужен, нет необходимости в приложения для создания файла журнала, вы просто запускаете DebugView по мере необходимости.

Log4Net, как говорили другие, довольно распространен и похож на Log4j, который поможет вам, если вы когда-нибудь будете использовать Java.

У вас также есть возможность использовать блок приложения регистрации http://www.codeproject.com/KB/architecture/GetStartedLoggingBlock.aspx

Вы можете использовать встроенное ведение журнала .NET. Загляните в TraceSource и TraceListeners, их можно настроить в файле .config.

Я использую Фреймворк ведения журнала Object Guy - как и большинство людей, которые его пробуют. У этого парня есть кое-что интересное об этом Комментарии.

Как я сказал в другом потоке, мы уже несколько лет используем Фреймворк ведения журнала Object Guy в нескольких производственных приложениях. Его очень легко использовать и расширять.

Встроенная трассировка в System.Diagnostics подходит для .NET Framework, и я использую ее во многих приложениях. Однако одна из основных причин, по которой я все еще использую log4net, заключается в том, что во встроенной трассировке .NET Framework отсутствуют многие полезные полнофункциональные приложения, которые уже встроены в log4net.

Например, в .NET Framework действительно не существует хорошего прослушивателя трассировки файлов, кроме того, который находится в dll VB.NET, который на самом деле не является таким полнофункциональным.

В зависимости от вашей среды разработки я бы рекомендовал использовать log4net, если сторонние инструменты не доступны, тогда я бы сказал, что используйте классы трассировки System.Diagnostics. Если вам действительно нужен лучший appender / tracelistener, вы всегда можете реализовать его самостоятельно.

Например, многие наши клиенты требуют, чтобы мы не использовали библиотеки с открытым исходным кодом при установке на их корпоративные машины, поэтому в этом случае классы трассировки .NET Framework идеально подходят.

Вдобавок - http://www.postsharp.org/ - это библиотека AOP, которую я изучаю, которая также может помочь в ведении журнала, как показано здесь в проекте кода: http://www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx.

Серилог опаздывает на вечеринку, но предлагает несколько интересных вариантов. Это очень похоже на использование классических текстовых логгеров:

Log.Information("Hello, {0}", username);

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

Идея состоит в том, что если вы используете хранилище данных в стиле NoSQL для журналов, вы можете записывать такие события, как:

{
    Timestamp: "2014-02-....",
    Message: "Hello, nblumhardt",
    Properties:
    {
        "0": "nblumhardt"
    }
}

Синтаксис строки формата .NET расширен, поэтому приведенный выше пример можно записать как:

Log.Information("Hello, {Name}", username);

В этом случае свойство будет называться Name (а не 0), что упростит запросы и сопоставление.

Уже есть несколько хороших вариантов хранения. MongoDB и хранилище таблиц Azure кажутся довольно популярными для DIY. Изначально я создал Serilog (хотя это проект сообщества), а сейчас я работаю над продуктом под названием Seq, который обеспечивает хранение и запросы таких типов событий структурированного журнала.

ИсключениеМеньше - один из самых простых пакетов nuget, доступных для ведения журнала. Это проект открытый источник. Он автоматически обрабатывает необработанное исключение, и доступны параметры для ведет журнал вручную. Вы можете войти в онлайн или собственный хост на локальном сервере.

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

Blake Niemyjski 07.07.2017 05:18

Другие вопросы по теме