Expeditor Toolkit バージョン 6.2
オペレーティング・システム: Linux on x86、Windows |
private static final String CLAZZ_NAME = MyClass.class.getName(); private static final String PKG = MyClass.class.getPackage().getName(); private static Logger _logger = Logger.getLogger(PKG);
MyClass を実際のクラス名に置き換えて、 同じ名前のプロパティー・ファイルがパッケージのリーフ・ノードとして存在することを確認してください。
java.util.logging.LogManager.getLogger(String name) は、一致する名前がすでに存在する場合には、その名前をロガーに返します。 その他の場合は、ヌルを返します。 クラスのインスタンス化の順序は決められていないので、クラスが初期化されるときに指定のロガーが存在する保証はありません。 現時点の順序と後の順序とでは異なる場合があります。 そのため、Logger クラスにあるゲット・メソッドを使用して、 Logger が確実に戻されるようにする必要があります。 LogManager または Logger のどちらを使用してロガーを取得するとしても、指定されたロガーのインスタンスが VM 内で一度に複数存在することはありません。
com.ibm.rcp.mypackage.level=FINEST
rcpinstall.properties 内のデフォルト値を SEVERE に変更すると、他の JSR47 ロガーからの SEVERE レベル・メッセージだけを受け取ることができます。
また、Lotus® Expeditor の OSGi コンソール機能を活用すると、ロギング・レベルを動的に変更できます。そのためには、-console を起動に追加し、setlogrlev コマンドと getlogrlev コマンドをここで記されているように利用します。
osgi> setlogrlev com.ibm.rcp.core.internal.pd.manager
システム・ログは、<workspace>¥logs¥error-log-0.xml にあります。 n は数字の 0 (現行ログ)、または前回実行したときのログを示す 1 です。
システム・トレース・ファイルは、<workspace>¥logs¥trace-log-0.xml にあります。 n は数字の 0 (現行ログ)、または前回実行したときのログを示す 1 です。
ログ・ファイルとトレース・ファイルの詳細については、InfoCenter の Lotus Expeditor の「トラブルシューティングおよびサポート」の『クライアント・デスクトップのトラブルシューティング』セクションを参照してください。
if(_logger.isLoggable(WARNING)){
_logger.logp(WARNING,CLAZZ_NAME, METHOD,
Nls.bind("warn.unable.to.get.preference",
new Object[]{pid,key}));
}
private boolean methodP(String param1, String param2) {
logger.entering(CLAZZ_NAME,METHOD, param1 + "," + param2);
}
| 例 | 保護すべきか? | 理由 |
|---|---|---|
| _logger.logp( Level.SEVERE, CLAZZ_NAME, METHOD, NLS.bind( Messages.MessageKey, new Object[] { element[i].getContributor().getName() } ), exception ); | いいえ | SEVERE メッセージは必ずログに記録されます。 |
| _logger.logp( Level.WARNING, CLAZZ_NAME, METHOD, Messages.MessageKey2 ); | いいえ | 警告メッセージをログに記録する簡単な呼び出し |
| _logger.logp( Level.INFO, CLAZZ_NAME, METHOD, NLS.bind( Messages.MessageKey, new Object[] { element[i].getContributor().getName(), createReportFromExtension( element[i] ) }, exception ) | はい | createReportFromExtension は、メッセージ内で置換するオブジェクトを生成するためにかなり作業を実行する必要があります。 |
| _logger.entering( CLAZZ_NAME, METHOD ) | いいえ | _logger.entering はレベル検査を実行し、その結果コードの読み取りが簡単になります。 |
String result = "something" ... _logger.exiting( CLAZZ_NAME, METHOD, result ) |
いいえ | _logger.exiting はレベル検査を実行し、その結果コードの読み取りが簡単になります。 |
... _logger.exiting( CLAZZ_NAME, METHOD, result ) |
いいえ | 結果オブジェクトでは、ロギング・レベルが有効でない限りは、ストリングへの変換は行われません。 |
SomeObject result = getFromSomeplace(); ... _logger.exiting( CLAZZ_NAME, METHOD, result.toString() ) |
はい | toString() 操作によって大規模なストリングが作成されるので、終了メソッドの呼び出し前にそうしたストリングを解決し、大規模なストリング操作を回避するために保護検査を実行する必要があります。
注: パラメーターに toString() メソッドが組み込まれていないのであれば、この呼び出しでは保護は必要とされません。結果は exiting() 署名と一致し、java.util.logging によって提供される組み込み保護になるからです。
|
INFO
インストール操作が完了しました。
行わない: INFO をデバッグ情報、プログラム実行のトレース、頻繁に繰り返す可能性のあるイベントのために使用したり、関連するイベントでの問題の原因判別に役立つのでない限り、確認するだけの目的で使用することはしません。
WARNING
URL EXPEDITOR.png のページ・ファイルの検索に失敗しました。
行わない: WARNING は、その問題によって機能の使用が完全にまたはかなり除去される場合、 または機能の低下を示していない情報メッセージのためには使用しません。
SEVERE
プラグイン・カスタマイズ・ファイルのロード中にエラーが生じました。
行わない: SEVERE は、機能のすべてまたはほとんどが引き続き使用可能な場合、または問題が一時的なものである場合には使用しません。
トレースは、デフォルトでは使用不可になっています。 トレースは、開発者、品質工学の担当者、およびサポート担当者が使用するためのものです。
トレースのレベルには、FINE、FINER、および FINEST の 3 つがあります。
FINE: このレベルは、問題を理解またはデバッグしようとするときに、システムの流れや状態を説明する有意のイベントに対して使用します。 これらは通常、オブジェクト作成のレベルで、エラーとならない例外などのキャッチ文節です。
FINEST: FINEST は、通常は開発者用またはデバッグ用のトレースとなります。 これは開発の際に、システムの動作を詳細なレベルで理解しようと試みるとき、 およびコードのリリース後に難解な問題を診断しようと試みるときに使用されます。
トレースは、開発中も開発後も価値あるツールとなります。 トレースは動的な使用可能化をサポートする必要があり、java.util.logging.Logger API を使用して実行される必要があります。 経験法則によれば、開発時に価値あるものは、後になってからもその価値は失われません。 println または printStackTrace は動的な使用可能化やレベル管理をサポートしていないのでかなり使い勝手が悪く、問題判別のためにシステム・トレース・ファイルを使用するのにこれらを使用しようとすると、多くの場合思うようにできないかもしれません。
_logger.logp(Level.INFO, CLAZZ_NAME, METHOD, "Messages.PROCESS_RECS");
_logger.logp(Level.SEVERE,CLAZZ_NAME,METHOD,Messages,RCP_XML_PROCESSING_ERROR
throwable);
以下のコード例は、トレースを例示しています。
if (_logger.isLoggable(Level.FINE))
_logger.logp(CLASS_NAME_METHOD,"Setting activities for page
" + _model.getName() + ":");
}
前述の例では、_model.getName() 呼び出しにおいて、1 つのストリングを単に戻すだけでなく、より複雑な処理が必要であると想定されています。1 つのストリングだけが戻るのであれば、この場合には保護は必要ありません。
private GUID methodX(URL url, IProgressMonitor pM, boolean overrideCache) {
final String METHOD="methodX";
if (logger.isLoggable(Level.FINER)) {
logger.entering(CLASSNAME, METHOD, url==
null?"null":url.toExternalForm());
}
…
}
logger.exiting(CLASSNAME, METHOD, res);
"exiting" 呼び出しでは、このメソッドから返される結果もログに記録されます。 これもまた、障害が生じた場合に何が問題であるかを判別するためのデバッグを行う際に、とても役立ちます。
public void showApplication(URL url, String pageId, IProgressMonitor
progressMonitor)
throws IllegalArgumentException, CompositeApplicationException {
final String METHOD="showApplication";
if (logger.isLoggable(Level.FINER)) {
logger.entering(CLASSNAME,
METHOD,
new Object[] {url, pageId, progressMonitor});
}
} catch (RuntimeException e) {
logger.logp(Level.SEVERE,CLASS NAME, METHOD
Messages.PORTAL APP JOB UPDATE ERROR, e);
throw new CompositeApplicationException(e);
}
呼び出しを保護する必要が生じるたびにレベルを調べるよりも、ロガーのレベルを実行中に一度だけ調べてからキャッシュに入れられたそのレベルを参照する方が良さそうに思えるかもしれません。 しかし、この方法では OSGi コマンド・プロンプトからの更新などロガー・レベルの構成に対する動的な更新にコードが対応しなくなることがあるため、これは勧められていません。