Колко гъвкав е NLog? Искам персонализирани свойства на оформлението

Използвам NLog за изпращане на имейли, когато възникне изключение в приложението ми. Ето част от моята цел:

<target xsi:type="Mail"
        name="email"
        subject="${level}:"  .. >

Получавам имейли с теми като „Грешка:“ или „Фатално:“. Това работи добре, но искам да добавя Exception.Message към темата на имейла

Възможно ли е да настроите потребителски свойства в NLog. Не мога да намеря как да направя това, така че само за да стане ясно какво искам, тук е пример за това, което се опитвам да направя:

m_oLogger.Fatal( oException.BuildMessage(), new {MyMessage=oException.Message});

*Имайте предвид, че BuildMessage() е просто метод за разширение за преобразуване на пълните подробности за изключения (включително вътрешни изключения) в четим низ

И в моята цел:

<target xsi:type="Mail"
        name="email"
        subject="${level}: ${Custom.MyMessage}"  .. >

Тогава щях да получавам имейли с теми като:

Фатално: Синтактична грешка в параметри или аргументи. Отговорът на сървъра беше: Акаунтът не съществува

Възможна ли е такава гъвкавост с NLog? Ако не, знаете ли за други .NET платформи за регистриране, които предлагат този вид функционалност?


person Typo Johnson    schedule 19.02.2011    source източник


Отговори (3)


Като цяло, вместо да създавате персонализиран layoutRenderer, предложен от wageoghe, е възможно да използвате EventContext-Layout-Renderer, който позволява предаването на произволен брой персонализирани  свойства

LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "Pass my custom value");
theEvent.Properties["MyValue"] = "My custom string";`

log.Log(theEvent);

и във вашия файл NLog.config:

${event-context:item=MyValue} -- renders "My custom string

За конкретния https://github.com/nlog/NLog/wiki/Exception-Layout-Renderer форматът трябва да бъде

 ${exception:format=message}
person Michael Freidgeim    schedule 20.07.2013
comment
Благодаря много :) спестихте ми много време :) стрелка нагоре. - person sebastian; 19.09.2018

Много е лесно да добавите персонализиран LayoutRenderer към NLog. Вижте първия ми отговор на този въпрос за пример на LayoutRenderer, който ви позволява да добавите System .Diagnostics.Trace.CorrelationManager.ActivityId стойност към вашия изход за регистриране.

За да направите това, което искате, вероятно нямате нужда от персонализиран LayoutRenderer. Ако искате да изпратите имейл, чиято тема е регистрационното ниво ПЛЮС свойството Message на изключението, трябва да можете да конфигурирате нещо подобно:

<target xsi:type="Mail"
            name="email"         
            subject="${level}: ${exception.Message}"  ..>

Това трябва да създаде темата на имейла чрез свързване на нивото и стойността на свойството Exception.Message. Ще трябва да извикате претоварването на регистриране, което приема изключение като параметър.

това помага ли

person wageoghe    schedule 21.02.2011
comment
Може и да стане, ще опитам по-късно. Така че, вместо сам да създавам съобщението за изключение и да подавам низ чрез oException.BuildMessage(), мога да оформя съобщението в NLog.config, използвайки ${exception.[property]}. Благодаря, ще се върна с актуализация по-късно - person Typo Johnson; 21.02.2011

Това вероятно е непрактично: почти съм сигурен, че рамката на NLog няма отражение като част от своя формат за регистриране [за да го направите, ще е необходимо NLog да има някаква концепция за това къде са вашите референтни сборки и какъв е техният тип. ]

Можете ли просто да направите цялото си анализиране/форматиране на съобщения в C# кода и да го предадете като част от вече съществуващите променливи? Те изброяват много от тях в документацията за Mail-target NLog.

person David Elner    schedule 21.02.2011
comment
Да, вероятно сте прав, че анонимен обект би бил непрактичен, не мисля, че отразяването би било необходимо, може би просто динамичен параметър. Речник обаче би бил тривиален и означава, че мога да предам всичко и да го използвам в NLog.config. - person Typo Johnson; 21.02.2011