3 WebLogic Serverログ・メッセージのフィルタリング

Oracle WebLogic Serverロギング・サービスでは、フィルタ処理オプションを利用できます。このため、どのメッセージがWebLogic Serverログ・ファイルと標準出力に書き込まれ、どのメッセージがクライアントJVMが管理するログ・ファイルと標準出力に書き込まれるのかを柔軟に指定できます。それらのフィルタリング機能のほとんどは、 java.util.logging パッケージのJavaロギングAPIの実装です。

関連情報については、以下を参照してください。

ロガーとハンドラの役割

WebLogic Serverメッセージ・カタログおよびNonCatalogLoggerでメッセージが生成されるとき、それらのメッセージはjava.util.logging.Loggerオブジェクトに配信されます。Loggerオブジェクトは、Loggerをサブスクライブしているメッセージ・ハンドラにメッセージをパブリッシュします。

WebLogic Serverでは、以下の3つの異なるコンテキストでLoggerオブジェクトおよびHandlerオブジェクトがインスタンス化されます。詳細は、図3-1を参照してください。

  • WebLogicロギング・サービスを使用するクライアントJVMで。このクライアントLoggerオブジェクトは、クライアントJVMで動作するクライアント・アプリケーションから送信されるメッセージをパブリッシュします。

    以下のハンドラが、クライアントJVMのLoggerオブジェクトをサブスクライブします。

    • ConsoleHandler。クライアントJVMからのメッセージをクライアントの標準出力に出力します。

      クライアントJVMで-Dweblogic.log.StdoutSeverityLevel Java起動オプションを使用すると、WebLogicロギング・サービスにより、ハンドラから標準出力に書き込まれるメッセージを制限するフィルタがこのハンドラ用に作成されます。『Oracle WebLogic ServerにデプロイされたアプリケーションへのWebLogicロギング・サービスの追加』クライアント・アプリケーションからのメッセージの書込みに関する項を参照してください。

    • FileStreamHandler。クライアントJVMからのメッセージをクライアントのログ・ファイルに書き込みます。

  • WebLogic Serverの各インスタンスで。このサーバーLoggerオブジェクトは、サーバー・インスタンスで動作するサブシステムおよびアプリケーションから送信されるメッセージをパブリッシュします。

    以下のハンドラが、サーバーLoggerオブジェクトをサブスクライブします。

    • ConsoleHandler。メッセージをサーバーの標準出力に出力できるようにします。

    • FileStreamHandler。サーバー・ログ・ファイルにメッセージを書き込みます。

    • 内部ハンドラ。ドメイン・ログおよびJMXクライアントにメッセージをブロードキャストし、管理サーバーにメッセージをパブリッシュします。

  • 管理サーバーはサーバーLoggerオブジェクトに加えてドメインLoggerオブジェクトも管理します。ドメインLoggerオブジェクトは、各管理対象サーバーのLoggerオブジェクトからメッセージを受信します。

    以下のハンドラが、ドメインLoggerオブジェクトをサブスクライブします。

    • FileStreamHandler。ドメイン・ログ・ファイルにメッセージを書き込みます。

図3-1 WebLogicロギング・サービスのコンテキスト

図3-1の説明が続く
「図3-1 WebLogicロギング・サービスのコンテキスト」の説明

重大度などの条件によるメッセージのフィルタリング

WebLogic Serverメッセージ・カタログおよびNonCatalogLoggerでメッセージが生成されるときには、メッセージの重大度がweblogic.logging.WLLevelオブジェクトに変換されます。WLLevelオブジェクトは、以下の値(影響の小さい方から大きい方の順で並んでいます)のいずれかを指定できます。
Trace, Debug, Info, Notice, Warning, Error, Critical, Alert, Emergency

Loggerオブジェクトは、デフォルトでは全レベルのメッセージをパブリッシュします。Loggerオブジェクトがパブリッシュする最低レベルのメッセージを設定するには、単純なLogger.setLevel APIを使用します。メッセージを受信すると、LoggerオブジェクトはそのメッセージのレベルとsetLevel APIで設定されたレベルを照合します。メッセージのレベルがLoggerのレベルより下である場合は、すぐに復帰します。メッセージのレベルがLoggerのレベルより上である場合、Loggerはそのメッセージを説明するWLLogRecordオブジェクトを割り当てます。

たとえば、LoggerオブジェクトのレベルをWarningに設定した場合、LoggerオブジェクトはWarningErrorCriticalAlert、またはEmergencyのメッセージのみをパブリッシュします。

Loggerオブジェクトがパブリッシュするメッセージをより細かく管理できるようにするために、フィルタを作成して設定することもできます。フィルタとは、WLLogRecordオブジェクトのデータを一連の条件と比較するクラスのことです。Loggerオブジェクトは、フィルタの条件を満たすWLLogRecordオブジェクトだけをパブリッシュします。たとえば、フィルタを使用してJDBCサブシステムからのメッセージのみパブリッシュするようにLoggerを構成できます。フィルタを作成するには、java.util.logging.Filterオブジェクトをインスタンス化し、Logger.setFilter APIを使用してそれをLoggerオブジェクトに設定します。

Loggerオブジェクトがパブリッシュするメッセージのレベルとフィルタを設定するかわりに(またはそれに加えて)、個々のメッセージ・ハンドラでレベルとフィルタを設定することもできます。

たとえば、LoggerWarningレベル以上のメッセージをパブリッシュするように指定できます。その場合、さらに各ハンドラで以下のように設定できます。

  • ConsoleHandlerにおいて、JDBC、JMS、およびEJBサブシステムからのAlertメッセージのみを選択するレベルとフィルタを設定します。設定するとJDBC、JMS、およびEJBサブシステムからのAlertメッセージのみが標準出力で表示されます。

  • FileStreamHandlerにおいては、レベルまたはフィルタ条件を追加設定しません。LoggerオブジェクトはWarningレベル以上のメッセージのみをパブリッシュするように構成されているので、ログ・ファイルには、すべてのサブシステムからの、重大度がWarning以上のすべてのメッセージが格納されます。

  • 重大度がWarning以上のすべてのメッセージを管理サーバーのドメイン全体のメッセージ・ログにパブリッシュします。

ロガーとハンドラに対する重大度の設定

メッセージを重大度によってフィルタ処理するには、WLSTコマンドを使用してHandlerオブジェクトおよびLoggerオブジェクトの重大度を設定できます。

WLSTコマンドを使用すると、標準MBeanコマンドでHandlerオブジェクトに対する重大度を設定できます。 Loggerオブジェクトに対して重大度を設定するには、Logger APIを使用できます。ロガーの重大度は、WLSTまたはコマンド行からも設定することができます。「ロガーの重大度の指定」を参照してください。WLSクライアント(EJBクライアント、Webサービス・クライアントなど)のロガーおよびハンドラの重大度を構成するには、JavaロギングAPIを使用する必要があります。

ロガーに対する重大度の設定

Loggerオブジェクトの重大度を設定するには、次のように動作するクラスを作成します。

  1. 以下のLoggingHelperメソッドの1つを呼び出します。
    • getClientLogger (現在のコンテキストがクライアントJVMである場合)。

    • getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトを取得する必要がある場合)。

    • getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・ログを管理するLoggerオブジェクトを取得する必要がある場合)。

    LoggerHelperメソッドは、Loggerオブジェクトを返します。Loggerクラスについては、APIのドキュメント(http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html)を参照してください。

  2. Logger.setLevel(Level level)メソッドを呼び出します。

    WebLogic Server Loggerオブジェクトのレベルを設定するには、weblogic.logging.WLLevelクラスで定義されている値を渡す必要があります。WebLogic Serverは、java.util.logging.Levelを、対応するWLLevelにマップします。有効な値のリストは、Oracle WebLogic Server Java APIリファレンスweblogic.logging.WLLevelクラスの説明を参照してください。

    たとえば:

    setLevel(WLLevel.Alert) 

ハンドラに対する重大度の設定

APIを使用してHandlerオブジェクトの重大度を設定するには、次のように動作するクラスを作成します(例3-1を参照)。

  1. 以下のLoggingHelperメソッドの1つを呼び出します。
    • getClientLogger (現在のコンテキストがクライアントJVMである場合)。

    • getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトを取得する必要がある場合)。

    • getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・ログを管理するLoggerオブジェクトを取得する必要がある場合)。

    LoggerHelperメソッドは、Loggerオブジェクトを返します。Loggerクラスについては、APIのドキュメント(http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html)を参照してください。

  2. Logger.getHandlers()メソッドを呼び出します。

    このメソッドは、Loggerオブジェクトに登録されているすべてのハンドラの配列を返します。

  3. レベルを設定する必要のあるHandlerオブジェクトが見つかるまでハンドラの配列を検索します。

    Handler.getClass().getName()を使用すると、現在の配列索引が示しているハンドラのタイプがわかります。

  4. Handler.setLevel(Level level)メソッドを呼び出します。

    WebLogic Server Handlerオブジェクトのレベルを設定するには、weblogic.logging.WLLevelクラスで定義されている値を渡す必要があります。WebLogic Serverは、java.util.logging.Levelを、対応するWLLevelにマップします。有効な値のリストは、Oracle WebLogic Server Java APIリファレンスweblogic.logging.WLLevelクラスの説明を参照してください。

    たとえば:

    setLevel(WLLevel.Alert) 
例: ハンドラに対する重大度の設定

次の例は、APIを使用してハンドラに対する重大度を設定する方法を示します。

例3-1 例: APIを使用したHandlerオブジェクトの重大度の設定

import java.util.logging.Logger;
import java.util.logging.Handler;
import weblogic.logging.LoggingHelper;
import weblogic.logging.WLLevel;
public class LogLevel {
    public static void main(String[] argv) throws Exception {
        Logger serverlogger = LoggingHelper.getServerLogger();
        Handler[] handlerArray = serverlogger.getHandlers();
        for (int i=0; i < handlerArray.length; i++) {
            Handler h = handlerArray[i];
            if(h.getClass().getName().equals
                      ("weblogic.logging.ConsoleHandler")){
                h.setLevel(WLLevel.Alert);
            }
        }
    }
}
例: 標準出力ハンドラに対する重大度の設定

コマンド行を使用すると、LogMBeanインタフェースでHandlerオブジェクトの重大度を構成できます。

  • 例3-2のWLSTコマンドは、標準出力ハンドラの重大度をInfoに設定します。

WebLogic Scripting Toolの理解WebLogic Scripting Toolの使用を参照してください。setStdoutSeverityの詳細は、Oracle WebLogic Server MBeanリファレンスLogMBeanに関する項を参照してください。

例3-2 標準出力ハンドラに対する重大度の設定

C:\>java weblogic.WLST
wls:/offline> connect('username','password')
wls:/mydomain/serverConfig> edit()
wls:/mydomain/edit> startEdit()
wls:/mydomain/edit !> cd("Servers/myserver/Log/myserver")
wls:/mydomain/edit/Servers/myserver/Log/myserver !> cmo.setStdoutSeverity("Info")
wls:/mydomain/edit/Servers/myserver/Log/myserver !> save()
wls:/mydomain/edit/Servers/myserver/Log/myserver !> activate()

ロガーとハンドラのフィルタの設定

Loggerオブジェクトでフィルタを設定した場合、そのフィルタはオブジェクトがどのメッセージをパブリッシュするのかを指定します。したがって、フィルタはLoggerオブジェクトに登録されているすべてのハンドラにも影響します。Handlerでフィルタを設定した場合、そのフィルタはその特定のハンドラの動作にのみ影響します。

WLSTを使用すると、標準MBeanコマンドでHandlerオブジェクトに対するフィルタを設定できます。Loggerオブジェクトにフィルタを設定するには、Logger APIを使用する必要があります。クライアント側ロギングの場合、フィルタはJavaロギングAPIでのみ設定できます。

フィルタを設定するには:

  1. java.util.logging.Filterを実装するクラスを作成します。

    そのクラスには、Filter.isLoggableメソッドと、受信メッセージを評価するロジックが必要です。ロジックがtrueと評価した場合、isLoggableメソッドはLoggerオブジェクトがそのメッセージをパブリッシュできるようにします。

  2. Loggerオブジェクトが動作しているJVMのクラスパスにフィルタ・オブジェクトを配置します。

  3. Loggerオブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。

    以下のLoggingHelperメソッドの1つを呼び出します。

    • getClientLogger (現在のコンテキストがクライアントJVMである場合)。

    • getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトをフィルタ処理する必要がある場合)。

    • getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・サーバー・ログを管理するLoggerオブジェクトをフィルタ処理する必要がある場合)。

    Logger.setFilter(Filter newFilter)メソッドを呼び出します。

  4. APIを使用してHandlerオブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。

    以下のLoggingHelperメソッドの1つを呼び出します。

    • getClientLogger (現在のコンテキストがクライアントJVMである場合)。

    • getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトをフィルタ処理する必要がある場合)。

    • getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・サーバー・ログを管理するLoggerオブジェクトをフィルタ処理する必要がある場合)。

    1. レベルを設定する必要のあるHandlerオブジェクトが見つかるまでハンドラの配列を検索します。

      Handler.getClass().getName()を使用すると、現在の配列索引が示しているハンドラのタイプがわかります。

    2. Handler.setFilter(Filter newFilter)メソッドを呼び出します。

Deployerサブシステムからのすべてのメッセージを拒否するクラスのサンプルを次に示します。

import java.util.logging.Logger;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
import weblogic.logging.WLLogRecord;
import weblogic.logging.WLLevel;
public class MyFilter implements Filter {
    public boolean isLoggable(LogRecord record) {
        if (record instanceof WLLogRecord) {
            WLLogRecord rec = (WLLogRecord)record;
            if (rec.getLoggerName().equals("Deployer")) {
              return false;
            } else {
              return true;
            }
        } else {
          return false;
        }
    }
}

コマンド行を使用すると、LogMBeanインタフェースでHandlerオブジェクトのフィルタを構成できます。

  • 次の例のWLSTコマンドは、ドメイン・ログ・ブロードキャスタに対するフィルタを作成して設定します。

    C:\>java weblogic.WLST
    wls:/offline> connect('username','password')
    wls:/mydomain/serverConfig> edit()
    wls:/mydomain/edit> startEdit()
    wls:/mydomain/edit !> cmo.createLogFilter('myFilter')
    wls:/mydomain/edit !> cd("Servers/myserver/Log/myserver")
    wls:/mydomain/edit/Servers/myserver/Log/myserver !> cmo.setDomainLogBroadcastFilter(getMBean('/LogFilters/myFilter'))
    wls:/mydomain/edit/Servers/myserver/Log/myserver !> save()
    wls:/mydomain/edit/Servers/myserver/Log/myserver !> activate()
    

WLSTの使用に関する詳細は、『WebLogic Scripting Toolの理解』WebLogic Scripting Toolの使用に関する項を参照してください。setDomainLogBroadcastFilterの詳細は、Oracle WebLogic Server MBeanリファレンスLogMBeanに関する項を参照してください。

ドメイン・ログ・メッセージのフィルタリング

各管理対象サーバーからドメイン・ログにパブリッシュされるメッセージをフィルタ処理するには、WLSTまたはWebLogicリモート・コンソールを使用してドメイン・ログのログ・フィルタを作成できます。リモート・コンソールを使用してログ・フィルタを作成する方法の詳細は、Oracle WebLogic Remote Consoleオンライン・ヘルプログ・フィルタの作成に関する項を参照してください。

ただし、サーバー・インスタンスのログ・ファイルを管理するLoggerオブジェクトでJavaロギングの重大度またはフィルタを設定すると、ドメイン・ログ・フィルタは無効となります。たとえば、サーバーのLoggerオブジェクトの重大度がWarningに設定されている場合、ドメイン・ログ・フィルタはWarningレベル以上のメッセージのみを受信します。

1つまたは複数のサーバーがドメイン・ログに送信するメッセージを変更するドメイン・ログ・フィルタを定義できます。デフォルトでは、重大度がNotice以上のすべてのメッセージが送られます。

ノート:

重大度がDebugのメッセージは、フィルタを使用してもドメイン・ログには送信されません。

WebLogicリモート・コンソールを使用したWebLogic Serverインスタンスのドメイン・ログ・フィルタの構成の詳細は、Oracle WebLogic Remote Consoleオンライン・ヘルプログ・メッセージのフィルタ処理に関する項を参照してください。