Каковы наилучшие или наиболее полезные конфигурации для входа с NLog? (Они могут быть простыми или сложными, если они полезны.)
Я имею в виду примеры, такие как автоматическое сворачивание файлов журнала определенного размера, изменение макета (сообщения журнала) независимо от того, есть ли исключение, повышение уровня журнала после возникновения ошибки и т. Д.
Вот несколько ссылок:
Ответы:
Некоторые из них относятся к категории общих советов по NLog (или ведению журналов), а не только к рекомендациям по конфигурации.
Вот некоторые общие ссылки для регистрации отсюда в SO (вы, возможно, уже видели некоторые или все из них):
log4net против Nlog
Регистрация лучших практик
Какой смысл вырубки фасада?
Почему регистраторы рекомендуют использовать регистратор для каждого класса?
Используйте общий шаблон именования вашего регистратора в зависимости от класса
Logger logger = LogManager.GetCurrentClassLogger()
. Это дает вам высокую степень детализации в ваших регистраторах и дает вам большую гибкость в настройке регистраторов (управление глобально, пространством имен, определенным именем регистратора и т. Д.).При необходимости используйте регистраторы, не основанные на именах классов. Возможно, у вас есть одна функция, для которой вы действительно хотите управлять регистрацией отдельно. Возможно, у вас есть общие проблемы с журналированием (регистрация производительности).
Если вы не используете журналирование на основе имени класса, рассмотрите возможность именования ваших регистраторов в какой-то иерархической структуре (возможно, по функциональной области), чтобы вы могли поддерживать большую гибкость в вашей конфигурации. Например, у вас может быть функциональная область «база данных», FA «анализа» и FA «ui». У каждого из них могут быть подобласти. Итак, вы можете запросить регистраторы, как это:
И так далее. С помощью иерархических регистраторов вы можете настроить ведение журнала глобально («*» или корневой регистратор), по FA (база данных, анализ, пользовательский интерфейс) или по подрайонам (Database.Connect и т. Д.).
У логгеров есть много опций конфигурации:
Смотрите справку NLog для получения дополнительной информации о том, что конкретно означает каждый из параметров. Вероятно, наиболее заметными элементами здесь являются возможность подстановки правил ведения журнала, концепция, что несколько правил ведения журнала могут «выполняться» для одного оператора ведения журнала, и что правило ведения журнала может быть помечено как «окончательное», поэтому последующие правила не будут выполняться для данное заявление о регистрации.
Используйте GlobalDiagnosticContext, MappedDiagnosticContext и NestedDiagnosticContext, чтобы добавить дополнительный контекст к выходным данным.
Используйте «переменную» в вашем конфигурационном файле, чтобы упростить. Например, вы можете определить переменные для ваших макетов, а затем ссылаться на переменную в целевой конфигурации, а не указывать макет напрямую.
Или вы можете создать «пользовательский» набор свойств для добавления в макет.
Или, вы можете делать такие вещи, как создание "день" или "месяц" рендеринга макета строго через конфигурацию:
Вы также можете использовать макет рендера для определения вашего имени файла:
Если вы прокручиваете свой файл ежедневно, каждый файл может называться «Monday.log», «Tuesday.log» и т. Д.
Не бойтесь написать свой собственный рендер. Это просто и позволяет вам добавить свою собственную контекстную информацию в файл журнала через конфигурацию. Например, вот средство визуализации макета (на основе NLog 1.x, а не 2.0), которое может добавить Trace.CorrelationManager.ActivityId в журнал:
Скажите NLog, где ваши расширения NLog (какая сборка) похожи на это:
Используйте пользовательский макет рендеринга, как это:
Используйте асинхронные цели:
И целевые оболочки по умолчанию:
где уместно. См. Документы NLog для получения дополнительной информации о них.
Скажите NLog, чтобы он посмотрел и автоматически перезагрузил конфигурацию, если она изменилась:
Есть несколько вариантов конфигурации, которые помогут с устранением неполадок NLog
См. Справку NLog для получения дополнительной информации.
В NLog 2.0 добавлены обертки LayoutRenderer, которые позволяют выполнять дополнительную обработку на выходе средства визуализации макета (например, обрезать пробел, верхний регистр, нижний регистр и т. Д.).
Не бойтесь заворачивать регистратор, если вы хотите изолировать свой код от жесткой зависимости от NLog, но переносите его правильно. В github-репозитории NLog есть примеры того, как оборачиваться. Другая причина для переноса может заключаться в том, что вы хотите автоматически добавлять определенную контекстную информацию к каждому зарегистрированному сообщению (помещая ее в LogEventInfo.Context).
Есть плюсы и минусы в обертывании (или абстрагировании) NLog (или любой другой фреймворк логирования в этом отношении). Приложив немного усилий, вы можете найти много информации здесь на SO, представляющей обе стороны.
Если вы рассматриваете упаковку, подумайте об использовании Common.Logging . Он работает довольно хорошо и позволяет вам легко переключаться на другую структуру ведения журналов, если вы хотите это сделать. Также, если вы рассматриваете упаковку, подумайте, как вы будете обрабатывать объекты контекста (GDC, MDC, NDC). Common.Logging в настоящее время не поддерживает абстракцию для них, но он предположительно находится в очереди возможностей для добавления.
источник
NewLine
Раскладка выполняет задачу. Вот что я придумал. Это намного проще, чем я ожидал.Трактовать исключения по-разному
Мы часто хотим получить больше информации, когда есть исключение. Следующая конфигурация имеет две цели, файл и консоль, которые фильтруют, есть ли какая-либо информация об исключении. (РЕДАКТИРОВАТЬ: Jarek опубликовал о новом методе сделать это в vNext .)
Ключ должен иметь цель оболочки с
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
источник
condition="length('${exception}')=0
(или, может быть, это==
) кtarget name="file"
.По-видимому, теперь вы можете использовать NLog с Growl для Windows .
источник
Настроить NLog через XML, но программно
Какой? Знаете ли вы, что вы можете указать NLog XML непосредственно для NLog из вашего приложения, в отличие от того, чтобы NLog считывал его из файла конфигурации? Ну, ты можешь. Допустим, у вас есть распределенное приложение, и вы хотите везде использовать одну и ту же конфигурацию. Вы можете хранить конфигурационный файл в каждом месте и поддерживать его отдельно, вы можете хранить его в центральном месте и передавать его в спутниковые местоположения, или вы могли бы сделать много других вещей. Или вы можете сохранить свой XML в базе данных, получить его при запуске приложения и настроить NLog напрямую с этим XML (возможно, периодически проверять, изменился ли он).
Я не уверен, насколько это надежно, но этот пример предоставляет полезную отправную точку для людей, которые могут захотеть попробовать подобную настройку.
источник
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
Регистрация различных уровней в зависимости от того, есть ли ошибка
Этот пример позволяет вам получить больше информации, когда в вашем коде есть ошибка. По сути, он буферизует сообщения и выводит их только на определенном уровне журнала (например, Warn), если не выполнено определенное условие (например, произошла ошибка, поэтому уровень журнала> = Error), затем он выведет больше информации (например, все сообщения от уровней журнала> = Trace). Поскольку сообщения буферизуются, это позволяет вам собирать информацию о том, что произошло до того, как было зарегистрировано Error или ErrorException - очень полезно!
Я адаптировал этот пример из исходного кода . Сначала меня бросили, потому что я пропустил
AspNetBufferingWrapper
(поскольку мое не является приложением ASP) - оказывается, что PostFilteringWrapper требует некоторой буферизованной цели. Обратите внимание, чтоtarget-ref
элемент, использованный в приведенном выше примере, нельзя использовать в NLog 1.0 (я использую 1.0 Refresh для приложения .NET 4.0); необходимо поместить вашу цель в блок обертки. Также обратите внимание, что логический синтаксис (т. Е. Символы больше или меньше символов, <и>) должен использовать символы, а не XML для этих символов (т. Е.>
И<
), иначе NLog приведет к ошибке.app.config:
источник
fileAsCsv
target-ref - это просто артефакт моего тестирования. Я считаю, что у NLog 2 были / были проблемы с CsvLayouts, которых у NLog 1 / Refresh не было.Я дал пару довольно интересных ответов на этот вопрос:
Nlog - Создание раздела заголовка для файла журнала
Добавление заголовка:
Вопрос хотел узнать, как добавить заголовок в файл журнала. Использование таких записей конфигурации позволяет вам определять формат заголовка отдельно от формата остальных записей журнала. Используйте один регистратор, возможно, называемый headerlogger, чтобы зарегистрировать одно сообщение в начале приложения, и вы получите свой заголовок:
Определите заголовок и расположение файлов:
Определите цели, используя макеты:
Определите регистраторы:
Напишите шапку, вероятно, в начале программы:
Это в значительной степени просто еще одна версия идеи «Другое отношение к исключениям».
Регистрировать каждый уровень журнала с разным макетом
Кроме того, автор хотел знать, как изменить формат для каждого уровня ведения журнала. Мне не было ясно, какова конечная цель (и может ли она быть достигнута «лучшим» способом), но я смог предоставить конфигурацию, которая выполняла то, что он просил:
Опять же, очень похоже на трактовку исключений по-разному .
источник
GlobalDiagnosticsContext
раньше.Войти в твиттер
Исходя из этого этом посте о log4net Twitter AppenderЯ подумал, что попробую свои силы в написании NLog Twitter Target (используя обновление NLog 1.0, а не 2.0). Увы, до сих пор я не смог получить твит для успешной публикации. Я не знаю, что-то не так в моем коде, Twitter, интернет-соединении / брандмауэре нашей компании или что-то в этом роде. Я публикую здесь код на случай, если кто-то захочет его опробовать. Обратите внимание, что есть три разных метода «Post». Первый, который я попробовал - это PostMessageToTwitter. PostMessageToTwitter по сути такой же, как PostLoggingEvent в оригинальной публикации. Если я использую это, я получаю исключение 401. PostMessageBasic получает то же исключение. PostMessage работает без ошибок, но сообщение все равно не попадает в Twitter. PostMessage и PostMessageBasic основаны на примерах, которые я нашел здесь на SO.
К вашему сведению - я только что нашел комментарий @Jason Diller к ответу в этом посте, в котором говорится, что твиттер отключит базовую аутентификацию «в следующем месяце». Это было еще в мае 2010 года, а сейчас декабрь 2010 года, поэтому я думаю, что это может быть причиной того, что это не работает.
Настройте это так:
Скажите NLog сборку, содержащую цель:
Настройте цель:
Если кто-то попробует это и добьется успеха, опубликуйте свои выводы
источник
Более простой способ регистрировать каждый уровень журнала с помощью другого макета, используя условные макеты
См. Https://github.com/NLog/NLog/wiki/When-Filter для синтаксиса
источник
Отчетность на внешний сайт / базу данных
Мне нужен был способ просто и автоматически сообщать об ошибках (поскольку пользователи часто этого не делают) из наших приложений. Самым простым решением, которое я мог придумать, был общедоступный URL-адрес - веб-страница, которая может принимать данные и сохранять их в базе данных, - которые отправляют данные при ошибке приложения. (Затем база данных может быть проверена разработчиком или скриптом, чтобы узнать, есть ли новые ошибки.)
Я написал веб-страницу на PHP и создал базу данных, пользователя и таблицу mysql для хранения данных. Я выбрал четыре пользовательские переменные, идентификатор и временную метку. Возможные переменные (включенные в URL или в виде данных POST):
app
(Имя приложения)msg
(сообщение - например, возникла исключительная ситуация ...)dev
(разработчик - например, Пэт)src
(источник - это может быть переменная, относящаяся к машине, на которой запущено приложение, например,Environment.MachineName
или что-то подобное)log
(файл журнала или подробное сообщение)(Все переменные являются необязательными, но ничего не сообщается, если ни одна из них не установлена - поэтому, если вы просто посещаете URL-адрес веб-сайта, ничего не отправляется в БД.)
Чтобы отправить данные на URL, я использовал
WebService
цель NLog . (Обратите внимание, у меня было несколько проблем с этой целью вначале. Только когда я посмотрел на источник, я понял, что мойurl
не может закончиться с/
.)В целом, это неплохая система для отслеживания внешних приложений. (Конечно, вежливая вещь - это сообщить своим пользователям, что вы будете сообщать о потенциально конфиденциальных данных, и дать им возможность отказаться от участия.)
MySQL материал
(Пользователь БД имеет
INSERT
права только для этой таблицы в своей базе данных.)Код сайта
(PHP 5.3 или 5.2 с включенным PDO , файл находится в папке)
index.php
/report
Код приложения (файл конфигурации NLog)
Примечание: могут быть некоторые проблемы с размером файла журнала, но я не нашел простого способа его усечь (например,
tail
команда la * nix ).источник
url
: InnerException: System.InvalidCastException Message = Invalid cast из 'System.String' в 'System.Uri'. Source = mscorlib StackTrace: at System.Convert.DefaultToType (значение IConvertible, тип targetType, поставщик IFormatProvider) в System.String.System.IConvertible.ToType (тип type, поставщик IFormatProvider) в System.Convert.ChangeType (значение объекта, тип преобразования) , Провайдер IFormatProvider)Вход от Silverlight
При использовании NLog с Silverlight вы можете отправить трассировку на сторону сервера через предоставленный веб-сервис. Вы также можете записать в локальный файл в изолированном хранилище, что пригодится, если веб-сервер недоступен. Смотрите здесь для деталей, т.е. используйте что-то вроде этого, чтобы сделать себя целью:
источник