ナビゲーションをスキップ

ログ ファイルのコンフィグレーションとログ メッセージのフィルタ処理

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

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 を参照)。

 


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

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 を使用する必要があります。クライアントサイド ロギングの場合、重大度は Java ロギング API でのみ設定できます。

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

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

  1. 以下の LoggingHelper メソッドの 1 つを呼び出します。
  2. LoggerHelper メソッドは、Logger オブジェクトを返します。Logger については、Sun API のドキュメント (http://java.sun.com/j2se/1.5.0/docs/api/java/util/logging/Logger.html) を参照してください。

  3. Logger.setLevel(Level level) メソッドを呼び出します。
  4. WebLogic Server Logger オブジェクトのレベルを設定するには、weblogic.logging.WLLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、java.util.logging.Level を対応する WLLevel にマップします。有効な値のリストについては、WLLevelJavadoc を参照してください。

    次に例を示します。

    setLevel(WLLevel.ALERT)

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

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

  1. 以下の LoggingHelper メソッドの 1 つを呼び出します。
  2. LoggerHelper メソッドは、Logger オブジェクトを返します。Logger については、Sun API のドキュメント (http://java.sun.com/j2se/1.5.0/docs/api/java/util/logging/Logger.html) を参照してください。

  3. Logger.getHandlers() メソッドを呼び出します。
  4. このメソッドは、Logger オブジェクトに登録されているすべてのハンドラの配列を返します。

  5. 重大度を設定する必要のある Handler オブジェクトが見つかるまでハンドラの配列を検索します。
  6. Handler.getClass().getName() を使用すると、現在の配列インデックスが示しているハンドラのタイプがわかります。

  7. Handler.setLevel(Level level) メソッドを呼び出します。
  8. WebLogic Server Handler オブジェクトの重大度を設定するには、weblogic.logging.WLLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、java.util.logging.Level を対応する WLLevel にマップします。有効な値のリストについては、WLLevelJavadoc を参照してください。

    次に例を示します。

    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 の使い方については、『WebLogic Scripting Tool ガイド』の「コンフィグレーション MBean の編集」を参照してください。setStdoutSeverity の詳細については、『WebLogic Server MBean リファレンス』の「LogMBean」を参照してください。

 


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

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

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

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

  1. java.util.logging.Filter を実装するクラスを作成します。コード リスト 4-3 を参照してください。
  2. そのクラスには、Filter.isLoggable メソッドと、受信メッセージを評価するロジックが必要です。ロジックが true と評価した場合、isLoggable メソッドは Logger オブジェクトがそのメッセージをパブリッシュできるようにします。

  3. Logger オブジェクトが動作している JVM のクラスパスにフィルタ オブジェクトを配置します。
  4. Logger オブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。
    1. 以下の LoggingHelper メソッドの 1 つを呼び出します。
    1. Logger.setFilter(Filter newFilter) メソッドを呼び出します。
  5. API を使用して Handler オブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。
    1. 以下の LoggingHelper メソッドの 1 つを呼び出します。
    1. レベルを設定する必要のある Handler オブジェクトが見つかるまでハンドラの配列を検索します。
    2. Handler.getClass().getName() を使用すると、現在の配列インデックスが示しているハンドラのタイプがわかります。

    3. 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 の使い方については、『WebLogic Scripting Tool ガイド』の「コンフィグレーション MBean の編集」を参照してください。setDomainLogBroadcastFilter の詳細については、『WebLogic Server MBean リファレンス』の「LogMBean」を参照してください。

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

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

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

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

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

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

 


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

Administration Console と WLST を使用すると、標準 MBean コマンドで Appender オブジェクトに対する重大度を設定できます。Logger オブジェクトに対して重大度を設定するには、Logger API を使用する必要があります。

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

  1. 以下の Log4jLoggingHelper メソッド (コード リスト 4-5 を参照) の 1 つを呼び出します。
  2. logger.getAllAppenders() メソッドを呼び出します。
  3. Enumeration e = logger.getAllAppenders();

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

  4. アペンダのリストを検索して、各アペンダ名を取得します。
  5. app.setThreshold(WLLog4jLevel level) メソッドを呼び出します。
  6. Log4j Appender オブジェクトのレベルを設定するには、weblogic.logging.log4j.WLLog4jLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、org.apache.log4j.Level を対応する WLLevel にマップします。有効な値のリストについては、WLLevelJavadoc を参照してください。

フィルタを設定するには、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;
  }
 }
}

 

フッタのナビゲーションのスキップ  ページの先頭 前 次