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

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

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

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

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

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

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


person Rodney Schuler    schedule 29.09.2008    source источник


Ответы (15)


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

System.Diagnostics.Trace

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

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

person Chris S    schedule 29.09.2008
comment
+1 Небольшое дополнение, Trace активен тогда и только тогда, когда вы скомпилировали с символом препроцессора TRACE. - person user7116; 28.09.2009
comment
Следует отметить, что TextWriterTraceListener не делает отметок времени. - person Chris S; 09.04.2010
comment
Вы можете переопределить метод WriteLine() в TextWriterTraceListener, чтобы получить возможность автоматической отметки времени в файле журнала. См. эту статью CodeProject, раздел 6. - person Robert Harvey; 07.10.2010
comment
Хороший совет @ user7116. Я хочу упомянуть, что компиляция с предшественником Trace снизит производительность; и вы можете включить его в Свойства проекта ›Сборка› Определить константу TRACE. - person Mahmood Jenami; 03.09.2015

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

person Mitch Wheat    schedule 29.09.2008
comment
В начале каждого класса объявляйте экземпляр регистратора следующим образом ... Вы потеряли меня там. :-) - person Kos; 10.08.2012

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

person Mats Fredriksson    schedule 29.09.2008

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

person Community    schedule 08.02.2009

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

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

person Eric Schoonover    schedule 29.09.2008
comment
EL может даже отправлять электронные письма в рамках регистрации. Очень удобно при сообщении об ошибках в продукте. - person StingyJack; 29.09.2009

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

log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Error(“Some error”);
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);
person Ben Hoffstein    schedule 29.09.2008
comment
Он выполняет свою работу, но я ненавижу документацию и обижаюсь за то, что потратил много часов, возясь с файлами конфигурации и в основном летая вслепую, пока я не смог заставить относительно простые вещи работать так, как я хотел. - person Ben Hoffstein; 29.09.2008
comment
Я использовал log4net и ценю его мощный инструмент (и NHibernate и другие его используют). Но мне любопытно, почему людям не нравится использовать встроенную трассировку .NET 2.0? С другим типом слушателей и несколькими инструментами это кажется намного менее беспорядочным, чем log4net, который является портом java. - person Chris S; 29.09.2008
comment
Могу вас услышать о документации (отчасти). Вот почему просмотр кода приличных проектов с открытым исходным кодом, в которых он используется, позволяет значительно сэкономить время. После этого это моя любимая утилита для ведения логов. - person Ted; 30.09.2008
comment
@Ted: хорошая идея - не могли бы вы порекомендовать пару проектов, чтобы изучить их, чтобы узнать о ведении журнала? - person fostandy; 16.12.2009

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

person S. Mills    schedule 11.08.2009

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

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

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

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

_log.Error("Error messsage", ex);
person FryHard    schedule 29.09.2008

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

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, который предоставляет хранилище и запрос таких событий структурированного журнала.

person Nicholas Blumhardt    schedule 22.03.2014

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

person CSharpAtl    schedule 29.09.2008

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

person Ted    schedule 29.09.2008

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

person Chris Ballard    schedule 29.09.2008

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

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

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

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

Кроме того, я ищу http://www.postsharp.org/ библиотеку АОП, которая может также помогают в ведении журнала, как показано здесь в проекте кода: http://www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx.

person Wil P    schedule 28.09.2009

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

person gmsi    schedule 01.07.2016
comment
Я работаю над проектом Exceptionless и с радостью отвечу на любые вопросы. У нас есть цели ведения журнала для всех основных фреймворков ведения журнала, поэтому вы можете получить большую ценность прямо из коробки, используя Exceptionless (бесплатные сообщения журнала + необработанные исключения) - person Blake Niemyjski; 07.07.2017

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

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

person Mario    schedule 29.09.2008