第15章
この章では、exteNd Directorアプリケーションでの情報のログ出力に関する情報について説明します。この章は、次の節で構成されています。
exteNd Directorには、いくつかの標準ログの1つまたは独自のカスタムログに情報を記述するランタイムログ出力機能が提供されています。ユーザはログに表示する情報の詳細レベルを決定できます。ログ出力はサーバコンソールに表示されます。
exteNd Directorは標準ログ機能に加え、次のものを生成できる2つのログプロバイダを含みます。
アプリケーションコードでは、すべての種類の情報をログ出力できます。ログ出力の使用には、次の内容が含まれます。
分析ツールを使用してWebサイト使用状況を確認する場合、ツールによって期待される形式でログを記述できます。
exteNd Directorのさまざまなクラスでは、エラーのステータスおよび情報が標準ログの1つに送信されます。 さらにコードでは、標準ログの1つまたは独自のログのログ変数をインスタンス化して、情報を記述できます。
exteNd Directorでは、各メインパッケージに対してログが提供されています。EboLogFactoryからログを取得する場合、独自のログ識別子を指定することによって、追加のログをアプリケーションコードに作成できます。すべてのログのメッセージはサーバコンソールに送信されます。
exteNd Directorでは、どれだけの情報がログに記述されるかを決定する4つの詳細レベルがサポートされています。これらの詳細レベルは、EbiLogインタフェースで定数として定義されます。フレームワーククラスでは、現在の詳細レベルまたはそれ以下であるメッセージのみがログに送信されます。 詳細レベルを指定するログを作成するときに、ログの詳細レベルがログ出力されているメッセージよりも低い場合、そのメッセージは表示されません。
ログの詳細レベルは、DACまたはexteNd Directorアプリケーションで変更できます。レベルを変更するコードに関する詳細については、詳細レベルの設定を参照してください。
ログ内の情報は次の形式で表示されます。
logname | detail-level | time | thread | message
ここで使用される区切り記号は縦線です。区切り記号は変更できます。たとえば、ログをスプレッドシートにエクスポートする場合、タブ区切りまたはカンマ区切りのログを作成できます。
DACでは、カスタムログも含めて各ログの詳細レベルを指定できます。ターゲットサブシステムのconfig.xmlにいくつかのエントリを追加することによって、独自のカスタムログを定義することもできます。たとえば、次のプロパティ設定をカスタムWebアプリケーションのconfig.xmlに追加することによって、MyLogと呼ばれるカスタムログをポータルWeb階層に追加できます。
<property> <key>MyLog.LoggingLevel</key> <value>3</value> </property> <property> <key>MyLog.LogFieldSeparator</key> <value>|</value> </property> <property> <key>MyLog.LoggingProvider</key> <value>com.sssw.fw.log.EboStandardOutLoggingProvider</value> </property>
コードのログ設定を変更することもできます。詳細については、com.sssw.fw.api.EbiLogおよび次の「アプリケーションでのログの使用」を参照してください。
exteNd Directorのいくつかのファイル生成ウィザードには、ログ出力コードが含まれます。 たとえば、ポートレットウィザードを使用して新しいポートレットを作成すると、ログ出力コードは自動的にソースコードに追加されます。コードはログオブジェクトを取得して、各メソッドのトレースレベルでメッセージを記述します。このコードを変更すると別のコードを取得できます。 取得された例外をレポートする、またはアプリケーションステータスについての情報をログ出力するログ出力ステートメントを追加できます。この節では、使用する可能性のあるコードについて説明します。
exteNd Directorスコープパス機能を使用して、ページフローおよびワークフローアプリケーション内のログにアクセスできます。
ログ出力APIには次のクラスが含まれています。
標準ログのログオブジェクトを取得するには、次のようなコードを使用します。
import com.sssw.fw.log.*; EbiLog log = EboLogFactory.getLog(EboLogFactory.PORTAL);
独自のログを作成するには、引数としてログ名を指定します。
import com.sssw.fw.log.*; EbiLog log = EboLogFactory.getLog("WebAppLog");
デフォルトの設定が使用されます。これは、EbiLogメソッドを使用して変更できます。
コード内の任意の場所で、ログのログ出力レベルを確認したり、変更したりできます。 行われた変更は、コードまたはDACで設定が再び変更されるまで、今後のログ出力に対して影響されます。 たとえば、トレースにログ出力レベルを設定するには、次のコードラインを追加する必要があります。
log.setLoggingLevel(EbiLog.TRACE_LEVEL);
注記: ポートレットウィザード、またはログ出力コードを生成するその他のウィザードによって生成されるポートレットのログ出力メッセージを確認する場合は、ログ出力レベルをトレースに設定する必要があります。
現在のレベルは、isLevel()メソッドまたは特定のレベルを確認するメソッドの1つを使用して確認できます。
boolean traceOn = log.isLevel(EbiLog.TRACE_LEVEL); boolean traceOn = log.isTrace();
メッセージをログ出力する前にレベルを確認すると効率がよくなります。この内容については、次に説明します。
特定の詳細レベルでメッセージをログに送信するコードを記述すると、メッセージは、現在の詳細がそのレベルまたはそれより低いレベルである場合のみログ出力されます。 詳細レベルがCRITICAL_ERROR_LEVELである場合、アプリケーションが実行してtrace()を呼び出すと、メッセージはログ出力されません。
メッセージは常にログ出力されるわけではないので、メッセージをログ出力する詳細レベルを確認することによって、使用されない文字列をインスタンス化する手間を省くことができます。
たとえば、一番低いログ出力レベルであるlog.isCritical()は、このログ出力レベルおよびそれより高いログ出力レベルに対してtrueを返します。このため、ログ出力がオフでない限り、重要なメッセージは常にログに記録されます。
log.isError()は、ERROR_LEVELおよびそれより高いレベルに対してtrueを返します。このため、レベルがCRITICAL_ERROR_LEVELに設定されていない限り、エラーレベルメッセージはログ出力されます。
すべてのログ出力を受け入れるには、ログ出力を一番高く最も詳しいTRACE_LEVELレベルに設定します。
特定の詳細レベルでメッセージをログ出力するには、そのレベルに対してメソッドを呼び出すことができます。
if (log.isTrace() ) { log.trace("Portlet returned content type: " + request.getContentType() ); }
catchブロックでは、次のようにエラーをログ出力できます。
catch (EboException e) { log.error("General portal exception:" + e.printStackTrace(context.getLocale()) ); }
汎用logString()メソッドを呼び出して、レベルを指定することもできます。
log.logString("message", EbiLog.ERROR_LEVEL);
EboLogFactoryのbroadcast()メソッドを使用して、メッセージをすべてのログに送信できます。 アプリケーション動作の変更を記録できるように、条件が変更した場合にログにマークを設定するためにこれを使用することもできます。
EboLogFactory.broadcast("Application going into production now!");
ブロードキャストは致命的なエラーレベルで送信され、ログ出力が無効でない限り表示されます。メッセージは各ログに対して一度表示されます。
ログメッセージの一部としてユーザIDを含めることによって、個々のセッションを識別できます。たとえば、次のとおりです。
log.error(request.getUserPrincipal(getName() + log.getLogFieldSeparator() + "General portal exception: " + e.printStackTrace(context.getLocale()) );
この節では、ポートレットアプリケーションで使用できるサンプルログ出力コードを示します。
ログ出力を使用して、ポートレットアプリケーションの実行を確認する場合、PORTALログを次のようにインスタンス化します。
EbiLog log = com.sssw.fw.log.EboLogFactory.getLog( com.sssw.fw.log.EboLogFactory.PORTLET);
ポートレットコードは、コンテンツをトレースレベルで生成して、エラーレベルで取得された例外をすべてログ出力します。 この例は、portlet doView()メソッドでのログ出力を示します。
public void doView( RenderRequest request, RenderResponse response ) throws PortletException, java.io.IOException { try { PortletURL renderUrl = response.createRenderURL(); renderUrl.setPortletMode( PortletMode.VIEW ); PrintWriter writer = response.getWriter(); response.setContentType( EbiPortletConstants.MIME_TYPE_HTML ); // Build the screen of HTML, set it as the content StringBuffer sb = new StringBuffer(); // Output code goes here sb.append( "View Mode" ); sb.append( "<br></br>" ); writer.print( sb.toString() ); } catch (EboUnrecoverableSystemException e) { ... // code to respond to error // Error string replaces portlet content sb.replace(0, sb.length(), "msg describing what user should do"); if (log.isCritical()) { log.criticalError(this.getPortletName() + " : Bad system error \n" + e.printStackTrace() ); } } catch (EboApiException e) { ... // code to respond to error if (log.isError()) { log.error(this.getPortletName() + " : framework error \n" + e.printStackTrace() ); } } catch (EboFactoryException e) { ... // code to respond to error if (log.isError()) { log.error(this.getPortletName() + " : factory exception \n" + e.printStackTrace() ); } } catch (RuntimeException e) { ... // code to respond to error if (log.isWarning()) { log.warning(this.getPortletName() + " : runtime exception \n" + e.printStackTrace() ); } } catch ( Throwable e ) { // Log other errors generated log.error(e); new PortletException( e ); } }
ユーザが使用するクライアントおよびユーザがアクセスするページに関するデータを収集する場合、次の例で示すように、この情報をAPP_USAGEログに追加できます。
// Instantiate the log EbiLog log = com.sssw.fw.log.EboLogFactory.getLog(APP_USAGE); // log data in this format: // currentpage!browsername!browserversion!platform!callingpage java.util.Map browserinfo = context.getBrowserInfo(); StringBuffer sb = new StringBuffer(); sb.append(context.getURI() ); sb.append("!"); sb.append(getMapValue(browserinfo, EboRequestHelper.BROWSER_NAME)); sb.append("!"); sb.append(getMapValue(browserinfo, EboRequestHelper.BROWSER_MAJOR_VER)); sb.append("!"); sb.append(getMapValue(browserinfo, EboRequestHelper.PLATFORM)); sb.append("!"); sb.append(context.getCallingPage() ); if (log.isInfo()) { log.info(sb.toString() ); } // Private method to get browser information from the Map object: private String getMapValue(Map map, String key) { String val; if (map.containsKey(key)) { val = (String) map.get(key); } else { val = ""; } return val; }
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...