Я перехожу с программирования на C++ на C#. Мне нужно заменить мою макросистему регистрации ошибок / отчетов C++ чем-то похожим на C#.
В моем исходнике на C++ я могу написать
LOGERR («Некоторая ошибка»); или же LOGERR ("Ошибка с входами% s и% d", строковая переменная, intvar);
Затем код макроса и вспомогательной библиотеки передает сообщение в формате (возможно, varargs) в базу данных вместе с исходным файлом, исходной строкой, именем пользователя и временем. Те же данные также вставляются в структуру данных для последующего сообщения пользователю.
Есть ли у кого-нибудь фрагменты кода C# или указатели на примеры, которые делают этот базовый отчет об ошибках / ведение журнала?
Редактировать: В то время, когда я задавал этот вопрос, я был новичком в .NET и не знал о System.Diagnostics.Trace. System.Diagnostics.Trace был тем, что мне было нужно в то время. С тех пор я использовал log4net в проектах, где требования к ведению журнала были больше и сложнее. Просто отредактируйте этот файл конфигурации XML из 500 строк, и log4net сделает все, что вам когда-либо понадобится :)





Хотя я лично ненавижу это, log4net кажется фактическим стандартом для ведения журнала C#. Пример использования:
log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
log.Error(“Some error”);
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar);
Я использовал log4net и ценю его мощный инструмент (и NHibernate и другие его используют). Но мне любопытно, почему людям не нравится использовать встроенную трассировку .NET 2.0? С другим типом слушателей и несколькими инструментами это кажется намного менее беспорядочным, чем log4net, который является портом java.
Могу услышать вас о документации (немного). Вот почему просмотр кода приличных проектов с открытым исходным кодом, в которых он используется, позволяет значительно сэкономить время. После этого это моя любимая утилита для ведения логов.
@Ted: хорошая идея - не могли бы вы порекомендовать пару проектов, чтобы изучить их, чтобы узнать о ведении журнала?
Log4Net - это довольно комплексная структура ведения журнала, которая позволит вам вести журнал на разных уровнях (отладка, ошибка, фатальный) и выводить эти операторы журнала в разные места (файл с возможностью обновления, веб-сервис, ошибки Windows).
Я могу легко войти в любое место, создав экземпляр регистратора
private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name]));
а затем зарегистрировать ошибку.
_log.Error("Error messsage", ex);
Корпоративная библиотека - надежная альтернатива log4net, а также предлагает множество других возможностей (кэширование, обработка исключений, проверка и т. д.). Я использую его практически в каждом проекте, который создаю.
Настоятельно рекомендуется.
EL может даже отправлять электронные письма в рамках регистрации. Очень удобно при сообщении об ошибках в продукте.
То же самое и для log4net. Я добавляю свои два бита, потому что для фактического использования имеет смысл взглянуть на некоторые реализации с открытым исходным кодом, чтобы увидеть образцы кода реального мира с некоторыми удобными дополнениями. Для log4net я бы посоветовал сразу взглянуть на подтекст. В частности, обратите внимание на биты информации о запуске и сборке.
Еще одна хорошая библиотека для ведения журналов - NLog, которая может вести журнал во множестве разных мест, таких как файлы, базы данных, журнал событий и т. д.
Здесь много сторонников log4net, поэтому я уверен, что это будет проигнорировано, но я добавлю свои собственные предпочтения:
System.Diagnostics.Trace
Сюда входят прослушиватели, которые прослушивают ваши методы Trace(), а затем записывают в файл журнала / окно вывода / журнал событий, в структуру входят DefaultTraceListener, TextWriterTraceListener и EventLogTraceListener. Он позволяет вам указывать уровни (Предупреждение, Ошибка, Информация) и категории.
Класс трассировки в MSDN
Запись в журнал событий в веб-приложении
UdpTraceListener - записывает сообщения XML, совместимые с log4net, в средство просмотра журналов, такое как log2console.
+1 Небольшое дополнение, Trace активен тогда и только тогда, когда вы скомпилировали с символом препроцессора TRACE.
Следует отметить, что TextWriterTraceListener не делает отметок времени.
Вы можете переопределить метод WriteLine() в TextWriterTraceListener для достижения возможности автоматической отметки времени в файле журнала. См. эта статья CodeProject, раздел 6.
Хороший совет @ user7116. Я хочу упомянуть, что компиляция с предшественником Trace снизит производительность; и вы можете включить его в «Свойства проекта> Сборка> Определить константу TRACE».
В дополнение к паре комментариев, касающихся использования методов 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 (бесплатные сообщения журнала + необработанные исключения)
Он выполняет свою работу, но я ненавижу документацию и возмущен тем, что потратил много часов, возясь с файлами конфигурации и, по сути, летал вслепую, пока не смог заставить относительно простые вещи работать так, как я хотел.