ロギングはアプリケーションを上手く動作させる鍵となるコンセプトのひとつです。ログはアプリケーションとサーバーが何をしているのかを示してくれます。そして当然のことながら、ログは何かおかしなことが起こったとき、最初に見るべきところとなります。
 
ロギングに関するこの入門ブログでは、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のログ・サービスで扱うのであれば、アプリケーション内で使用する独自のロガー名を追加することもできます。
 
考慮すべき追加のログ・サービス項目 
ログ・サービスについて知っておくべき小さな事柄がいくつかあります。
 
Payara Server におけるログ・サービスの構成 
Payara Serverでは、ログ・サービスのすべての状態は必要に応じて構成することが可能です。どこにログ・ファイルを出力するか、どのようにログ・ファイルのローテーションを行うか(ログ・ファイルが大きくなり過ぎないように)、ログ・エントリを出力するのにどのフォーマットを使用するか、そしてどのレベルのログを出力するか、です。
 
ログ・ビューアを用いると、探しているログ・エントリをとても簡単にかつ効率的に見つけられるようログ・ファイルを検索することができます。