ログ関係のAPIとしては(System)にあるLogMessage Action (Server/Client両方のActionがあり、出力先はGeneralログ)があります。他にも、ログ出力用と思われるAPIがあるのですが、ドキュメントだけでは不明な点があったため、実際に動作させて確認してみました。
環境
Personal Environment(Version 11.10.0 (Build 22910))
Service Studio (Version 11.9.2)
Asynchronous Logging API (For version 11.10.0.)
Asynchronous Logging API
OutSystemsが提供するAPIの1種で、AsynchronousLogging Extensionに含まれる、LogError/LogRecord/LogRequestEventの3つです。
ドキュメント:Asynchronous Logging API
以下の記述で出てくる「Request_Key」については、以前Request_GetKeyでログの関連付けを見られるで書きました。
このAPIは、非同期で実行(キューを利用)されます。
LogError
ドキュメントによると、
エラーをデータベースに非同期で挿入します。エラーはメッセージキューに保持され、しばらくしてからデータベースに一括挿入されます。
これだけだと、「エラー」とはどのようなエラーで、「データベース」とはどのデータベースのどのEntityのことか? 記述が曖昧ですね。
実際にプログラムを書いて試してみると、行き先は名前通りErrorログでした。つまり、「Service Center > Monitoring > Errorsで閲覧可能なあのエラーログを非同期に出力する機能」、でした。
実際に実行したActionのパラメーター(左)と実行したときにService Centerのエラーログの詳細画面に出力された内容(右)。
LogRecord
ドキュメントによると、
レコードをデータベースに非同期で挿入します。レコードはメッセージキューで保持され、しばらくしてからデータベースに一括挿入されます。
とLogErrorと似たような記述ですが、こっちで記録するのはエラーではなく「レコード」。よって任意のEntityに出力できそうな気配を感じます。
簡単なEntityを定義して実験してみましょう。
まず、Entityを
- Entity名:LogRecordSample
- Attribute
- Message (Text)
- Instant (Date Time)
- Severity (Integer)
と定義し、この型の変数をパラメータに渡してLogRecordを呼んでみます。
定義したEntity型の変数を用意し、適当に編集(画像の上)し、実行後にView Dataした(下)もの。
なお、LogRecordはパラメータの型がObjectであるため、ToObject(Entity型変数)のようにして呼びます。
Forumの投稿ではEntity型ではうまく行かないような記述が見られたのですが、私が試して時点では出力できました。
結果としては、この機能は「任意のEntityに対し非同期にレコードを追加できる機能」ですね。
LogRecordの後に例外が発生したら?
となると、気になるのは、ログ出力がトランザクションと運命をともにするか(ロールバックしてもログは記録されるか)? ですね。しないのであればエラー処理時にもログを記録する機能として望ましい(キューが死んだらだめなので100%ではない)。
以下のように、同じ処理の最後をEndでなく、Raise Exceptionに変えてみました(OutSystemsでは、Handleされない例外で終わった通信の最後で自動的にロールバックされます)。ちゃんとログ出力されていますね。
LogRequestEvent
これはどうも、Production環境でないと使えない機能に関連していそうなので、私のPersonal Environmentでは確認できないです。