「ワークフローファイルを呼び出し」アクティビティのログ設定について

# はじめに
私がアカデミーの「[Studioでのロギング入門(v2021.10)](https://academy.uipath.com/jp/courses/introduction-to-logging-in-studio-v202110-jp)」をやって、下記のツイートをしたところ、
知らなかったっていう人が(私自身も含めて)意外といたので、設定を色々と試してみたものとなります。

https://twitter.com/kou12092/status/1655926475231748100

# 前提条件
アカデミーのコースタイトルにもあるように、v2021.10以降が対象だと思われます。
今回試したのは、UiPath Studio 2023.4.0 Community Editionです。
バージョンによって差異がある可能性がありますのでご了承ください。

# ワークフローファイルを呼び出しアクティビティについて

ワークフローファイルを呼び出しアクティビティに関する公式ドキュメントは[こちら](https://docs.uipath.com/ja/activities/other/latest/user-guide/invoke-workflow-file)。

簡単に言うと、部品化したサブワークフローを呼び出すアクティビティです。

Main.xamlにワーッと書いていると長くなって可読性が下がります。そこで、意味のあるまとまりで部品化を行います。Main.xamlからは部品化した部分は消し、代わりにワークフローファイルを呼び出しアクティビティでその部品化したサブワークフローの呼び出し部分だけ書けばよくなり、Main.xamlがシンプルになって可読性が上がります。これはMain.xamlに限らず、部品化して作られたxamlからさらに部品化したxamlを作り、呼び出すこともできます。このような部品化は、将来のメンテナンス性にも大きく関わってくるため、ワークフローを開発する人としては、意識して欲しいです。

# ログの設定
ワークフローファイルを呼び出しアクティビティのログの設定項目は以下の3項目です。
* ログレベル
* 開始時のログ
* 終了時のログ

## ログレベル
[開始時のログ]および[終了時のログ]プロパティにより生成されるメッセージに適用するログレベルです。
設定できる値は、以下の5つです。未設定の場合のデフォルト値は「Info」です。
* Fatal
* Error
* Warn
* Info
* Trace

実際に使う際、ワークフローファイルの[開始時のログ]や[終了時のログ]のログレベルとして、Fatal、Error、Warnを使うことはないと思います。Infoを設定することを推奨します。

## 開始時のログ
リソースの呼び出し開始時に自動でログに記録する情報の種類です。
設定できる値は、以下の3つです。未設定の場合のデフォルト値は「No」です。
* No
* OnlyInvocation
* WithArguments

<dl>
<dt>No</dt>
<dd>開始ログを記録しません。</dd>
<dt>OnlyInvocation</dt>
<dd>開始ログが記録されます。</dd>
<dt>WithArguments</dt>
<dd>開始ログが記録されます。引数の設定内容も記録されます。</dt>
</dl>

開始時のログに引数の設定内容が記録されていることは、エラーなどの原因を探る上で非常に有効です。この機能がないときは、呼び出し先のフローの先頭で、渡された引数を頑張ってログ出力していた人も多いはず。引数が多い場合にログに出力するデータが多くなってしまう問題はありますが、WithArgumentsを設定することを推奨します。

## 終了時のログ
リリースの呼び出し終了時に自動でログに記録する情報の種類です。
設定できる値は、以下の3つです。未設定の場合のデフォルト値は「No」です。
* No
* OnlySuccessfulReturn
* WithArguments

<dl>
<dt>No</dt>
<dd>終了ログを記録しません。</dd>
<dt>OnlySuccessfulReturn</dt>
<dd>フローが正常に終了した場合、終了ログが記録されます。</dd>
<dt>WithArguments</dt>
<dd>フローが正常に終了した場合、終了ログが記録されます。引数の設定内容も記録されます。</dt>
</dl>

終了時のログに引数(出力)の設定内容が記録されていることは、エラーなどの原因を探る上で非常に有効です。この機能がないときは、呼び出し先のフローの最後で、出力引数を頑張ってログ出力していた人も多いはず。引数が多い場合にログに出力するデータが多くなってしまう問題はありますが、WithArgumentsを設定することを推奨します。

# 実際のログ出力の確認
以下のワークフローを作成し、実際にログを出力してみました。

Main.xaml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/8aea54c6-27dc-ad9b-830c-e0b04e038248.png)

呼び出し先1.xaml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/f96d9c66-aded-5183-5fdc-2efb34748fcd.png)

## 何も設定しなかった場合
開始時のログに「No」、終了時のログに「No」を設定した時も同様です。
各行の後半は「…」に置換してあります。
```
14:19:02.6164 Info {"message":"空のプロセス27 の実行が開始されました。","level":"Information","logType":"Default",…}
14:19:02.8690 Info {"message":"メインの開始","level":"Information","logType":"User",…}
14:19:02.8941 Info {"message":"呼び出し先1の開始","level":"Information","logType":"User",…}
14:19:02.8951 Info {"message":"呼び出し先1の終了","level":"Information","logType":"User",…}
14:19:02.9091 Info {"message":"メインの終了","level":"Information","logType":"User",…}
14:19:02.9146 Info {"message":"空のプロセス27 の実行が終了しました。","level":"Information","logType":"Default",…}
```

## シンプルな設定
ログレベルに「Info」、開始時のログに「OnlyInvocation」、終了時のログに「OnlySuccessfulReturn」を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/a0371149-1636-126a-1a9c-6dad761baa7f.png)

```
14:31:48.4397 Info {"message":"空のプロセス27 の実行が開始されました。","level":"Information","logType":"Default",…}
14:31:48.8290 Info {"message":"メインの開始","level":"Information","logType":"User",…}
14:31:48.8669 Info {"message":"ワークフロー ファイル '呼び出し先1.xaml' の呼び出しを開始しました。","level":"Information","logType":"User",…}
14:31:48.8844 Info {"message":"呼び出し先1の開始","level":"Information","logType":"User",…}
14:31:48.8872 Info {"message":"呼び出し先1の終了","level":"Information","logType":"User",…}
14:31:48.9033 Info {"message":"ワークフロー ファイル '呼び出し先1.xaml' の呼び出しが終了しました。","level":"Information","logType":"User",…}
14:31:48.9044 Info {"message":"メインの終了","level":"Information","logType":"User",…}
14:31:48.9096 Info {"message":"空のプロセス27 の実行が終了しました。","level":"Information","logType":"Default",…}
```

## 引数も表示する設定
ログレベルに「Info」、開始時のログに「WithArguments」、終了時のログに「WithArguments」を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/4b1b79af-9a01-f6d4-be55-a63f5487c259.png)
呼び出し先1.xamlの引数はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/b7473fa9-2e1d-8d85-e1ae-21166311b52f.png)
仕様は以下の通り。
* 入力_1の文字列に「っす」を付けて、出力_1として返す。
* 入出力_1の文字列に「っちゃ」を付けて、入出力_1として返す。

```
17:13:08.9261 Info {"message":"空のプロセス27 の実行が開始されました。","level":"Information","logType":"Default",…}
17:13:09.1485 Info {"message":"メインの開始","level":"Information","logType":"User",…}
17:13:09.1669 Info {"message":"ワークフロー ファイル '呼び出し先1.xaml' の呼び出しを開始しました。 引数 '{\"入力_1\":\"入力\",\"入出力_1\":\"入出力\"}'","level":"Information","logType":"User",…}
17:13:09.1860 Info {"message":"呼び出し先1の開始","level":"Information","logType":"User",…}
17:13:09.1883 Info {"message":"呼び出し先1の終了","level":"Information","logType":"User",…}
17:13:09.1986 Info {"message":"ワークフロー ファイル '呼び出し先1.xaml' の呼び出しが終了しました。 引数 '{\"入出力_1\":\"入出力っちゃ\",\"出力_1\":\"入力っす\"}'","level":"Information","logType":"User",…}
17:13:09.1997 Info {"message":"メインの終了","level":"Information","logType":"User",…}
17:13:09.2056 Info {"message":"空のプロセス27 の実行が終了しました。","level":"Information","logType":"Default",…}
```
見て分かると思いますが、
開始時のログには、「入力」と「入力/出力」のもののみが、
終了時のログには、「出力」と「入力/出力」のもののみが出力されます。
これ、些細なことかもしれませんが、とってもありがたいと思いません？

# 注意点
引数に配列やデータテーブルがある場合、「WithArguments」が設定されていると、配列やデータテーブルの中身がすべてログに展開され、ログファイルのサイズが爆発的に大きくなります。これらが引数に使われている場合は、「WithArguments」を使わない方が良いです。

# まとめ
「ワークフローファイルを呼び出し」アクティビティのログ設定は、簡単な設定だけで、呼び出し先の開始・終了ログを書くことができます。これまで地道に「メッセージをログ」で書いていた方は、ぜひ活用頂きたいです。また、これまであまりログを書いていなかった方は、これを機にログについてアカデミーで学習してみてはいかがでしょうか。