ボットとユーザーの会話のロギングに便利な IActivityLogger インターフェースのメモです。
まず最初にまとめですが、IActivityLogger
インターフェースを実装したログの出力クラスを定義しておけば、ボットがメッセージを受け取ったときや送信したときに、その内容をログをはいてくれます。
基本的なところのメモです。さっそくC#で実装して動作を見てみます♪
Overview
Environment
- Visual Studio 2017
- .NET Framework 4.6
- (NuGet) Microsoft.Bot.Builder v3.9
IActivityLogger の実装して動作を確認
開発の事前準備、プロジェクトテンプレートのセット、エミュレーターの容易はOKと。
(そろそろここの情報更新も必要か...)
では、サクッとプロジェクトを作成していきましょう。
プロジェクトの作成
Visual Studio 2017 のここから新しいプロジェクトを作成!
検索に「bot」と入力して、「Bot Application」と入力して、プロジェクトの名前は適当に入れて(今回は、「BotLoggingDemo1」としました)、OKボタンをクリックしてアプリケーションを作成します。
(どうでもいいネタですが、.NET Framework 4.7 を指定してもテンプレートの影響で4.6のアプリが作られます)
プロジェクトを作成すると、恒例のメッセージの文字数を返してくれる出来上がりです。
Nuget パッケージの更新
私的に恒例の作業。別にやらなくてもいいんですが、個人的には気持ち悪いので新しくプロジェクトを作るときはいつもやってます。
パッケージマネージャーコンソールを開き(表示がない場合は、上部メニューの ツール
>Nuget パッケージ マネージャー
> パッケージ マネージャー コンソール
)、コマンドを叩いて一括更新です。
update-package
今回だと、BotBuilder と Autofac は以下のバージョンになりました。
- Autofac : v4.6.1
- Microsoft.Bot.Builder : v3.9.0
DebugActivityLogger クラスの作成
動作確認用にクラスをてきとーに作ります。ソリューションエクスプローラーでプロジェクト名を右クリック > 追加
> クラス
をクリックし、クラス名が「DebugActivityLogger」というクラスを作ります。
クラスの実装は、IActivityLogger
インターフェースを実装し、LogAsync
メソッドを以下ように実装します。
Visual Studio 2017 の出力ウインドウに、メッセージのやり取りをするログを出力するコードになります。
DI の設定
Bot Framewrok ...というかBotBuilderでは、Autofac というDIコンテナが使われているので、そこをアップデートする仕組みが用意されています。 ソリューションエクスプローラーで、Globa.asax.cs を開いて以下のように実装します。
16行目の RegisterDependencies()
メソッドを作って、DIコンテナーを更新しています。で、11行目でそのメソッドを呼び出してました。
動作確認
(出力ウインドウが行方不明の場合は、 ショートカットキー Ctrl
+ Alt
+ O
で表示できるはずです。)
デバッグ実行して、エミュレーターからボットにメッセージを投げて、出力ウインドウにログが出ているか見てみます。
(エミュレーターの起動とか設定の手順は省略します。)
エミュレーターからボットにメッセージを受信したメッセージ、ボットがエミュレーターにメッセージを返したメッセージが出力されました♪
IActivityLogger について
IActivityLogger
は、BotBuilder で用意されているインターフェースです。
IActivityLogger
のデフォルトのDI設定は、BotBuilder の中(Microsoft.Bot.Builder.Autofac
の DialogModule
クラス)で、NullActivityLogger
クラスが登録されています。
NullActivityLogger
クラスは、ログ出力時に呼ばれる LogAsync
メソッドの中身が空のためログが出力されません。
ログ出力のタイミングは、BotBuilderの中のMicrosoft.Bot.Builder.Dialogs.Internals
の LogPostToBot
クラス と LogBotToUser
クラスのメソッドが呼ばれてるタイミングで、....調べてたら...書くほどのことじゃないな...ざっくりですが、メッセージを受信したタイミングと送信したタイミングです!(BotBuilder のソースをVSで開けば、CodeLensで呼ばれてるところがすぐわかりるので省略♪)。
TraceActivityLogger クラス
BotBuilderの中の Bot.Builder.History
に TraceActivityLogger
クラスがあります。
このクラスの LogAsync
メソッドの実装はシンプルで、System.Diagnostics
クラスの Trace.TraceInformation
メソッドを使って、IActivity
クラスをシリアライズしてログに出力してるだけです。 ここでは詳しく書きませんが、Azure の WebApps とかでログの設定してサクッとログ出力するのに使えるやつです。
今回のサンプルで、Global.asax.csで行ったDIの実装を TraceActivityLogger
に変えてデバッグすると、IActivity
の中身が出力ウインドウに出力されます。
おわりに
次回は会話のログを Azure の Table Storage に出力します。