ロボットの実行ログとして残したい情報
RPAエンジニア 小林
ロボットを扱っていて思ったように動作しないとき、どのように動いたか、どこまで処理が進んだのかという動作の道筋を見たいときがあります。UiPathでロボットを実行した場合、自動でログファイルに情報が書き出されますが、知りたい情報によっては自分で別のファイルに書き出すほうが便利です。今回は自分用(あるいはチーム用)のロボット実行ログを書き出すにあたって、どのような情報を出力したらよいか考えてみます。UiPathを例に話を進めますが、他のRPAでも共通して使える考え方です。
なお、UiPathで通常「ログファイル」と言えばUiPath Studioの「ログを開く」ボタンからアクセスできる実行ログを指しますが、以下では「ロボット開発者が動作記録のために成果物とは別に書き出すファイル」を「ログファイル」と呼びます。ログファイルの書き出し形式は開発者が扱いやすい形式で構いませんが、基本的には文字列を追加書き込み(UiPath.Core.Activities.AppendLine)アクティビティを使ってテキストファイルに追記していく方法が便利です。
実行時の状況を再現するための情報
ロボットがどのような環境で何を操作したのかがわかると後で状況が再現しやすくなります。また、過去に正常に動作したときの記録があれば、エラーが起きてしまっても設定を見比べて手がかりを得ることができます。具体的には、以下のような情報を残しておくと良いでしょう。
ロボットが扱ったファイル
ロボットが扱ったファイル(データとして参照したCSVファイルや結果を出力したExcelファイルなど)がわかるようにしておくと、設定したファイル名やファイル自体に問題がないかスムーズに調べられます。例えばログファイルの冒頭に次のような内容を記入するようにすれば、どのようなファイルを扱うロボットなのかわかりやすくなります。
参照データ: C:\path\to\data\data.csv 出力先ファイル: C:\path\to\result\result.xlsx
パラメータの設定値
ここで言うパラメータとはロボットを実行する前に設定する必要がある値を指します。例えば複数の実行モードを用意しているロボットなら、どの実行モードで実行したかの記録は必須と言えます。また、データの何行目から処理するか、処理の完了後に誰に通知メールを送るかなども設定することがあると思います。このような実行の度に異なる設定値はログとして残っていると、バグが発覚した際にも原因が調べやすくなります。パラメータの情報もログファイル冒頭に列挙しておくと良いでしょう。
実行モード: 1 処理開始行: 5 完了メール送信先: example@example.com
実行したプロジェクト
実行したプロジェクトがある場所のパスも出力しておくと役立ちます。対象のプロジェクトをすぐに開くことができますし、実行するロボットや参照するログファイルを間違うというミスの防止にもなります。基本的には環境変数を取得(UiPath.Core.Activities.GetEnvironmentVariable)アクティビティでCurrentDirectoryを指定してプロジェクトのあるディレクトリを取得すると良いでしょう。
マシン名
マシンに依存したエラーが起きることもあるため、どのマシンで実行したかという記録も残しておいたほうが無難です。特に画像認識を行うアクティビティ(画像をクリック(UiPath.Core.Activities.ClickImage)アクティビティや画像の存在を確認(UiPath.Core.Activities.ImageFound)アクティビティなど)を使ったロボットの場合、画面解像度によって動作が安定しないことがあるので、どのマシンで動かしたのかわかったほうが良いでしょう。こちらも上記の環境変数を取得アクティビティを使い、MachineNameを指定することで取得できます。
ロボットの分岐をたどる
ロボットが条件分岐をどのようにたどったか分かると、バグが見つけやすくなります。分岐条件に設定ミスがあってもエラーが起きず正常終了することもあるので、おかしな挙動に気づきやすくするためにログを残しておくのがおすすめです。必ずしも全ての分岐についてのログを残さなくても良いのですが、ロボットの分岐の大まかな流れが分かるようにしておくと良いでしょう。例えば複数の実行モードを持つロボットを考えます。処理Aの実行結果がTrueだった場合に処理B、Falseだった場合に処理Cを実行するというフローを組んだとします。このときログに次のような文言があった場合、すぐに設定ミスに気づくことができます。
処理A実行完了 処理Aの結果がTrueのため、処理Cを実行 処理C実行開始
時刻を書き込む
処理が実行された時刻も記録を残しておくと便利です。全ての処理について時刻を記録する必要はありませんが、シーケンスなど処理のかたまりごとに記録しておくとロボットの各処理にかかる時間が見えやすくなります。特にループを含むロボットの場合、ループ一回にかかる時間が分かると処理全体でどのくらいの時間がかかるか予測できてロボットを運用しやすくなります。また、特定の処理にいつも以上に時間がかかっているといった問題点も見つけやすくなります。
処理A開始: 12:00 処理A終了: 12:01 処理B開始: 12:01 処理B終了: 12:06 ...
以上をまとめた例が次のようなログファイルです。(もちろんこれは一例で、動かすロボットや開発者・チームが必要とする情報に応じて様々な内容や形式が考えられます。)
実行プロジェクト: C:\path\to\uipath\project1 実行マシン: RPA-001 対象ファイル 参照データ: C:\path\to\data\data.csv 出力先: C:\path\to\result\result.xlsx 設定パラメータ 実行モード: 2 処理開始行: 5 完了メール送信先: example@example.com 処理開始: 2020-07-28-12:00 処理A開始: 12:00 処理A終了: 12:01 処理Aの結果が「False」のため、処理Cを実行 処理C(ループ)の開始: 12:01 1回目終了: 12:03 2回目終了: 12:05 ... 処理C(ループ)の終了: 13:03 実行モードが「2」のため、処理Dを実行 処理D開始: 13:03 処理D終了: 13:05 全処理終了: 2020-07-28-13:05
今回はロボットのログファイルに必要な情報について紹介しました。ログファイルを残せるようにロボットを開発するのは面倒なように思えますが、情報が残っていると後々のロボットの扱いやすさが格段に変わってきます。ロボットが思わぬ動作をしたときにも対処できるように、適切なログを残すようにしたいですね。