Как вести запись с использованием вертикальных полей вместо горизонтальных столбцов?

Я использую цель NLog.EventLog, и используя API, я хочу зарегистрировать событие в формате вертикального поля.

Он может выглядеть примерно так:

Method:  ServiceBase.Manager.StartService()
Message: The service started successfully.
Result:  The service is listening for requests.

Возможно ли это?

Ответ 1

Конечно, что-то вроде этого:

 <target name="file" xsi:type="File"
         layout="Method: ${callsite} ${newline}Message: ${message}  ${newline}Result: ${event-properties:result}" 
         fileName="${basedir}/${level}.log" />

Вызов журнала, используя пространство имен NLog.Fluent:

logger.Info().Message("The service started successfully.")
             .Property("result", The service is listening for requests.")
             .Write(); 

Ответ 2

Основываясь на ответе Джулиана, я придумал следующее:

- Способ настройки -

Protected Sub ConfigureLogging(ServiceName As String)
  Dim oBuilder As StringBuilder
  Dim oConfig As LoggingConfiguration
  Dim oTarget As EventLogTarget
  Dim oRule As LoggingRule

  oBuilder = New StringBuilder
  oBuilder.Append($"Method:{vbTab}{vbTab}{Layouts.CallSite}(){Layouts.NewLine}")
  oBuilder.Append($"Level:{vbTab}{vbTab}{Layouts.Level}{Layouts.NewLine}")
  oBuilder.Append($"Message:{vbTab}{Layouts.Message}{Layouts.NewLine}")

  oTarget = New EventLogTarget("EventLog")
  oTarget.Layout = oBuilder.ToString
  oTarget.Source = ServiceName

  oRule = New LoggingRule("*", LogLevel.Debug, oTarget)

  oConfig = New LoggingConfiguration
  oConfig.AddTarget(oTarget)
  oConfig.LoggingRules.Add(oRule)

  LogManager.Configuration = oConfig

  Me.Logger = LogManager.GetLogger(ServiceName)
End Sub

- Класс помощника -

Public Class Layouts
  Public Sub New(Layouts As List(Of String))
    Me.Layouts = Layouts
  End Sub

  Shared Sub New()
    _CallSite = "${callsite}"
    _Message = "${message}"
    _NewLine = "${newline}"
  End Sub

  Public Overrides Function ToString() As String
    Return Join(Me.Layouts.ToArray, "|")
  End Function

  Private Layouts As List(Of String)

  ''' <summary>
  ''' The call site (class name, method name and source information).
  ''' </summary>
  Public Shared ReadOnly Property CallSite As String

  ''' <summary>
  ''' The formatted log message.
  ''' </summary>
  Public Shared ReadOnly Property Message As String

  ''' <summary>
  ''' A newline literal.
  ''' </summary>
  Public Shared ReadOnly Property NewLine As String
End Class

... который производит это:

Method:     ServiceBase.Manager.StartService()
Level:      Info
Message:    Service started

Это макет newline, который делает трюк.