【RPA】UiPath InvokeCodeでApacheサーバのアクセスログをDataTebleに読み込む
#RPA #UiPath #DX #ビジネス #ソフトウェア
RPAツールであるUiPathでは、
GUIによってアクティビティと呼ばれる処理の部品を選択して貼り付けることで、
パソコンで行うための一連の動作を組み立てることができます。
各処理ではVisualBasic言語(VB.NET)によって、原則、1行だけのコードを書く(プログラミング)ことができます、。
それだけでは収まらない処理は「コードを呼び出し(Invoke Code)」というアクティビティによって、
複数行のコードをプログラミングすることができます。
Invoke Codeアクティビティは、原則、一つのVB.NETのSUB関数としての機能でしかなく、
一つの関数を作るようなイメージです。
(Invoke Codeアクティビティ内で複数の関数を定義することは現状ではできません)
今回は、Invoke Codeアクティビティによって、
ApacheサーバのアクセスログをDataTebleに読み込むコードを作成しました。
Apacheサーバのアクセスログ(access.log)は、アクセスされた結果を記録するためのテキストファイルです。
Common形式とCombined形式の2種類があり、Combined形式のほうが情報が多く出力されます。
これらの形式の指定は、Apacheサーバのコンフィギュレーションファイル(apache.conf)で指定されます。
Apacheサーバのアクセスログは、サイトのアクセス数などを調査するため、
あるいは、不正アクセスをチェックするためなどに利用されます。
■Common形式のアクセスログをDataTebleに読み込むInvoke Code
Invoke Codeアクティビティの引数を定義します。
In_AccessLogFile String アクセスログファイルパス
Out_Result Boolean 結果
Out_ErrorMessage String エラーメッセージ
Out_DataTable DataTable データテーブル
Common形式のアクセスログをDataTebleに読み込むInvoke CodeアクティビティのVB.NETコードは、
以下の処理を実施します。
①アクセスログファイルを読み込みモードで開き、ファイルストリームを生成する
②commonログファイルフォーマットのDataTableを生成し、カラムを設定
(LogFormat "%h %l %u %t \"%r\" %>s %b" common)
Out_DataTable = New DataTable("accesslog") 'DataTable生成(名称「accesslog」)
Out_DataTable.Columns.Add("remotehost") '%h リモートホスト名
Out_DataTable.Columns.Add("client_id") '%l クライアントの識別子
Out_DataTable.Columns.Add("user") '%u 認証ユーザー名
Out_DataTable.Columns.Add("datetime") '%t 時刻
Out_DataTable.Columns.Add("first_line") '%r リクエストの最初の行の値
Out_DataTable.Columns.Add("status_code") '%>s ステータスコード
Out_DataTable.Columns.Add("send_length") '%b 送信されたバイト数(ヘッダーは含まず)。0バイトの時は「-」
③アクセスログ読み出しループ
アクセスログの1行毎に、以下を順次実施
1.アクセスログを1行読み込む
2.DataTableの行を生成
3.行の文字位置の変数を定義
4.remotehostカラムデータを取得
5.client_idカラムデータを取得
6.userカラムデータを取得
7.”[”文字スキップ
8.datetimeカラムデータを取得
9.””文字スキップ
10.first_lineカラムデータを取得
11.空文字スキップ
12.status_codeカラムデータを取得
13.send_lengthカラムデータを取得
14.データテーブルに行追加
④ファイルストリームのクローズ処理を実施する
⑤正常であれば、Out_ResultにTrue、Out_ErrorMessageに空文字("")を設定して終了する
異常(例外発生)であれば、Out_ResultにFalse、Out_ErrorMessageにエラーメッセージ(例外メッセージ)を設定して終了する
■Combined形式のアクセスログをDataTebleに読み込むInvoke Code
Invoke Codeアクティビティの引数を定義します。
In_AccessLogFile String アクセスログファイルパス
Out_Result Boolean 結果
Out_ErrorMessage String エラーメッセージ
Out_DataTable DataTable データテーブル
Combined形式のアクセスログをDataTebleに読み込むInvoke CodeアクティビティのVB.NETコードは、
以下の処理を実施します。
①アクセスログファイルを読み込みモードで開き、ファイルストリームを生成する
②combinedログファイルフォーマットのDataTableを生成し、カラムを設定
(LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined)
Out_DataTable = New DataTable("accesslog") 'DataTable生成(名称「accesslog」)
Out_DataTable.Columns.Add("remotehost") '%h リモートホスト名
Out_DataTable.Columns.Add("client_id") '%l クライアントの識別子
Out_DataTable.Columns.Add("user") '%u 認証ユーザー名
Out_DataTable.Columns.Add("datetime") '%t 時刻
Out_DataTable.Columns.Add("first_line") '%r リクエストの最初の行の値
Out_DataTable.Columns.Add("status_code") '%>s ステータスコード
Out_DataTable.Columns.Add("send_length") '%b 送信されたバイト数(ヘッダーは含まず)。0バイトの時は「-」
'以下、Combinedフォーマットでの追加カラム
Out_DataTable.Columns.Add("Referer") '%{Referer}i リクエストに含まれるヘッダー名(Referer)の値
Out_DataTable.Columns.Add("User-Agent") '%{User-Agent}i リクエストに含まれるヘッダー名(User-Agent)の値
③アクセスログ読み出しループ
アクセスログの1行毎に、以下を順次実施
1.アクセスログを1行読み込む
2.DataTableの行を生成
3.行の文字位置の変数を定義
4.remotehostカラムデータを取得
5.client_idカラムデータを取得
6.userカラムデータを取得
7.”[”文字スキップ
8.datetimeカラムデータを取得
9.””文字スキップ
10.first_lineカラムデータを取得
11.空文字スキップ
12.status_codeカラムデータを取得
13.send_lengthカラムデータを取得
14.””文字スキップ
15.Refererカラムデータを取得
16.””文字スキップ
17.User-Agentカラムデータを取得
18.データテーブルに行追加
④ファイルストリームのクローズ処理を実施する
⑤正常であれば、Out_ResultにTrue、Out_ErrorMessageに空文字("")を設定して終了する
異常(例外発生)であれば、Out_ResultにFalse、Out_ErrorMessageにエラーメッセージ(例外メッセージ)を設定して終了する
■IPアドレスをDNS名に変換するInvoke Code
IPアドレスをDNS名に変換します。変換できない場合は、空文字を返します。
※ネットワークによるDNSアクセスにつき、処理速度は遅いので注意
Invoke Codeアクティビティの引数を定義します。
In_IpAddress String IPアドレス
Out_Dns String DNS名
IPアドレスフォーマットであるかをチェックします。
変換できればOut_DnsにDNS名を設定し、変換できなければ、空文字設定します。
■アクセスログの時刻を、"YYYY/MM/DD hh:mm:ss"形式の時刻に変換し、タイムゾーンに分割するInvoke Code
アクセスログの時刻は、月がJanのように3英字で表されていて、タイムゾーンも表示されます。
これを"YYYY/MM/DD hh:mm:ss"形式の時刻と、タイムゾーンに分割します。
Invoke Codeアクティビティの引数を定義します。
In_DatetTime String アクセスログの時刻
Out_DateTime String "YYYY/MM/DD hh:mm:ss"形式の時刻
Out_TimeZone String タイムゾーン
■UiPathで、Common形式/Combined形式のアクセスログを読み取るシーケンスの作成
以下の手順でシーケンスを作成します。
①UiPathのプロジェクトを作成
②UiPathのシーケンスを作成
③UiPathの画面から以下をインポート
System.Data
System.IO
System.Text
System.Net
④以下の変数を定義します。
AccessLogFile String パスワード
Result Boolean 結果
ErrorMessage String エラーメッセージ
DataTable System.Data.DataTable データテーブル
CSV String CSVの行テキスト
DnsString String DNS名
DateTime String "YYYY/MM/DD hh:mm:ss"形式の時刻
TimeZone String タイムゾーン
⑤代入アクティビティを追加し、AccessLogFile変数にアクセスログファイルのパスを設定する
⑥Invoke Codeアクティビティを追加し、コード編集で、
Common形式/Combined形式のアクセスログを読み取るコードを設定する
その際、引数に対応する変数を設定する
In_AccessLogFile → AccessLogFile
Out_Result → Result
Out_ErrorMessage → ErrorMessage
Out_DataTable → DataTable
⑦データテーブル出力アクティビティを追加する
(データテーブルの一行づつ、CSV形式で、CSV変数に格納)
⑧一行を書き込みアクティビティを追加する
(CSV変数を出力する)
⑨データテーブル繰り返しアクティビティを追加する
繰り返しアクティビティの中で以下を実施する
⑨―1 Invoke Codeアクティビティを追加し、
IPアドレスをDNS名に変換するコードを設定する
その際、引数に対応するデータテーブルのカラム文字、変数を設定する
In_IpAddress → row(“remotehost”).ToString
Out_Dns → DnsString
⑨-2 一行を書き込みアクティビティを追加する
(DnsString変数を出力する)
⑨-3 Invoke Codeアクティビティを追加し、
アクセスログの時刻を、"YYYY/MM/DD hh:mm:ss"形式の時刻に変換し、タイムゾーンに分割するコードを設定する
その際、引数に対応するデータテーブルのカラム文字、変数を設定する
In_DatetTime → row(“datetime”).ToString
Out_DateTime → DateTime
Out_TimeZone → TimeZone
⑨-4 一行を書き込みアクティビティを追加する
(Out_DateTime変数を出力する)
⑨-5 一行を書き込みアクティビティを追加する
(Out_TimeZone変数を出力する)
⑩実行する
※本記事のサンプルコードに関しては、一切の責任を負いません。
すべて自己責任でお願いいたします。
■上記のサンプルコードプロジェクトを提供します(著作権フリー)
①UiPathプロジェクト(UiPathPrj_InvokeCode_ApacheAccessLog)
2つのサンプルシーケンスを準備しました。
Common形式のアクセスログを読み取るシーケンスシーケンス
Combined形式のアクセスログを読み取るシーケンス
※UiPath Community Editionで作成
(UiPath Studio Pro 2020.10.0 Community License)
②VBコンソールアプリケーションプロジェクト(VBPrj_InvokeCode_ApacheAccessLog)
Invoke Codeアクティビティ内でデバックすることは困難なので、
一度、VBコンソールアプリケーションとしてプログラミングし、
デバックをしてからコピー&ペーストしたほうが効率的です。
そのため、Invoke Codeアクティビティで動かす同じコードを
VBプロジェクトから動作させるようにしてあります。
※Microsoft Visual Studio Community 2019 Version 16.7.6で作成
(Microsoft.NET Framework Version 4.8.03752)
以下からサンプルコードをダウンロードすることが可能です。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?