BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

Bot Framework のメッセージ を ログ するための IActivityLogger ( C# ) の概要

ボットとユーザーの会話のロギングに便利な IActivityLogger インターフェースのメモです。

まず最初にまとめですが、IActivityLogger インターフェースを実装したログの出力クラスを定義しておけば、ボットがメッセージを受け取ったときや送信したときに、その内容をログをはいてくれます。

基本的なところのメモです。さっそくC#で実装して動作を見てみます♪

Overview

Environment

IActivityLogger の実装して動作を確認

開発の事前準備、プロジェクトテンプレートのセット、エミュレーターの容易はOKと。

beachside.hatenablog.com

(そろそろここの情報更新も必要か…)

では、サクッとプロジェクトを作成していきましょう。

プロジェクトの作成

Visual Studio 2017 のここから新しいプロジェクトを作成!

f:id:beachside:20170823230532p:plain


検索に「bot」と入力して、「Bot Application」と入力して、プロジェクトの名前は適当に入れて(今回は、「BotLoggingDemo1」としました)、OKボタンをクリックしてアプリケーションを作成します。

f:id:beachside:20170823230554p:plain

(どうでもいいネタですが、.NET Framework 4.7 を指定してもテンプレートの影響で4.6のアプリが作られます)

プロジェクトを作成すると、恒例のメッセージの文字数を返してくれる出来上がりです。

Nuget パッケージの更新

私的に恒例の作業。別にやらなくてもいいんですが、個人的には気持ち悪いので新しくプロジェクトを作るときはいつもやってます。

パッケージマネージャーコンソールを開き(表示がない場合は、上部メニューの ツール >Nuget パッケージ マネージャー > パッケージ マネージャー コンソール)、コマンドを叩いて一括更新です。

update-package

今回だと、BotBuilder と Autofac は以下のバージョンになりました。

DebugActivityLogger クラスの作成

動作確認用にクラスをてきとーに作ります。ソリューションエクスプローラーでプロジェクト名を右クリック > 追加 > クラス をクリックし、クラス名が「DebugActivityLogger」というクラスを作ります。 クラスの実装は、IActivityLogger インターフェースを実装し、LogAsync メソッドを以下ように実装します。

Visual Studio 2017 の出力ウインドウに、メッセージのやり取りをするログを出力するコードになります。

DI の設定

Bot Framewrok …というかBotBuilderでは、Autofac というDIコンテナが使われているので、そこをアップデートする仕組みが用意されています。 ソリューションエクスプローラーで、Globa.asax.cs を開いて以下のように実装します。

16行目の RegisterDependencies() メソッドを作って、DIコンテナーを更新しています。で、11行目でそのメソッドを呼び出してました。


動作確認

(出力ウインドウが行方不明の場合は、 ショートカットキー Ctrl + Alt + O で表示できるはずです。)

デバッグ実行して、エミュレーターからボットにメッセージを投げて、出力ウインドウにログが出ているか見てみます。
エミュレーターの起動とか設定の手順は省略します。)

f:id:beachside:20170823230619p:plain

エミュレーターからボットにメッセージを受信したメッセージ、ボットがエミュレーターにメッセージを返したメッセージが出力されました♪


IActivityLogger について

IActivityLogger は、BotBuilder で用意されているインターフェースです。
IActivityLogger のデフォルトのDI設定は、BotBuilder の中(Microsoft.Bot.Builder.Autofac の DialogModule クラス)で、NullActivityLoggerクラスが登録されています。
NullActivityLoggerクラスは、ログ出力時に呼ばれる LogAsyncメソッドの中身が空のためログが出力されません。

ログ出力のタイミングは、BotBuilderの中のMicrosoft.Bot.Builder.Dialogs.InternalsLogPostToBotクラス と LogBotToUser クラスのメソッドが呼ばれてるタイミングで、….調べてたら…書くほどのことじゃないな…ざっくりですが、メッセージを受信したタイミングと送信したタイミングです!(BotBuilder のソースをVSで開けば、CodeLensで呼ばれてるところがすぐわかりるので省略♪)。

TraceActivityLogger クラス

BotBuilderの中の Bot.Builder.HistoryTraceActivityLogger クラスがあります。

このクラスの LogAsync メソッドの実装はシンプルで、System.Diagnostics クラスの Trace.TraceInformation メソッドを使って、IActivity クラスをシリアライズしてログに出力してるだけです。 ここでは詳しく書きませんが、Azure の WebApps とかでログの設定してサクッとログ出力するのに使えるやつです。

今回のサンプルで、Global.asax.csで行ったDIの実装を TraceActivityLogger に変えてデバッグすると、IActivity の中身が出力ウインドウに出力されます。

f:id:beachside:20170823230632p:plain

おわりに

次回は会話のログを Azure の Table Storage に出力します。

beachside.hatenablog.com

 参考 

docs.microsoft.com