ロギングはずっとlog4netを使っていたのですが、さすがにこれ以上何も発展は無さそうなので、今後はNLogを使ってみようなどと考えています。
NLog
と言うことで、表題の通りスタックトレースを出力する設定例。あれこれ検索しつつ、ある程度思ったようなレイアウトになったのでメモ。2.0から追加されたonexceptionで無用な改行とか押さえられる感じに。
<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">	[$</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">	[$</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}	[${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>
これで以下のような出力結果になります。
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())メソッドを使用するので間違いないようにしましょう。
コメント