Nancyのトレース機能

ナンシーのトレース機能について調べてみました。

まずはBootstrapperのサブクラスを作成してトレース機能を有効にします。

using Nancy;
using Nancy.Bootstrapper;
using Nancy.TinyIoc;
using Nancy.Diagnostics;

namespace NanNan
{
    public class MyBootstrapper : DefaultNancyBootstrapper
    {
        protected override Nancy.Diagnostics.DiagnosticsConfiguration DiagnosticsConfiguration
        {
            //ダッシュボードへログインする際のパスワードを設定する必要あり。
            get
            {
                return new Nancy.Diagnostics.DiagnosticsConfiguration() { Password = @"Abcd@1234" };
            }
        }

        protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, IPipelines pipelines)
        {
            //トレースを有効にする
            StaticConfiguration.EnableRequestTracing = true;
        }
    }
}


次にモジュールにトレース処理を組み込みます。
これでモジュールの該当ルートへリクエストが発生する度にトレースされるようになります。

using Nancy;
using System;

namespace NanNan
{
    public class MyModule : NancyModule
    {
        public IndexModule()
        {

            Get["/"] = _ =>
                {
                    Context.Trace.TraceLog.WriteLog((s) => 
                    { 
                        s.AppendFormat("ルートへのアクセス:{0}", System.DateTime.Now.Ticks.ToString()); 
                    });

                    return "hello, root";
                };

            Get["/aaa"] = _ =>
            {
                Context.Trace.TraceLog.WriteLog((s) =>
                {
                    s.AppendFormat("aaaへのアクセス:{0}", System.DateTime.Now.Ticks.ToString());
                });

                return "hello, aaa";
            };
        }
    }
}


トレースログを確認するには、ダッシュボードへアクセスします。
<アプリケーションURL>/_Nancy でアクセスすることができます。

1,ログインページ
f:id:ham007:20130729132251p:plain
2,ダッシュボードページ。トラッキングメニューを選びます。
f:id:ham007:20130729132553p:plain
3,ユーザーセッション一覧ページ(と思う)
f:id:ham007:20130729132903p:plain
4,セッション内アクセス一覧ページ
f:id:ham007:20130729132912p:plain
5,アクセス時情報出力ページ
ページ下部にトレース情報が出力されます。
f:id:ham007:20130729132918p:plain



全てのルートへのアクセスに対してトレースしたい場合は、Bootstrapperで設定することが可能。
また、パイプラインのOnErrorでエラー時トレースを行うことも可能。

using Nancy;
using Nancy.Bootstrapper;
using Nancy.TinyIoc;
using Nancy.Diagnostics;

namespace NanNan
{
    public class MyBootstrapper : DefaultNancyBootstrapper
    {
        protected override Nancy.Diagnostics.DiagnosticsConfiguration DiagnosticsConfiguration
        {
            //ダッシュボードを有効にする
            get
            {
                return new Nancy.Diagnostics.DiagnosticsConfiguration() { Password = @"Tonkatu@1919" };
            }
        }

        protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, IPipelines pipelines)
        {
            //トレースを有効にする
            StaticConfiguration.EnableRequestTracing = true;

            pipelines.BeforeRequest += (ctx) =>
            {
            	//Nullを返すことで、リクエスト処理を以降のパイプラインに任せる。
            	//ここで意味のあるレスポンスを返すと、リクエスト処理がこの時点で終了する。
                ctx.Trace.TraceLog.WriteLog((s) => { s.AppendLine("ビフォーリクエスト!!"); });
                return null;
            };

            pipelines.AfterRequest += (ctx) =>
            {
                ctx.Trace.TraceLog.WriteLog((s) => { s.AppendLine("アフターリクエスト!!"); });
            };

            pipelines.OnError += (ctx, err) =>
            {
                ctx.Trace.TraceLog.WriteLog((s) => { s.AppendLine("エラーが発生:" + err.Message); });
                //本当はエラーページのViewなどを返す。
                return err.Message;
            };
        }
    }
}