Question
Orchestratorが利用するSQL Serverに、ロボットマシン上に出力されるログの一部に限定したジョブ実行ログを保存し、データベースに保存されるログ量を抑えたいです。
ロボットマシン上のジョブ実行ログファイル(“%LocalAppData%\UiPath\Logs\yyyy-mm-dd_Execution.log”)には、トラブルシュートしやすくなるように「Verbose」レベル以上のログを出力したいです。
どのように設定すればいいですか?
Answer
ロボットが生成しOrchestratorにアップロードするジョブ実行ログについて、Orchestrator側でログレベル等によってフィルターしSQL Serverのデータベースに保存できます。
ロボットが出力するジョブ実行ログのログレベルを「Verbose」以上にする方法
以下いずれかの箇所で設定します。
-
Orchestratorテナント > アクセス権を管理 > 各ユーザーの編集画面 > 「ロボットの設定」タブにて、「ログレベル」トグルを有効化した上で、ログレベルを指定します。Orchestratorでのログレベル設定は、ロボットマシン上でのログレベル設定より優先して適用されます。
-
各ロボットマシンのUiPath Assistant > 設定 > 「Orchestratorの設定」タブにて、「ログレベル」を指定します。Orchestratorで該当ロボットの「ログレベル」トグルが無効の場合のみ、UiPath Assistantのログレベル設定が適用されます。
ロボットがOrchestratorにアップロードしたジョブ実行ログのうち、一部のみをSQL Serverのデータベースに保存する方法
Orchestratorがデータベースに保存するジョブ実行ログは、UiPath.Orchestrator.dll.config ファイル内の Nlog セクションを編集することで設定できます。
既定値では「C:\Program Files (x86)\UiPath\Orchestrator」フォルダー内に、UiPath.Orchestrator.dll.config ファイルが格納されています。
-
UiPath.Orchestrator.dll.config ファイルの編集前に、万一の誤操作に備えて必ずUiPath.Orchestrator.dll.config ファイルのバックアップを取得してください。
-
任意のテキストエディターでUiPath.Orchestrator.dll.config ファイルを開き、configuration > nlog > rules セクションを探します。
メモ帳やWordでも編集できますが、Notepad++やVisual Studio Codeなどを利用すると簡単な編集ミスは自動で色付け表示してくれるので便利です。
rules セクション内の、「name=“Robot.*”」と「writeTo=“database”」の両方を含むルールを編集します。
<logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="database" />
-
UiPath.Orchestrator.dll.config ファイルを編集後に保存し、変更を反映するためにOrchestratorを再起動します。
起動中の数分間はOrchestratorを利用できなくなる点にご留意ください。
ルールの編集例
例1:「Info」レベル以上のジョブ実行ログのみをSQL Serverデータベースに保存する設定
<configuration>
<nlog ...>
<rules>
...
<logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" writeTo="database">
<filters defaultAction="Ignore">
<when condition="level >= LogLevel.Info" action="Log" />
</filters>
</logger>
...
</rules>
</nlog>
</configuration>
※参考画像(例1)
例2:全てのジョブ実行ログをSQL Serverデータベースに保存しない設定
<configuration>
<nlog ...>
<rules>
...
<logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" />
...
</rules>
</nlog>
</configuration>
※参考画像(例2)
Nlogの仕様について
NLogは、.NETアプリケーション向けの設定が簡単で拡張性のあるログプラットフォームです。
あるログについて、ルールのリストが上から順番に照合されます。
ルールが一致する(Logger名やログレベル)場合には、そのルールが適用されて「writeTo」に指定されたターゲットにログ出力されます。
1つのルールの照合が終わると、次のルールの照合が続行されます。ただし「final=“true”」付きのルールが適用された場合、以降のルールは照合されなくなります。
「name=“Robot.*”」のルールは、ロボットによるジョブ実行ログと一致します。
「name=“*”」のルールは、ジョブ実行ログを含む、全てのログと一致します。
たとえば以下のようにルールを設定すると、ジョブ実行ログに対しては次の処理が行われます。
- 「ruleName=“primaryRobotLogsTarget”」のルールを照合し、「name=“Robot.*”」と「minLevel=“Warn”」に一致するログ(=Warnレベル以上のジョブ実行ログ)に対してこのルールが適用されます。このルールが適用されたログは「writeTo=“database”」によってSQL Serverデータベースに出力され、また「final=“true”」によってそれ以降のルール照合に進みません。
- Warnレベル未満のジョブ実行ログを次のルールと照合し、「name=“Monitoring.*”」はジョブ実行ログと一致しないため、このルールは適用されず次のルール照合に進みます。
- Warnレベル未満のジョブ実行ログを最後のルールと照合し、「“name=”*"」と「minLevel=“Info”」 に一致するログ(=Infoレベルのジョブ実行ログ)がイベントログに出力されます。
すなわち、Warnレベル以上のジョブ実行ログはデータベースに出力され、Infoレベルのジョブ実行ログがイベントログに出力されることになります。
<configuration>
<nlog ...>
<rules>
...
<logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" minLevel="Warn" writeTo="database" />
<logger name="Monitoring.*" writeTo="monitoring" minlevel="Warn" final="true" />
<logger name="*" minlevel="Info" writeTo="eventLog" />
</rules>
</nlog>
</configuration>
以下のように1行追加すると、ジョブ実行ログに対しては次の処理が行われます。
- 「ruleName=“primaryRobotLogsTarget”」のルールと照合し、「name=“Robot.*”」と「minLevel=“Warn”」に一致するログ(=Warnレベル以上のジョブ実行ログ)に対してこのルールが適用されます。このルールが適用されたログは「writeTo=“database”」によってSQL Serverデータベースに出力され、また「final=“true”」によってそれ以降のルール照合に進みません。
- Warnレベル未満のジョブ実行ログを「ruleName=“secondaryRobotLogsTarget”」のルールと照合し、「name=“Robot.*”」はジョブ実行ログと一致するためこのルールが適用されます。「writeTo」がないためどこにもログ出力されず、また「final=“true”」によってそれ以降のルール照合に進みません。
すなわち、Warnレベル以上のジョブ実行ログはデータベースに出力され、Warnレベル未満のジョブ実行ログはどこにも出力されない状態となります。
<configuration>
<nlog ...>
<rules>
...
<logger name="Robot.*" ruleName="primaryRobotLogsTarget" final="true" minLevel="Warn" writeTo="database" />
<logger name="Robot.*" ruleName="secondaryRobotLogsTarget" final="true" />
<logger name="Monitoring.*" writeTo="monitoring" minlevel="Warn" final="true" />
<logger name="*" minlevel="Info" writeTo="eventLog" />
</rules>
</nlog>
</configuration>
以下のルールでは、「name=“Robot.*”」によって全てのジョブ実行ログに適用されます。
「writeTo=“database”」によってSQL Serverデータベースをログ出力先のターゲットとします。
また「final=“true”」によって、このルールが適用されるログ(=全てのジョブ実行ログ)は、以降のルール照合には進みません。
filtersセクション内のwhen条件は上から下へ順番に照合され、どの条件にも一致しないログにはdefaultActionが適用されます。
- 1つ目のwhen条件を照合し、Orchestratorで登録したプロセス名が「sample1」と一致するジョブ実行ログについて、「action=“Ignore”」によりログ出力しません。
- 残ったジョブ実行ログ(=プロセス名が「sample1」でないログ)を2つ目のwhen条件と照合し、以下いずれかに一致するログを「action=“Log”」によりログ出力します。
- ログレベルが「Error」以上
- ログメッセージの末尾が「 execution ended」と一致する
- ログメッセージの末尾が「 の実行が終了しました。」と一致する
- 残りの全てのジョブ実行ログには、「defaultAction=“Ignore”」が適用されてログ出力しません。
たとえばログレベルが「Error」かつプロセス名が「sample1」のログは、以下のルールでは1つ目のwhen条件が適用されて2つ目のwhen条件は照合されず「ログ出力しない」ことになります。
<logger name="Robot.*" final="true" writeTo="database" ruleName="primaryRobotLogsTarget">
<filters defaultAction="Ignore">
<when condition="equals('${event-properties:item=processName}', 'sample1')" action="Ignore" />
<when condition="level >= LogLevel.Error or ends-with('${message}',' execution ended') or ends-with('${message}',' の実行が終了しました。')" action="Log" />
</filters>
</logger>
NLogに関連して、参考になるWebサイトを以下にご紹介いたします。
NLog公式ドキュメント:Configuration file · NLog/NLog Wiki · GitHub
NLogフィルターの設定例:NLog: Rules and filters - CodeProject