2017-02-16 4 views
2

Мне нужно распечатать данные об ошибках в файле NLog после сохранения данных об ошибках в db, и я хочу написать для этого собственный рендеринг макета.Отправить пользовательский объект в пользовательский макет рендеринга NLog ASP.NET Core

[LayoutRenderer("error-data")] 
public class ErrorDataLayoutRenderer : AspNetLayoutRendererBase 
{ 
    protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent) 
    { 
     builder.Append($"{error.Id} | {error.LoggedDate} | {error.Url}"); 
    } 
} 

Я хочу написать в nlog.config:

<target xsi:type="File" name="errors" fileName="c:\log.errors.txt" 
      layout=${error-data}" /> 

И в обслуживании:

var error = service.LogError(data); 
Logger Logger = LogManager.GetCurrentClassLogger(); 
Logger.Error(error); //or something like that 

error - класс, который представляет объект в БД. Он имеет некоторые свойства, такие как: Id, LoggedDate, Summary и т. Д. Как я могу получить объект error здесь?

+0

Что такое 'error'? (Пожалуйста, покажите * в вопросе *, как вы планируете использовать это расширение в конфигурации nlog и как вы планируете использовать его при регистрации из кода.) – Richard

ответ

1

Вы можете отправить его с помощью LogEventInfo. Easierst способ заключается в использовании беглый интерфейсу using NLog.Fluent;

Logging:

var logger = LogManager.GetCurrentClassLogger(); 
var error = ..; 
logger.Error().Property("prop1", error).Write(); //don't forget .Write()! 

В вашей цели:

protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent) 
{ 
    var error = logEvent.Properties["prop1"]; //read the property 
    builder.Append($"{error.Id} | {error.LoggedDate} | {error.Url}"); 
} 
+0

Я не могу установить свойство logger.Error(). Свойство ("prop1 ", ошибка) .Write(); потому что logger.Error() - функция void. –

+1

использовать 'using NLog.Fluent;' NLog 3.2+ – Julian

Смежные вопросы