5

NLog 2 を使用して、いくつかの監査情報を SQL Server 2008 テーブルに記録しようとしています。パラメーターを SQL 挿入クエリに渡すことができるようにするために、 LogEventInfo とEvent Context Layout Rendererを使用しています。

ロギング自体は機能しますが、日時は秒精度でのみ保存されます。ミリ秒の精度で保存できるようにしたいのですが、これを行う方法を示すものは何も見つかりませんでした。

これは、イベントをログに記録する C# コードです。

private void LogMessage(DateTime requestDateTime)
{
    LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "Pass my custom value");
    theEvent.Properties["RequestDate"] = requestDateTime;
}

これは、私の NLog.config 構成にあるターゲットです。

<target xsi:type="Database"
      name="SqlLog"
      dbProvider="sqlserver"
      connectionString="server=localhost;database=Test;integrated security=sspi">
  <commandText>
    INSERT [dbo].[ApiLog]
    (
        [ServerName], [RequestDate]
    )
    VALUES (@ServerName, @RequestDate);
  </commandText>
  <parameter name="@ServerName" layout="${machinename}"/>
  <parameter name="@RequestDate" layout="${event-context:item=RequestDate}"/>
</target>

私が見つけた回避策がありますがtheEvent.Properties["RequestDate"] = requestDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")、日時の書式設定とカルチャで問題が発生する可能性があるため、これを行う必要はありません。

NLog.configのconfigで精度を変更できる方法を知っている人はいますか?

4

1 に答える 1

1

Convert.ToString探している精度を失うEventContextLayoutRenderer の使用のように見えます。

public class EventContextLayoutRenderer : LayoutRenderer
{
    //....

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        object value;

        if (logEvent.Properties.TryGetValue(this.Item, out value))
        {
            builder.Append(Convert.ToString(value, CultureInfo.InvariantCulture));
        }
    }
}

おそらくご存知のように (そして、それがあなたの状況で役立つかどうかはわかりません)、フォーマットを指定できる Date レイアウトや、次のようなものを提供する LongDate レイアウトがあります。2014-01-01 12:12:12.1234

編集

それだけの価値があるため、顧客のレイアウトレンダラーを非常に簡単に追加できます

[LayoutRenderer("event-context-dateTime")]
public class DateTimeContextLayoutRenderer : EventContextLayoutRenderer
{
    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        object value;

        if (logEvent.Properties.TryGetValue(this.Item, out value))
        {
            //Your code here
        }
    }
}

そして、あなたの構成では

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <extensions>
    <add assembly="YourAssembly"/>
  </extensions>
  <targets>
    <target xsi:type="File" name="file"  fileName="c:\temp\NlogLayout.txt" 
     layout="${longdate} ${event-context-dateTime:item=RequestDate}" />
   ...
</nlog>
于 2014-02-20T13:47:16.153 に答える