読者です 読者をやめる 読者になる 読者になる

NLog使い方メモ

C# プログラミング

インストール

Nugetでインストールする。

PM> Install-Package NLog.Config

インストールするとプロジェクトフォルダ配下にconfigファイルが配置される。

f:id:hkou:20160313174619p:plain

ログ出力

class Program
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        logger.Trace("trace");
        logger.Debug("debug");
        logger.Info("info");
        logger.Warn("error");
        logger.Fatal("fatal");
    }
}

"Fluent Interface"形式でも書ける(こっちの書き方の方が各要素が見やすくて好き)

using NLog.Fluent;
class Program
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    static void Main(string[] args)
    {
        logger.Debug()
              .Message("debug")
              .Property("a", "a")
              .Property("b", "b")
              .Write();
    }
}

とりあえずファイル出力する用のConfig

<nlog 省略>
  <targets>
    <target
      name="fileTarget"
      xsi:type="File"
      layout="${longdate} [${threadid:padding=8}] [${uppercase:${level:padding=-5}}] ${callsite}() ${message} ${exception:format=tostring}"
      fileName="${basedir}/logs/${date:format=yyyyMMdd}.log"
      encoding="UTF-8"
      archiveFileName="${basedir}/logs/archive.{#}.log"
      archiveEvery="Day"
      archiveNumbering="Rolling"
      maxArchiveFiles="30" />
  </targets>
  <rules>
    <logger name="fileLogger" minlevel="Trace" writeTo="fileTarget" />
  </rules>
</nlog>

ここまではとりあえずログ出力できればいいやの話。

NLogの構成

ほかにも要素あるけど主要な要素だけの簡単な構成を図示してみた。 とりあえず使うだけならこの4つ押さえておけばOK

f:id:hkou:20160313190018p:plain

JSON形式でログ出力する

JsonLayoutを使用する。NLog.Configに以下を記述。

<target name="jsonFile" xsi:type="File" fileName="log.json">
      <layout xsi:type="JsonLayout">
              <attribute name="time" layout="${longdate}" />
              <attribute name="level" layout="${level:upperCase=true}"/>
              <attribute name="message" layout="${message}" />
       </layout>
</target>

独自のプロパティを出力する

Propertyメソッドで指定。

logger.Debug()
      .Message("debug")
      .Property("PropertyAAA", "prop-value")
      .Write();

NLog.configでは以下のLayoutRenderを使う。

${event-properties:item=PropertyAAA}

複数のプロパティを一気に出力したい場合

logger.Debug()
      .Message("debug")
      .Property("PropertyAAA", "prop-value")
      .Property("PropertyBBB", "prop-value")
      .Property("PropertyCCC", "prop-value")
      .Write();

NLog.config

${all-event-properties}

独自のTarget作る

  • TargetWithLayoutを継承したクラスをNLog.Targets内に作成する。
  • Target名称をTargetAttributeで指定
  • Writeメソッドをオーバーライドして出力処理を記述する。
namespace NLog.Targets
{
    [Target("MyTarget")]
    public class MyTarget : TargetWithLayout
    {
        protected override void Write(LogEventInfo logEvent)
        {
            // logEvent.Message
        }
    }
}

NLog.Config

  • extensionsに独自Targetが入ったアセンブリ名を指定する。
<nlog> 
  <extensions> 
    <add assembly="MyAssembly"/> 
  </extensions>
</nlog>

他のTargetのように使う。

<target name="myTarget" xsi:type="MyTarget">

NLog.config内で動的な項目を使う

NLog.configでプログラムから設定した値を使いたい場合

GlobalDiagnosticsContext.Set("myVariable","someValue");

NLog.config

${gdc:item=myVariable}