スポンサーリンク

NLogでスタックトレースをテキストのログへ出力するNLog.configの設定例

ロギングはずっとlog4netを使っていたのですが、さすがにこれ以上何も発展は無さそうなので、今後はNLogを使ってみようなどと考えています。

NLog

と言うことで、表題の通りスタックトレースを出力する設定例。あれこれ検索しつつ、ある程度思ったようなレイアウトになったのでメモ。2.0から追加されたonexceptionで無用な改行とか押さえられる感じに。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="xml"><span class="hljs-meta"><?xml version="1.0" encoding="utf-8" ?></span>
<span class="hljs-tag"><<span class="hljs-name">nlog</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.nlog-project.org/schemas/NLog.xsd"</span>
<span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span>></span>
<span class="hljs-comment"><!--
See http://nlog-project.org/wiki/Configuration_file
for information on customizing logging rules and outputs.
--></span>
<span class="hljs-tag"><<span class="hljs-name">targets</span>></span>
<span class="hljs-comment"><!-- add your targets here --></span>
<span class="hljs-tag"><<span class="hljs-name">target</span> <span class="hljs-attr">xsi:type</span>=<span class="hljs-string">"File"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"f"</span> <span class="hljs-attr">fileName</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{basedir}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">/logs/$</span></span></span><span class="hljs-template-variable">{shortdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">.log"</span>
<span class="hljs-attr">layout</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{longdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> $</span></span></span><span class="hljs-template-variable">{level:uppercase=true}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">&#009;[$</span></span></span><span class="hljs-template-variable">{callsite}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">] $</span></span></span><span class="hljs-template-variable">{message}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> $</span></span></span><span class="hljs-template-variable">{onexception: ${newline}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> $</span></span></span><span class="hljs-template-variable">{exception:format=Message, Type, ToString:separator=*}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">}"</span>
<span class="hljs-attr">header</span>=<span class="hljs-string">"[$</span></span></span><span class="hljs-template-variable">{longdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">: $</span></span></span><span class="hljs-template-variable">{processname}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> Start.]"</span>
<span class="hljs-attr">footer</span>=<span class="hljs-string">"[$</span></span></span><span class="hljs-template-variable">{longdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">: End.]"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">targets</span>></span>
<span class="hljs-tag"><<span class="hljs-name">rules</span>></span>
<span class="hljs-comment"><!-- add your logging rules here --></span>
<span class="hljs-tag"><<span class="hljs-name">logger</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"*"</span> <span class="hljs-attr">minlevel</span>=<span class="hljs-string">"Trace"</span> <span class="hljs-attr">writeTo</span>=<span class="hljs-string">"f"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">rules</span>></span>
<span class="hljs-tag"></<span class="hljs-name">nlog</span>></span></span>
<span class="xml"><span class="hljs-meta"><?xml version="1.0" encoding="utf-8" ?></span> <span class="hljs-tag"><<span class="hljs-name">nlog</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.nlog-project.org/schemas/NLog.xsd"</span> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span>></span> <span class="hljs-comment"><!-- See http://nlog-project.org/wiki/Configuration_file for information on customizing logging rules and outputs. --></span> <span class="hljs-tag"><<span class="hljs-name">targets</span>></span> <span class="hljs-comment"><!-- add your targets here --></span> <span class="hljs-tag"><<span class="hljs-name">target</span> <span class="hljs-attr">xsi:type</span>=<span class="hljs-string">"File"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"f"</span> <span class="hljs-attr">fileName</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{basedir}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">/logs/$</span></span></span><span class="hljs-template-variable">{shortdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">.log"</span> <span class="hljs-attr">layout</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{longdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> $</span></span></span><span class="hljs-template-variable">{level:uppercase=true}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">&#009;[$</span></span></span><span class="hljs-template-variable">{callsite}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">] $</span></span></span><span class="hljs-template-variable">{message}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> $</span></span></span><span class="hljs-template-variable">{onexception: ${newline}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> $</span></span></span><span class="hljs-template-variable">{exception:format=Message, Type, ToString:separator=*}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">}"</span> <span class="hljs-attr">header</span>=<span class="hljs-string">"[$</span></span></span><span class="hljs-template-variable">{longdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">: $</span></span></span><span class="hljs-template-variable">{processname}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> Start.]"</span> <span class="hljs-attr">footer</span>=<span class="hljs-string">"[$</span></span></span><span class="hljs-template-variable">{longdate}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">: End.]"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">targets</span>></span> <span class="hljs-tag"><<span class="hljs-name">rules</span>></span> <span class="hljs-comment"><!-- add your logging rules here --></span> <span class="hljs-tag"><<span class="hljs-name">logger</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"*"</span> <span class="hljs-attr">minlevel</span>=<span class="hljs-string">"Trace"</span> <span class="hljs-attr">writeTo</span>=<span class="hljs-string">"f"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">rules</span>></span> <span class="hljs-tag"></<span class="hljs-name">nlog</span>></span></span>
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!-- 
  See http://nlog-project.org/wiki/Configuration_file 
  for information on customizing logging rules and outputs.
   -->
  <targets>
    <!-- add your targets here -->
    
    
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${level:uppercase=true}&#009;[${callsite}] ${message} ${onexception: ${newline} ${exception:format=Message, Type, ToString:separator=*}}"
            header="[${longdate}: ${processname} Start.]"
            footer="[${longdate}: End.]"/>
   
  </targets>

  <rules>
    <!-- add your logging rules here -->
    
    
    <logger name="*" minlevel="Trace" writeTo="f" />
   
  </rules>
</nlog>

これで以下のような出力結果になります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
2013<span class="hljs-selector-tag">-10-09</span> 16<span class="hljs-selector-pseudo">:36</span><span class="hljs-selector-pseudo">:46.9526</span> <span class="hljs-selector-tag">INFO</span> <span class="hljs-selector-attr">[TestService1.LogOut.<.ctor>b__0]</span> **** <span class="hljs-selector-tag">Log</span> <span class="hljs-selector-tag">Start</span> ***
2013<span class="hljs-selector-tag">-10-09</span> 16<span class="hljs-selector-pseudo">:36</span><span class="hljs-selector-pseudo">:46.9526</span> <span class="hljs-selector-tag">ERROR</span> <span class="hljs-selector-attr">[TestService1.Service1.OnStart]</span> 無効な <span class="hljs-selector-tag">URI</span>: 無効なポートが指定されています。
無効な <span class="hljs-selector-tag">URI</span>: 無効なポートが指定されています。*<span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.UriFormatException</span>*<span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.UriFormatException</span>: 無効な <span class="hljs-selector-tag">URI</span>: 無効なポートが指定されています。
場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Uri</span><span class="hljs-selector-class">.CreateThis</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">uri</span>, <span class="hljs-selector-tag">Boolean</span> <span class="hljs-selector-tag">dontEscape</span>, <span class="hljs-selector-tag">UriKind</span> <span class="hljs-selector-tag">uriKind</span>)
場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Uri</span>.<span class="hljs-selector-class">.ctor</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">uriString</span>, <span class="hljs-selector-tag">UriKind</span> <span class="hljs-selector-tag">uriKind</span>)
場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Web</span><span class="hljs-selector-class">.Http</span><span class="hljs-selector-class">.SelfHost</span><span class="hljs-selector-class">.HttpSelfHostConfiguration</span><span class="hljs-selector-class">.CreateBaseAddress</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">baseAddress</span>)
場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Web</span><span class="hljs-selector-class">.Http</span><span class="hljs-selector-class">.SelfHost</span><span class="hljs-selector-class">.HttpSelfHostConfiguration</span>.<span class="hljs-selector-class">.ctor</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">baseAddress</span>)
場所 <span class="hljs-selector-tag">TestService1</span><span class="hljs-selector-class">.Service1</span><span class="hljs-selector-class">.OnStart</span>(<span class="hljs-selector-tag">String</span><span class="hljs-selector-attr">[]</span> <span class="hljs-selector-tag">args</span>) 場所 <span class="hljs-selector-tag">c</span>:\<span class="hljs-selector-tag">Users</span>\<span class="hljs-selector-tag">jptais1</span>\<span class="hljs-selector-tag">Documents</span>\<span class="hljs-selector-tag">Visual</span> <span class="hljs-selector-tag">Studio</span> 2012\<span class="hljs-selector-tag">Projects</span>\<span class="hljs-selector-tag">ProcessHost</span>\<span class="hljs-selector-tag">TestService1</span>\<span class="hljs-selector-tag">Service1</span><span class="hljs-selector-class">.cs</span>:行 38
2013<span class="hljs-selector-tag">-10-09</span> 16<span class="hljs-selector-pseudo">:36</span><span class="hljs-selector-pseudo">:46.9526</span> <span class="hljs-selector-tag">INFO</span> <span class="hljs-selector-attr">[TestService1.LogOut.<.ctor>b__0]</span> **** <span class="hljs-selector-tag">Log</span> <span class="hljs-selector-tag">Start</span> *** 2013<span class="hljs-selector-tag">-10-09</span> 16<span class="hljs-selector-pseudo">:36</span><span class="hljs-selector-pseudo">:46.9526</span> <span class="hljs-selector-tag">ERROR</span> <span class="hljs-selector-attr">[TestService1.Service1.OnStart]</span> 無効な <span class="hljs-selector-tag">URI</span>: 無効なポートが指定されています。 無効な <span class="hljs-selector-tag">URI</span>: 無効なポートが指定されています。*<span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.UriFormatException</span>*<span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.UriFormatException</span>: 無効な <span class="hljs-selector-tag">URI</span>: 無効なポートが指定されています。 場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Uri</span><span class="hljs-selector-class">.CreateThis</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">uri</span>, <span class="hljs-selector-tag">Boolean</span> <span class="hljs-selector-tag">dontEscape</span>, <span class="hljs-selector-tag">UriKind</span> <span class="hljs-selector-tag">uriKind</span>) 場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Uri</span>.<span class="hljs-selector-class">.ctor</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">uriString</span>, <span class="hljs-selector-tag">UriKind</span> <span class="hljs-selector-tag">uriKind</span>) 場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Web</span><span class="hljs-selector-class">.Http</span><span class="hljs-selector-class">.SelfHost</span><span class="hljs-selector-class">.HttpSelfHostConfiguration</span><span class="hljs-selector-class">.CreateBaseAddress</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">baseAddress</span>) 場所 <span class="hljs-selector-tag">System</span><span class="hljs-selector-class">.Web</span><span class="hljs-selector-class">.Http</span><span class="hljs-selector-class">.SelfHost</span><span class="hljs-selector-class">.HttpSelfHostConfiguration</span>.<span class="hljs-selector-class">.ctor</span>(<span class="hljs-selector-tag">String</span> <span class="hljs-selector-tag">baseAddress</span>) 場所 <span class="hljs-selector-tag">TestService1</span><span class="hljs-selector-class">.Service1</span><span class="hljs-selector-class">.OnStart</span>(<span class="hljs-selector-tag">String</span><span class="hljs-selector-attr">[]</span> <span class="hljs-selector-tag">args</span>) 場所 <span class="hljs-selector-tag">c</span>:\<span class="hljs-selector-tag">Users</span>\<span class="hljs-selector-tag">jptais1</span>\<span class="hljs-selector-tag">Documents</span>\<span class="hljs-selector-tag">Visual</span> <span class="hljs-selector-tag">Studio</span> 2012\<span class="hljs-selector-tag">Projects</span>\<span class="hljs-selector-tag">ProcessHost</span>\<span class="hljs-selector-tag">TestService1</span>\<span class="hljs-selector-tag">Service1</span><span class="hljs-selector-class">.cs</span>:行 38
2013-10-09 16:36:46.9526 INFO  [TestService1.LogOut.<.ctor>b__0] **** Log Start *** 
2013-10-09 16:36:46.9526 ERROR [TestService1.Service1.OnStart] 無効な URI: 無効なポートが指定されています。 
 無効な URI: 無効なポートが指定されています。*System.UriFormatException*System.UriFormatException: 無効な URI: 無効なポートが指定されています。
   場所 System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
   場所 System.Uri..ctor(String uriString, UriKind uriKind)
   場所 System.Web.Http.SelfHost.HttpSelfHostConfiguration.CreateBaseAddress(String baseAddress)
   場所 System.Web.Http.SelfHost.HttpSelfHostConfiguration..ctor(String baseAddress)
   場所 TestService1.Service1.OnStart(String[] args) 場所 c:\Users\jptais1\Documents\Visual Studio 2012\Projects\ProcessHost\TestService1\Service1.cs:行 38

ちなみにNLogでは上のスタックトレース情報のようなExceptionオブジェクトをログに書き出す場合には、通常のメッセージだけの出力とは別の[Level]Exception(exp. ErrorException())メソッドを使用するので間違いないようにしましょう。

コメント

タイトルとURLをコピーしました