2016-10-31 7 views
1

Я использую Serilog для входа в два «sinks».Serilog - Как настраивать форматирование вывода объекта разрушенного класса для файловой раковины

  1. RollingTextFile
  2. Seq

Я хочу войти в сложный тип - объект FileInfo.

В Seq я хочу полный объект и ВСЕ его свойства, доступные мне.

Однако в RollingTextFile мне нужно только «fileInfo.FullName» для печати в текстовом файле, в противном случае текстовый файл грязный и трудный для чтения.

Моя заявка на регистрацию будет следующей:

logger.Information("Processing File: {@fileInfo} - Attempt ({intAttemptCounter}/3).",fileInfo, intAttemptCounter) 

Это работает, как ожидалось с объектом FILEINFO деструктурированного но, как описано выше, производит грязный и нечитаемый текстовый файл.

Я думаю, что мне нужно использовать пользовательский «поставщик форматов», как описано здесь; https://github.com/serilog/serilog/wiki/Formatting-Output#format-providers

Но я не могу решить, как реализовать это для объекта класса fileInfo и применять его только к приемнику RollingTextFile. Я также не могу найти никаких других примеров реализации этого.

ответ

2

Вместо условного форматирования вы можете просто указать имя в сообщении (которое будет отображаться в скользящем файле) и приложить полную информацию как свойство (которое будет отображаться только в Seq).

var withFileInfo = logger.ForContext("File", fileInfo, destructureObjects true); 
withFileInfo.Information("Processing File: {FileName} - Attempt ({intAttemptCounter}/3).", 
    fileInfo.FullName, intAttemptCounter) 

Это приведет к более приятному отображению в Seq, поскольку сообщение будет содержать только простейшее имя файла.

(Кроме того, просто Примечание - withFileInfo регистратор может быть использован повторно на каждой итерации цикла, поэтому стоимость сериализации fileInfo выплачивается только один раз).