ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server ログ ファイルのコンフィグレーションとログ メッセージのフィルタ処理
11g リリース 1 (10.3.1)
B55548-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

4 WebLogic Server ログ メッセージのフィルタ処理

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

以下の節では、WebLogic ロギング サービスで生成されるメッセージをフィルタ処理する方法について説明します。

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

ロガーとハンドラの役割

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

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

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

図 4-1 の説明については以下を参照
「図 4-1 WebLogic ロギング サービスのコンテキスト」の説明

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

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

TRACEDEBUGINFONOTICEWARNINGERRORCRITICALALERTEMERGENCY

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 レベル以上のメッセージをパブリッシュするように指定できます。その場合、さらに各ハンドラで以下のように設定できます。

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

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

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

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

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

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

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

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

    LoggerHelper メソッドは、Logger オブジェクトを返します。Logger については、Sun API のドキュメント (http://java.sun.com/javase/6/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 Fusion Middleware Oracle WebLogic Server API Reference』の weblogic.logging.WLLevel クラスに関する説明を参照してください。

    次に例を示します。

    setLevel(WLLevel.ALERT) 
    

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

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

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

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

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

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

    LoggerHelper メソッドは、Logger オブジェクトを返します。Logger については、Sun API のドキュメント (http://java.sun.com/javase/6/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 Fusion Middleware Oracle WebLogic Server API Reference』の weblogic.logging.WLLevel クラスに関する説明を参照してください。

    次に例を示します。

    setLevel(WLLevel.ALERT) 
    

コード リスト 4-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);
            }
        }
    }
}

Administration Console またはコマンドラインを使用すると、LogMBean インタフェースで Handler オブジェクトの重大度をコンフィグレーションできます。

コード リスト 4-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()

WLST の詳細については、『Oracle Fusion Middleware Oracle WebLogic Scripting Tool ガイド』の「WebLogic Scripting Tool の使用」を参照してください。setStdoutSeverity の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server MBean Reference』の「LogMBean」を参照してください。

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

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

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

フィルタを設定するには、次の手順に従います。

  1. java.util.logging.Filter を実装するクラスを作成します。コード リスト 4-3 を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

コード リスト 4-3 は、Deployer サブシステムからのすべてのメッセージを拒否するクラスのサンプルです。

コード リスト 4-3 Java Logger オブジェクトのフィルタのサンプル

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;
        }
    }
}

Administration Console またはコマンドラインを使用すると、LogMBean インタフェースで Handler オブジェクトのフィルタをコンフィグレーションできます。

コード リスト 4-4 ドメイン ログ フィルタの設定

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 の詳細については、『Oracle Fusion Middleware Oracle WebLogic Scripting Tool ガイド』の「WebLogic Scripting Tool の使用」を参照してください。setDomainLogBroadcastFilter の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server MBean Reference』の「LogMBean」を参照してください。

ドメイン ログ メッセージのフィルタ処理

各管理対象サーバからドメイン ログにパブリッシュされるメッセージをフィルタ処理する場合は、Administration Console (「ログ フィルタの作成」を参照) または WLST (コード リスト 4-4 を参照) を使用して、ドメイン ログのログ フィルタを作成できます。

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

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


注意 :

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

Administration Console を使用した WebLogic Server インスタンスのドメイン ログ フィルタのコンフィグレーションについては、Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「ログ メッセージのフィルタ処理」を参照してください。

Log4j アペンダに対する重大度とフィルタの設定

Administration Console と WLST を使用すると、標準 MBean コマンドで Appender オブジェクトに対する重大度を設定できます。Logger オブジェクトの重大度を設定するには、この節で説明するように Logger API を使用するか、「ロガーの重大度の指定」で説明するように Administration Console、WLST、またはコマンドラインを使用して設定することができます。

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

  1. 以下の Log4jLoggingHelper メソッド (コード リスト 4-5 を参照) の 1 つを呼び出します。

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

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

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

    Enumeration e = logger.getAllAppenders();
    

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

  3. アペンダのリストを検索して、各アペンダ名を取得します。

  4. app.setThreshold(WLLog4jLevel level) メソッドを呼び出します。

    Log4j Appender オブジェクトのレベルを設定するには、weblogic.logging.log4j.WLLog4jLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、org.apache.log4j.Level を対応する WLLevel にマップします。有効な値については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の weblogic.logging.WLLevel クラスに関する説明を参照してください。

フィルタを設定するには、org.apache.log4j.Filter を拡張するクラスを実装し、フィルタをアペンダに追加して、app.addFilter(Filter newFilter) メソッドを呼び出します。

コード リスト 4-5 は、以下のことを行うクラスのサンプルです。

コード リスト 4-5 例 : Log4j の重大度とフィルタの設定

package weblogic.logging.examples;
import java.util.Enumeration;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
import weblogic.logging.LoggerNotAvailableException;
import weblogic.logging.NonCatalogLogger;
import weblogic.logging.Severities;
import weblogic.logging.log4j.AppenderNames;
import weblogic.logging.log4j.Log4jLoggingHelper;
import weblogic.logging.log4j.WLLog4jLevel;
import weblogic.logging.log4j.WLLog4jLogEvent;
/**
 * このクラスにより Log4j アペンダに重大度とフィルタが設定される
 */
public class Log4jFilterExamplesStartup {
  public static void main(String[] args) {
    try {
      System.out.println("Invoked the log4j filter example startup class");
      Logger logger = Log4jLoggingHelper.getLog4jServerLogger();
      Enumeration e = logger.getAllAppenders();
      while (e.hasMoreElements()) {
        AppenderSkeleton app = (AppenderSkeleton) e.nextElement();
        String name = app.getName();
        if (name == null) continue;
        if (name.equals(AppenderNames.LOG_FILE_APPENDER)) { 
          // ログ ファイルに送られるメッセージの重大度のしきい値を WARNING に設定する
          // これにより、NOTICE、INFO、DEBUG、および TRACE メッセージは
          // サーバ ログ ファイルに送られなくなる
          app.setThreshold(WLLog4jLevel.WARN);
          System.out.println("Set WARNING level on the log file appender");
        } else if (name.equals(AppenderNames.STDOUT_APPENDER)) {
          // 標準出力フィルタに対して重大度を INFO に設定する
          app.setThreshold(WLLog4jLevel.INFO);
          // アペンダの既存のフィルタを最初にクリアする
          app.clearFilters();
          // HTTP サブシステムからの INFO メッセージをブロックするフィルタを追加する
          app.addFilter(new MyFilter());
        } 
      }
      // ここでフィルタをテストする
      NonCatalogLogger nc = new NonCatalogLogger("MyFilterTest");
      nc.info("INFO messages will not be published to the file but to stdout");
      nc.warning("WARNINFG messages will be published to the file and stdout"); 

    } catch(LoggerNotAvailableException lex) {
      System.err.println("Log4j logger is not available on this server
    }
  }
  /**
   * INFO レベルの HTTP サブシステムからのメッセージを拒否する
   */
  private static class MyFilter extends Filter {
    public int decide(LoggingEvent event) {
      if (event instanceof WLLog4jLogEvent) {
        WLLog4jLogEvent wlsEvent = (WLLog4jLogEvent)event;
        if (wlsEvent.getSubsystem().equals("HTTP")
          && wlsEvent.getSeverity() == Severities.INFO) {
        return DENY;
      }
    }
    return ACCEPT;
  }
 }
}