UiPathのログが増え続けないようにアーカイブする

#はじめに
UiPath（StudioやRobot）を動かすと当然ログが残ります。このログはデフォルトの設定では一方的に溜まり続ける仕様のため、久々にログフォルダを見たらログが思っていたより多かったってこともあると思います。
![log_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/7a64a3f3-1e8e-b151-c5f4-625f29ce36c5.png)

気にする人は多くはないかもしれませんが、Unattended Robotで運用する場合やディスク容量の制限が厳しいVDI環境をお使いの方であれば、ログが肥大化しないように適切にアーカイブ（古いログを削除）したいところです。

#前提
UiPath（Studio/Robot） v2021.10.4　※修正（バージョンが間違っていました）

#NLog
UiPathのロガーはNLogを使用していますので、NLogのConfigを直すだけでアーカイブできます。
NLogのConfigの仕様は以下です。
https://github.com/NLog/NLog/wiki/File-target#archival-options

#UiPathのログ
UiPathが出力するログはいくつか種類があるようです。
ざっとUiPathインストールフォルダを漁ってみたところ、NLogのConfigは以下のようです。
※v2019.10から比べると種類が増えている。。。でも、ファイル名にNLogと付くので分かりやすくなった

* NLog.config
* NLog.LicenseTool.config
* NLog.UpdateService.config
* Oidc.NLog.config
* Robot.NLog.config
* Studio.NLog.config

そのうち、修正しなくても良さそうなものを省くと以下のような感じです。

| configファイル | 説明 |
|:--|:--|
| NLog.config | ロボットを実行したときに吐くログ（Execution.log）<br>デフォルトの出力先は、C:\Users\XXXX\AppData\Local\UiPath\Logs |
| NLog.LicenseTool.config | LicenseTool.exeを使ったときに吐くログ<br>Execution.logと同じ場所に出力される |
| NLog.UpdateService.config | ？？？よく分かりません<br>他3つとは出力先が異なる |　
| Studio.NLog.config | Studioを起動したときなどに吐くログ<br>UiPath.Studio.Project.logやUiPath.Studio.Analyzer.logなど種類毎に複数出力される<br>Execution.logと同じ場所に出力される |


Unattended Robotの場合は、NLog.configの修正だけで十分だと思います。Studioを使う方であれば、Studio.NLog.configも修正しても良いかもしれません。

#Configの修正
NLog.configを例に修正してみます。 ※読みやすいように改行しています
今回は<font color="Red">日付単位</font>にログファイルを作成し、古いファイルは<font color="Red">Archiveフォルダ</font>に移動させ、<font color="Red">最大5世代（5日分）</font>保持する仕様とします。

修正する元の部分です。

```NLog.config（修正前）
<target type="File"
  name="WorkflowLogFiles"
  fileName="${WorkflowLoggingDirectory}/${shortdate}_Execution.log"
  layout="${time} ${level} ${message}"
  keepFileOpen="true"
  openFileCacheTimeout="5"
  concurrentWrites="true"
  encoding="utf-8"
  writeBom="true"
/>
```

まずは、以下のプロパティを追加します。

```
  archiveFileName="${WorkflowLoggingDirectory}/archives/{#}_Execution.log"
  archiveNumbering="Date"
  archiveDateFormat="yyyyMMdd"
  archiveEvery="Day"
  maxArchiveFiles="5"
```

元々あるプロパティ「fileName」を修正します。
元々はExecution.logの前に日付が入る仕様でしたが、最も新しいログファイルの名前には日付が入らないようにします。

```
  fileName="${WorkflowLoggingDirectory}/Execution.log"
```

最終的に以下のようになります。

```NLog.config（修正後）
<target type="File"
  name="WorkflowLogFiles"
  fileName="${WorkflowLoggingDirectory}/Execution.log"
  layout="${time} ${level} ${message}"
  keepFileOpen="true"
  openFileCacheTimeout="5"
  concurrentWrites="true"
  encoding="utf-8"
  writeBom="true"
  archiveFileName="${WorkflowLoggingDirectory}/archives/{#}_Execution.log"
  archiveNumbering="Date"
  archiveDateFormat="yyyyMMdd"
  archiveEvery="Day"
  maxArchiveFiles="5"
/>
```

Configの修正が終わったら、サービスマネージャからUiPathサービス（UiRobotSvc）を再起動します。
※StudioやタスクトレイのUiPath Assistantの再起動ではありません

#Config修正後
この通り、ログフォルダのログがすっきり整理されました。ログフォルダには最新日付のログのみが保存されています。
※archivesフォルダはログが吐かれるタイミングで自動で作成されます。
※なお、NLog.config以外のconfigも修正し、修正前までに溜まった古いログは手動削除しました。
![log_after1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/dbad03f2-250f-a39a-0e67-5e1873d7f22c.png)

archivesフォルダには、過去5日分のログが日毎に残されています。ログが追加されると最も古いファイルが自動で削除されます。
※見やすいようにExecution.log以外は削除しています。
![log_after2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/25fb8a0e-9bdc-3a80-4b50-7a47852de3ad.png)

#さいごに
簡単にログのアーカイブを実現できることが分かりました。
UiPathのバージョンが違うと修正するConfigのファイル名も違うので注意が必要です。
また、UiPathをバージョンアップするとConfigの内容にリセットされてしまうので、必要に応じてConfigをバックアップするなどしてください。