第15章

情報のログ出力

この章では、exteNd Directorアプリケーションでの情報のログ出力に関する情報について説明します。この章は、次の節で構成されています。

 
Top of page

exteNd Directorのログ出力機能について

exteNd Directorには、いくつかの標準ログの1つまたは独自のカスタムログに情報を記述するランタイムログ出力機能が提供されています。ユーザはログに表示する情報の詳細レベルを決定できます。ログ出力はサーバコンソールに表示されます。

exteNd Directorは標準ログ機能に加え、次のものを生成できる2つのログプロバイダを含みます。

For more information    詳細については、を参照してください。

 
Top of section

ログ出力の使用

アプリケーションコードでは、すべての種類の情報をログ出力できます。ログ出力の使用には、次の内容が含まれます。

分析ツールを使用してWebサイト使用状況を確認する場合、ツールによって期待される形式でログを記述できます。

 
Top of section

ログ出力される内容

exteNd Directorのさまざまなクラスでは、エラーのステータスおよび情報が標準ログの1つに送信されます。 さらにコードでは、標準ログの1つまたは独自のログのログ変数をインスタンス化して、情報を記述できます。

使用可能なログ

exteNd Directorでは、各メインパッケージに対してログが提供されています。EboLogFactoryからログを取得する場合、独自のログ識別子を指定することによって、追加のログをアプリケーションコードに作成できます。すべてのログのメッセージはサーバコンソールに送信されます。

パッケージ

ログ識別子

ログの目的: メッセージの送信元

com.sssw.cm

CM

Content Managementサブシステム

com.sssw.fw.directory

DIRECTORY

Directoryサブシステム

com.sssw.fw

FW

Frameworkサブシステム

com.sssw.portal

PORTAL

Portalサブシステム

com.sssw.re

RE

Ruleサブシステム

com.sssw.search

SEARCH

Searchサブシステム

com.sssw.fw.security

SECURITY

Securityサブシステム

com.sssw.fw.usermgr

USER

Userサブシステム

com.ssw.wf

WF

Workflowサブシステム

詳細レベル

exteNd Directorでは、どれだけの情報がログに記述されるかを決定する4つの詳細レベルがサポートされています。これらの詳細レベルは、EbiLogインタフェースで定数として定義されます。フレームワーククラスでは、現在の詳細レベルまたはそれ以下であるメッセージのみがログに送信されます。 詳細レベルを指定するログを作成するときに、ログの詳細レベルがログ出力されているメッセージよりも低い場合、そのメッセージは表示されません。

詳細レベルの名前

説明

DEACTIVATE_LEVEL

0

ログには何も記述されません。

CRITICAL_ERROR_LEVEL

1

致命的なエラーがログに記述されます。

ERROR_LEVEL

2

予期しないエラーがログに記述されます。

WARNING_LEVEL

3

予期されるエラーがログに記述されます。

INFO_LEVEL

4

通知メッセージがログに記録されます。

TRACE_LEVEL

5

デバッグメッセージおよびアプリケーション進行状況に関するメッセージがログに記述されます。

ログの詳細レベルは、DACまたはexteNd Directorアプリケーションで変更できます。レベルを変更するコードに関する詳細については、詳細レベルの設定を参照してください。

ログ内の情報

ログ内の情報は次の形式で表示されます。

  logname | detail-level | time | thread | message

ここで使用される区切り記号は縦線です。区切り記号は変更できます。たとえば、ログをスプレッドシートにエクスポートする場合、タブ区切りまたはカンマ区切りのログを作成できます。

 
Top of section

ログの設定

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および次の「アプリケーションでのログの使用」を参照してください。

 
Top of page

アプリケーションでのログの使用

exteNd Directorのいくつかのファイル生成ウィザードには、ログ出力コードが含まれます。 たとえば、ポートレットウィザードを使用して新しいポートレットを作成すると、ログ出力コードは自動的にソースコードに追加されます。コードはログオブジェクトを取得して、各メソッドのトレースレベルでメッセージを記述します。このコードを変更すると別のコードを取得できます。 取得された例外をレポートする、またはアプリケーションステータスについての情報をログ出力するログ出力ステートメントを追加できます。この節では、使用する可能性のあるコードについて説明します。

 
Top of section

ログ出力およびスコープパス

exteNd Directorスコープパス機能を使用して、ページフローおよびワークフローアプリケーション内のログにアクセスできます。

For more information    詳細については、を参照してください。

 
Top of section

ログ出力API

ログ出力APIには次のクラスが含まれています。

 
Top of section

ログの取得

標準ログのログオブジェクトを取得するには、次のようなコードを使用します。

  import com.sssw.fw.log.*;
  EbiLog log = EboLogFactory.getLog(EboLogFactory.PORTAL);

独自のログを作成するには、引数としてログ名を指定します。

  import com.sssw.fw.log.*;
  EbiLog log = EboLogFactory.getLog("WebAppLog");

デフォルトの設定が使用されます。これは、EbiLogメソッドを使用して変更できます。

 
Top of section

詳細レベルの設定

コード内の任意の場所で、ログのログ出力レベルを確認したり、変更したりできます。 行われた変更は、コードまたはDACで設定が再び変更されるまで、今後のログ出力に対して影響されます。 たとえば、トレースにログ出力レベルを設定するには、次のコードラインを追加する必要があります。

  log.setLoggingLevel(EbiLog.TRACE_LEVEL);

注記:   ポートレットウィザード、またはログ出力コードを生成するその他のウィザードによって生成されるポートレットのログ出力メッセージを確認する場合は、ログ出力レベルをトレースに設定する必要があります。

現在のレベルは、isLevel()メソッドまたは特定のレベルを確認するメソッドの1つを使用して確認できます。

  boolean traceOn = log.isLevel(EbiLog.TRACE_LEVEL);
  boolean traceOn = log.isTrace();

メッセージをログ出力する前にレベルを確認すると効率がよくなります。この内容については、次に説明します。

 
Top of section

ログへのメッセージの追加

特定の詳細レベルでメッセージをログに送信するコードを記述すると、メッセージは、現在の詳細がそのレベルまたはそれより低いレベルである場合のみログ出力されます。 詳細レベルが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()) );

 
Top of section

ポートレットのサンプルログ出力コード

この節では、ポートレットアプリケーションで使用できるサンプルログ出力コードを示します。

トレースおよびデバッグのログ出力

ログ出力を使用して、ポートレットアプリケーションの実行を確認する場合、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 ...