2017-04-19 3 views
0

私は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(); 
+0

優秀!これはキーである 'NewLine'レイアウトです。私はロギングコールの冗長性について少し説明したかったので、最初の設定でレイアウトを使用しました。コードの私の代わりの答えを参照してください。 – InteXX

+0

それにもかかわらず、 'event-properties'レイアウトについて知っておきましょう。私はその道をうまく利用することができます。そして流暢な構文も。ありがとう。 – InteXX

0

ジュリアンの回答に基づいて、私はこれを作ってみた:

- 構成方法 -

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 

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

それはトリックを行いnewlineレイアウトです:これを生成

--helper Class--

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 

...。

関連する問題