Как вести запись с использованием вертикальных полей вместо горизонтальных столбцов?
Я использую цель 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
, который делает трюк.