Payaraサーバーへのログインの基本
Originally published on 16 Jul 2019
Last updated on 13 Dec 2019
ロギングはアプリケーションを上手く動作させる鍵となるコンセプトのひとつです。ログはアプリケーションとサーバーが何をしているのかを示してくれます。そして当然のことながら、ログは何かおかしなことが起こったとき、最初に見るべきところとなります。
ロギングに関するこの入門ブログでは、Payara Serverのロギング・モジュールの基礎についてご説明したいと思います。このブログがロギングを学んでいくきっかけとなれば幸いです(Getting Startedブログの一覧はこちらをクリックしてください).
サーバー・ログ
このブログでは、Payara Server自身のロギングの特徴について、ログ・サービスがどのように動作するのか、そして必要に応じてどのようにログを構成するかについてご説明します。
アプリケーションで java.util.logging パッケージを直接、または、例えばSLF4J to JULブリッジなどで間接的に使用している場合には、アプリケーションのログ・エントリもサーバー側のログ・サービスによって処理されます。
なお、例えばLogBackやLog4J2といった別のログ・メカニズムをアプリケーションで使用する場合についてはここでは論じません。 (Payaraサポートのお客様は関連するナレッジベース記事How to Use Log4J2 with Payara をご覧いただくことができます)。
アーキテクチャ
ログ・サービスのアーキテクチャを手短にご説明します。サーバーのコードがログ・エントリを出力すると、それが一旦バッファに保存されます。そして別のスレッドがこれらのエントリをディスク上のファイルに出力します。
このように処理を分割するのには理由があります。
- 複数のスレッドが同時にファイル出力を行うことがないよう、これを防ぎます。
- 異なるスレッドで動作させることにより、ファイルの書き込みがサーバーに与えるインパクトを抑えます。
ファイルへのフラッシュ回数については `Flush Frequency` パラメータの設定で調整することができます (次のセクションでご説明します)。バッファ内により多くのエントリがある場合、フラッシュして一度にファイル出力する方が、エントリ単位でファイル出力を行うよりもいくらか有利となります。
ファイル
まず知っておくべきこととして、ログ・ファイルがどこにあるのでしょうか?この質問の答えは、URL http://localhost:4848 にある管理コンソールで確認することができます。
では、画面左側のツリー・メニューから、ロガー設定のページ (Configurations > server-config > Logger Settings) を選んでください。
“General” タブにログ・ファイルの出力場所を示すテキスト・ボックスがあり、以下のように表示されていると思います。
Log file : ${com.sun.aas.instanceRoot}/logs/server.log
デフォルトでは、ログ・ファイルは起動したドメインの中に出力され、変数 ${com.sun.aas.instanceRoot} はこのドメインへの参照を含みます。そのため、このサーバー・ログはPayaraのインストール・ディレクトリ <PAYARA-HOME>/glassfish/domains/<DOMAIN>/logs/server.logにあります。
テキスト・ボックスの値を変更して保存すると、このサーバー・ログを異なるファイル名または場所にすることができます。
デフォルトの参照変数を用いることでドメインからの相対パスを選択できますが、任意の相対または絶対パスを使用することもできます。
もうひとつの重要なファイルの特徴はそのサイズです。一概には言えませんが、そのサイズは数メガバイトに膨れあがることもあります。それを開くのはともかくとして、その中から何かを探し出すことは難しいでしょう。
そのため、デフォルトではサイズによりローテーションするようになっていますが (約2 Mb)、その他のオプションも使用できます。
`Rotation on Date Change` を有効にすることで、ログ・サービスは毎日ログ・ファイルを作成します。サイズ上限はこの日次ローテーションでも適用されます。そのため、サイズによるローテーションを無効 (値を0に設定します) にしない限り、最終的には1日当たり複数のファイルが作成されることがあります。
他のローテーション・オプションは、`File Rotation Time Limit` を設定して指定した分単位で必ずローテーションが行われるようにするものです。
Maximum History Files パラメータを用いると、どれくらい前までのログ・ファイルを保持したいのかを指定することができます。デフォルト値は0で、これはPayara Serverがログ・ファイルを消去しないという意味です。実運用環境では、デフォルト値のままにする場合には、ログ・ファイルでディスクが一杯にならないようご注意ください。
ログ・ビューア
ログ・ファイルの内容を確認するにはいくつかの方法があります。
- メモ帳、Atomなどのツールを用いてファイルを表示する
- ELKスタックのようなログを集中管理する特別のスタックを用いる
- 管理コンソールのログ・ビューアを使用する
サーバー・ログ・ファイルは管理コンソール内から見ることができます。RAW形式として内容をそのまま表示することも、ログ・ビューアでアイテムの検索やフィルタリングを行うこともできます。
ログ・ビューアは管理コンソール内のServerページにあります。
`View Log Files` ボタンをクリックすると、ウィンドウがポップアップされ、以下の検索項目を指定することができます。
- 一致するテキスト
- 期間
- INFOなどのレベル
- インスタンス (ドメイン・サーバー自身またはクラスタ設定しているインスタンス)
これは、ログ・ファイルからエラーを探したい場合や、特定の期間に出力された内容を確認したい場合に、手軽に使用できる方法です。
フォーマット
ログ項目のエントリは明確なフォーマットで構成されています。このため、ログ・ビューア (またはログ収集ツールのようなその他のツール) がログを解析してデータを理解することができるのです。ODL、ULF、JSONの3種類のフォーマットがサポートされています。
ODL : Oracle Diagnostic Log Format (Log Working Group in Oracle)
例
[2019-01-18T13:10:02.420+0100] [Payara 5.184] [INFO] [NCLS-LOGGING-00009] [javax.enterprise.logging] [tid: _ThreadID=31 _ThreadName=RunLevelControllerThread-1547813402253] [timeMillis: 1547813402420] [levelValue: 800] [[ Running Payara Version: Payara Server 5.184.1 #badassfish (build 90)]]
フォーマットはカギ括弧を区切りとして使用し、いくつかの必須フィールドがあります。フォーマット全体は以下の通りです。
[[timestamp] [organization ID] [Message Type/Level] [Message ID] [Logger Name] [Thread ID] [User ID] [ECID] [Extra Attributes] [Message]]
ULF : Uniform Log Format (Log Working Group in Java Webservices Org.)
例
[#|2019-01-18T13:10:02.420+0100|INFO|Payara 5.184|javax.enterprise.logging|_ThreadID=31;_ThreadName=RunLevelControllerThread-1547817813642;_TimeMillis=1547817813766;_LevelValue=800;_MessageID=NCLS-LOGGING-00009;| Running Payara Version: Payara Server 5.184.1 #badassfish (build 90)|#]
ご覧いただくと分かるように、このフォーマットはとてもよく似てはいますが異なる区切り文字を使用します。フォーマット全体は以下の通りです。
"[#|DATETIME|LOG_LEVEL|PRODUCT_ID|LOGGER NAME|OPTIONAL KEY VALUE PAIRS| MESSAGE|#]\n"
JSON : JavaScript Object Notation
例
{"Timestamp":"2019-01-18T14:30:25.465+0100","Level":"INFO","Version":"Payara 5.184","LoggerName":"javax.enterprise.logging","ThreadID":"31","ThreadName":"RunLevelControllerThread-1547818225353","TimeMillis":"1547818225465","LevelValue":"800","MessageID":"NCLS-LOGGING-00009","LogMessage":"Running Payara Version: Payara Server 5.184.1 #badassfish (build 90)"}
さらにJSONは利点があり、また見方によっては欠点もあります。フィールド名はJSONの一部です。
サーバー・ログのデフォルトのフォーマットはODLフォーマットです。しかし、管理コンソールの同じページでそれを変更することができます。
内容
このブログで最後に論じたいコンセプトはログ・レベルです。デフォルトではすべてのログ・メッセージがファイルに出力される訳ではありません。Payara Serverのコードは、開発や問題となり得る箇所の調査に有用な大量のログ・メッセージをも含んでいます。しかし、それらはファイルのサイズを膨れあがらせるばかりで、何らかの価値を付加するものではありません。事実、それらはあまりに膨大な情報となるため、実際に必要な情報を探しづらくしてしまうのです。
これらのログ・レベルはサーバーのそれぞれの部分に対して個別に設定することができます。管理コンソールの構成ページを開き、次にロガー設定ページの “General” へ遷移すると、ログ・レベルのページがあります(`The File`セクションのスクリーンショットをご覧ください。そこで各ロガーについて、設定されているログ・レベルを確認することができます)。
設定値を変更することで、ログ・エントリは結果として増減します(選択されているログ・レベルに依存します)。もし、アプリケーションのロギングをPayara Serverのログ・サービスで扱うのであれば、アプリケーション内で使用する独自のロガー名を追加することもできます。
考慮すべき追加のログ・サービス項目
ログ・サービスについて知っておくべき小さな事柄がいくつかあります。
- 管理コンソールの使用と合わせて、asadminコマンドライン・ツールを使用した構成の変更も可能です。まず始めにAdministering Payara Server 5 with the CLI と Asadmin Recorder - New Payara Server Feature Demo のブログをご覧いただくと良いでしょう。
- ログ・システムはモニタリング・サービスからの通知の出力にも使用されます。この機能の詳細についてはオンライン・ドキュメントをご覧ください。
- アクセス・ログ機能によりサーバーへのリクエストを記録することもできます。
- Payara Microに含まれるロギングはログ・サービスと同じように振る舞いますが、必要となる構成は異なります(管理コンソールがないためです)。Payara MicroはLogbackやLog4J2など他のロギング・フレームワークと併用することもできます。
Payara Serverにおけるログ・サービスの構成
Payara Serverでは、ログ・サービスのすべての状態は必要に応じて構成することが可能です。どこにログ・ファイルを出力するか、どのようにログ・ファイルのローテーションを行うか(ログ・ファイルが大きくなり過ぎないように)、ログ・エントリを出力するのにどのフォーマットを使用するか、そしてどのレベルのログを出力するか、です。
ログ・ビューアを用いると、探しているログ・エントリをとても簡単にかつ効率的に見つけられるようログ・ファイルを検索することができます。
Related Posts
Payara Micro 5によるUber JARの作成
Published on 18 May 2021
by Fabio Turizo
0 Comments
Payara Microでは、Webアプリケーションを自己完結型で簡単に実行することができます。2016年5月のPayara Serverリリースからは、WARファイルの内容とPayara Microを構成するクラスやリソースを束ねる “Uber JAR” を作成する簡単な方法があります。
この “Uber” Jarは、Docker ...
Payara Server 5における接続プールのご紹介
Published on 18 May 2021
by Arjan Tijms
2 Comments