|
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 を参照)。
Logger オブジェクトは、クライアント JVM で動作するクライアント アプリケーションから送信されるメッセージをパブリッシュします。
以下のハンドラが、クライアント JVM の Logger オブジェクトをサブスクライブします。
ConsoleHandler。クライアント JVM からのメッセージをクライアントの標準出力に出力します。
クライアント JVM で -Dweblogic.log.StdoutSeverityLevel Java 起動オプションを使用すると、WebLogic ロギング サービスにより、ハンドラから標準出力に書き込まれるメッセージを制限するフィルタがこのハンドラ用に作成されます。『アプリケーション ロギングの WebLogic ロギング サービス ユーザーズ ガイド』の「クライアント アプリケーションからのメッセージの書き込み」を参照してください。
FileStreamHandler。クライアント JVM からのメッセージをクライアントのログ ファイルに書き込みます。Logger オブジェクトは、サーバ インスタンスで動作するサブシステムおよびアプリケーションから送信されるメッセージをパブリッシュします。
以下のハンドラが、サーバ Logger オブジェクトをサブスクライブします。
Logger オブジェクトに加えてドメイン Logger オブジェクトも管理する。ドメイン Logger オブジェクトは、各管理対象サーバの Logger オブジェクトからメッセージを受信します。
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 オブジェクトは WARNING、ERROR、CRITICAL、ALERT、または EMERGENCY のメッセージのみをパブリッシュします。
Logger オブジェクトがパブリッシュするメッセージをより細かく管理できるようにするために、フィルタを作成して設定することもできます。フィルタとは、WLLogRecord オブジェクトのデータを一連の条件と比較するクラスのことです。Logger オブジェクトは、フィルタの条件を満たす WLLogRecord オブジェクトだけをパブリッシュします。たとえば、フィルタを使用して JDBC サブシステムからのメッセージのみパブリッシュするように Logger をコンフィグレーションできます。フィルタを作成するには、java.util.logging.Filter オブジェクトをインスタンス化し、Logger.setFilter API を使用してそれを Logger オブジェクトに設定します。
Logger オブジェクトがパブリッシュするメッセージのレベルとフィルタを設定する代わりに (またはそれに加えて)、個々のメッセージ ハンドラでレベルとフィルタを設定することもできます。
たとえば、Logger が WARNING レベル以上のメッセージをパブリッシュするように指定できます。その場合、さらに各ハンドラで以下のように設定できます。
ConsoleHandler において、JDBC、JMS、および EJB サブシステムからの ALERT メッセージのみを選択するレベルとフィルタを設定する。設定すると JDBC、JMS、および EJB サブシステムからの ALERT メッセージのみが標準出力で表示されます。FileStreamHandler においては、レベルまたはフィルタ条件を追加設定しない。Logger オブジェクトは WARNING レベル以上のメッセージのみをパブリッシュするようにコンフィグレーションされているので、ログ ファイルには、すべてのサブシステムからの、重大度が WARNING 以上のすべてのメッセージが格納されます。WARNING 以上のすべてのメッセージを管理サーバのドメイン全体のメッセージ ログにパブリッシュする。
Administration Console と WLST を使用すると、標準 MBean コマンドで Handler オブジェクトに対する重大度を設定できます。Logger オブジェクトに対して重大度を設定するには、Logger API を使用できます。ロガーの重大度は、Administrator Console、WLST、またはコマンドラインからも設定することができます。「ロガーの重大度の指定」を参照してください。WLS クライアント (EJB クライアント、Web サービス クライアントなど) のロガーおよびハンドラの重大度をコンフィグレーションするには、Java ロギング API を使用する必要があります。
Logger オブジェクトの重大度を設定するには、次のように動作するクラスを作成します。
LoggingHelper メソッドの 1 つを呼び出します。getClientLogger (現在のコンテキストがクライアント JVM である場合)。getServerLogger (現在のコンテキストがサーバ JVM であり、かつローカル サーバ ログを管理するためにサーバで使用される Logger オブジェクトを取得する必要がある場合)。getDomainLogger (現在のコンテキストが管理サーバであり、かつドメイン ログを管理する Logger オブジェクトを取得する必要がある場合)。
LoggerHelper メソッドは、Logger オブジェクトを返します。Logger については、Sun API のドキュメント (http://java.sun.com/j2se/1.5.0/docs/api/java/util/logging/Logger.html) を参照してください。
Logger.setLevel(Level level) メソッドを呼び出します。
WebLogic Server Logger オブジェクトのレベルを設定するには、weblogic.logging.WLLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、java.util.logging.Level を対応する WLLevel にマップします。有効な値のリストについては、WLLevel の Javadoc を参照してください。
API を使用して Handler オブジェクトの重大度を設定するには、次のように動作するクラスを作成します (コード リスト 4-1 を参照)。
LoggingHelper メソッドの 1 つを呼び出します。getClientLogger (現在のコンテキストがクライアント JVM である場合)。getServerLogger (現在のコンテキストがサーバ JVM であり、かつローカル サーバ ログを管理するためにサーバで使用される Logger オブジェクトを取得する必要がある場合)。getDomainLogger (現在のコンテキストが管理サーバであり、かつドメイン ログを管理する Logger オブジェクトを取得する必要がある場合)。
LoggerHelper メソッドは、Logger オブジェクトを返します。Logger については、Sun API のドキュメント (http://java.sun.com/j2se/1.5.0/docs/api/java/util/logging/Logger.html) を参照してください。
Logger.getHandlers() メソッドを呼び出します。
このメソッドは、Logger オブジェクトに登録されているすべてのハンドラの配列を返します。
Handler オブジェクトが見つかるまでハンドラの配列を検索します。
Handler.getClass().getName() を使用すると、現在の配列インデックスが示しているハンドラのタイプがわかります。
Handler.setLevel(Level level) メソッドを呼び出します。
WebLogic Server Handler オブジェクトの重大度を設定するには、weblogic.logging.WLLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、java.util.logging.Level を対応する WLLevel にマップします。有効な値のリストについては、WLLevel の Javadoc を参照してください。
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 オブジェクトの重大度をコンフィグレーションできます。
INFO に設定する。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 ガイド』の「WebLogic Scripting Tool の使用」を参照してください。setStdoutSeverity の詳細については、『WebLogic Server MBean リファレンス』の「LogMBean」を参照してください。
Logger オブジェクトでフィルタを設定した場合、そのフィルタはオブジェクトがどのメッセージをパブリッシュするのかを指定します。したがって、フィルタは Logger オブジェクトに登録されているすべてのハンドラにも影響します。ハンドラでフィルタを設定した場合、そのフィルタはその特定のハンドラの動作にのみ影響します。
Administration Console と WLST を使用すると、標準 MBean コマンドで Handler オブジェクトに対するフィルタを設定できます。Logger オブジェクトにフィルタを設定するには、Logger API を使用する必要があります。クライアントサイド ロギングの場合、フィルタは Java ロギング API でのみ設定できます。
java.util.logging.Filter を実装するクラスを作成します。コード リスト 4-3 を参照してください。
そのクラスには、Filter.isLoggable メソッドと、受信メッセージを評価するロジックが必要です。ロジックが true と評価した場合、isLoggable メソッドは Logger オブジェクトがそのメッセージをパブリッシュできるようにします。
Logger オブジェクトが動作している JVM のクラスパスにフィルタ オブジェクトを配置します。Logger オブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。Handler オブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。
コード リスト 4-3 は、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;
}
}
}
Administration Console またはコマンドラインを使用すると、LogMBean インタフェースで Handler オブジェクトのフィルタをコンフィグレーションできます。
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 の詳細については、『WebLogic Server MBean リファレンス』の「LogMBean」を参照してください。
各管理対象サーバがドメイン ログにパブリッシュするメッセージをフィルタ処理する場合は、Administration Console (「ログ フィルタの作成」を参照) または WLST (コード リスト 4-4 を参照) を使用して、ドメイン ログのログ フィルタを作成できます。
サーバ インスタンスのログ ファイルを管理する Logger オブジェクトで設定した Java ロギングの重大度またはフィルタは、ドメイン ログ フィルタを無効にします。たとえば、サーバの Logger オブジェクトの重大度が WARNING に設定されている場合、ドメイン ログ フィルタは WARNING レベル以上のメッセージのみを受信します。
1 つまたは複数のサーバがドメイン ログに送信するメッセージを変更するドメイン ログ フィルタを定義できます。デフォルトでは、重大度が NOTICE 以上のすべてのメッセージが送られます。
| 注意 : | 重大度が DEBUG のメッセージは、フィルタを使用してもドメイン ログには送信されません。 |
Administration Console を使用した WebLogic Server インスタンスのドメイン ログ フィルタのコンフィグレーションについては、Administration Console オンライン ヘルプの「ログ メッセージのフィルタ処理」を参照してください。
Administration Console と WLST を使用すると、標準 MBean コマンドで Appender オブジェクトに対する重大度を設定できます。Logger オブジェクトの重大度を設定するには、この節で説明するように Logger API を使用するか、「ロガーの重大度の指定」で説明するように Administration Console、WLST、またはコマンドラインを使用して設定することができます。
API を使用して Appender オブジェクトの重大度を設定するには、次のように動作するクラスを作成します。
Log4jLoggingHelper メソッド (コード リスト 4-5 を参照) の 1 つを呼び出します。logger.getAllAppenders() メソッドを呼び出します。
Enumeration e = logger.getAllAppenders();
このメソッドは、Logger オブジェクトに登録されているすべてのアペンダを返します。
app.setThreshold(WLLog4jLevel level) メソッドを呼び出します。
Log4j Appender オブジェクトのレベルを設定するには、weblogic.logging.log4j.WLLog4jLevel クラスで定義されている値を渡す必要があります。WebLogic Server は、org.apache.log4j.Level を対応する WLLevel にマップします。有効な値のリストについては、WLLevel の Javadoc を参照してください。
フィルタを設定するには、org.apache.log4j.Filter を拡張するクラスを実装し、フィルタをアペンダに追加して、app.addFilter(Filter newFilter) メソッドを呼び出します。
コード リスト 4-5 は、以下のことを行うクラスのサンプルです。
WARNING 以上のメッセージをサーバ ログにパブリッシュする。INFO 以上のメッセージを標準出力にパブリッシュする。INFO メッセージを拒否する。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;
}
}
}
|