| Oracle® Fusion Middleware Oracle WebLogic Serverログ・ファイルの構成とログ・メッセージのフィルタ処理 11g リリース1 (10.3.6) B61637-07 |
|
![]() 前 |
![]() 次 |
WebLogicロギング・サービスでは、複数のフィルタ処理オプションを利用できます。このため、どのメッセージがWebLogic Serverログ・ファイルと標準出力に書き込まれ、どのメッセージがクライアントJVMが管理するログ・ファイルと標準出力に書き込まれるのかを柔軟に指定できます。それらのフィルタ処理機能のほとんどは、java.util.loggingパッケージのJavaロギングAPIの実装です。
以下の節では、WebLogicロギング・サービスで生成されるメッセージをフィルタ処理する方法について説明します。
関連情報については、以下を参照してください。
WebLogic Serverインスタンスに対するログ・フィルタの設定方法については、Oracle WebLogic Server管理コンソール・ヘルプのログ・フィルタの作成に関する項。
メッセージ・ハンドラの作成方法およびサブスクライブ方法については、第5章「メッセージのサブスクライブ」
WebLogic Serverメッセージ・カタログおよびNonCatalogLoggerでメッセージが生成されるとき、それらのメッセージはjava.util.logging.Loggerオブジェクトに配信されます。Loggerオブジェクトは、Loggerをサブスクライブしているメッセージ・ハンドラにメッセージをパブリッシュします。
WebLogic Serverでは、以下の3つの異なるコンテキストでLoggerオブジェクトおよびHandlerオブジェクトがインスタンス化されます(図4-1を参照)。
WebLogicロギング・サービスを使用するクライアントJVMで。このクライアントLoggerオブジェクトは、クライアントJVMで動作するクライアント・アプリケーションから送信されるメッセージをパブリッシュします。
以下のハンドラが、クライアントJVMのLoggerオブジェクトをサブスクライブします。
ConsoleHandler。クライアントJVMからのメッセージをクライアントの標準出力に出力します。
クライアントJVMで-Dweblogic.log.StdoutSeverityLevel Java起動オプションを使用すると、WebLogicロギング・サービスにより、ハンドラから標準出力に書き込まれるメッセージを制限するフィルタがこのハンドラ用に作成されます。『Oracle WebLogic Serverアプリケーション・ロギングのためのロギング・サービスの使用』のクライアント・アプリケーションからのメッセージの書込みに関する項を参照してください。
FileStreamHandler。クライアントJVMからのメッセージをクライアントのログ・ファイルに書き込みます。
WebLogic Serverの各インスタンスで。このサーバーLoggerオブジェクトは、サーバー・インスタンスで動作するサブシステムおよびアプリケーションから送信されるメッセージをパブリッシュします。
以下のハンドラが、サーバーLoggerオブジェクトをサブスクライブします。
ConsoleHandler。メッセージをサーバーの標準出力に出力できるようにします。
FileStreamHandler。サーバー・ログ・ファイルにメッセージを書き込みます。
内部ハンドラ。ドメイン・ログおよびJMXクライアントにメッセージをブロードキャストし、管理サーバーにメッセージをパブリッシュします。
管理サーバーはサーバーLoggerオブジェクトに加えてドメインLoggerオブジェクトも管理します。ドメインLoggerオブジェクトは、各管理対象サーバーのLoggerオブジェクトからメッセージを受信します。
以下のハンドラが、ドメインLoggerオブジェクトをサブスクライブします。
FileStreamHandler。ドメイン・ログ・ファイルにメッセージを書き込みます。
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以上のすべてのメッセージを管理サーバーのドメイン全体のメッセージ・ログにパブリッシュします。
管理コンソールとWLSTを使用すると、標準MBeanコマンドでHandlerオブジェクトに対する重大度を設定できます。Loggerオブジェクトに対して重大度を設定するには、Logger APIを使用できます。ロガーの重大度は、管理者コンソール、WLSTまたはコマンド行からも設定することができます。「ロガーの重大度の指定」を参照してください。WLSクライアント(EJBやWeb Serviceクライアント等)に対してロガーおよびハンドラの重大度を構成するには、Java Logging APIを使用する必要があります。
Loggerオブジェクトの重大度を設定するには、次のように動作するクラスを作成します。
以下のLoggingHelperメソッドの1つを呼び出します。
getClientLogger (現在のコンテキストがクライアントJVMである場合)。
getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトを取得する必要がある場合)。
getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・ログを管理するLoggerオブジェクトを取得する必要がある場合)。
LoggerHelperメソッドは、Loggerオブジェクトを返します。Loggerクラスについては、APIのドキュメント(http://docs.oracle.com/javase/6/docs/api/java/util/logging/Logger.html)を参照してください。
Logger.setLevel(Level level)メソッドを呼び出します。
WebLogic Server Loggerオブジェクトのレベルを設定するには、weblogic.logging.WLLevelクラスで定義されている値を渡す必要があります。WebLogic Serverは、java.util.logging.Levelを、対応するWLLevelにマップします。有効な値については、Oracle WebLogic Server APIリファレンスのweblogic.logging.WLLevelクラスに関する説明を参照してください。
例:
setLevel(WLLevel.ALERT)
APIを使用してHandlerオブジェクトの重大度を設定するには、次のように動作するクラスを作成します(例4-1を参照)。
以下のLoggingHelperメソッドの1つを呼び出します。
getClientLogger (現在のコンテキストがクライアントJVMである場合)。
getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトを取得する必要がある場合)。
getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・ログを管理するLoggerオブジェクトを取得する必要がある場合)。
LoggerHelperメソッドは、Loggerオブジェクトを返します。Loggerクラスについては、APIのドキュメント(http://docs.oracle.com/javase/6/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にマップします。有効な値については、Oracle WebLogic Server APIリファレンスの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);
}
}
}
}
管理コンソールまたはコマンド・ラインを使用すると、LogMBeanインタフェースでHandlerオブジェクトの重大度を構成できます。
重大度の設定方法については、Oracle WebLogic Server管理コンソール・ヘルプのログ・メッセージのフィルタ処理に関する項を参照してください。
例4-2のWLSTコマンドは、標準出力ハンドラの重大度をINFOに設定します。
例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 WebLogic Scripting Tool』のWebLogic Scripting Toolの使用に関する項を参照してください。setStdoutSeverityの詳細は、Oracle WebLogic Server MBeanリファレンスのLogMBeanを参照してください。
Loggerオブジェクトでフィルタを設定した場合、そのフィルタはオブジェクトがどのメッセージをパブリッシュするのかを指定します。したがって、フィルタはLoggerオブジェクトに登録されているすべてのハンドラにも影響します。ハンドラでフィルタを設定した場合、そのフィルタはその特定のハンドラの動作にのみ影響します。
管理コンソールとWLSTを使用すると、標準MBeanコマンドでHandlerオブジェクトに対するフィルタを設定できます。Loggerオブジェクトにフィルタを設定するには、Logger APIを使用する必要があります。クライアント側ロギングの場合、フィルタはJavaロギングAPIでのみ設定できます。
フィルタを設定するには:
java.util.logging.Filterを実装するクラスを作成します。例4-3を参照してください。
そのクラスには、Filter.isLoggableメソッドと、受信メッセージを評価するロジックが必要です。ロジックがtrueと評価した場合、isLoggableメソッドはLoggerオブジェクトがそのメッセージをパブリッシュできるようにします。
Loggerオブジェクトが動作しているJVMのクラスパスにフィルタ・オブジェクトを配置します。
Loggerオブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。
以下のLoggingHelperメソッドの1つを呼び出します。
getClientLogger (現在のコンテキストがクライアントJVMである場合)。
getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトをフィルタ処理する必要がある場合)。
getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・サーバー・ログを管理するLoggerオブジェクトをフィルタ処理する必要がある場合)。
Logger.setFilter(Filter newFilter)メソッドを呼び出します。
APIを使用してHandlerオブジェクトのフィルタを設定するには、次のように動作するクラスを作成します。
以下のLoggingHelperメソッドの1つを呼び出します。
getClientLogger (現在のコンテキストがクライアントJVMである場合)。
getServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトをフィルタ処理する必要がある場合)。
getDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・サーバー・ログを管理するLoggerオブジェクトをフィルタ処理する必要がある場合)。
レベルを設定する必要のあるHandlerオブジェクトが見つかるまでハンドラの配列を検索します。
Handler.getClass().getName()を使用すると、現在の配列索引が示しているハンドラのタイプがわかります。
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;
}
}
}
管理コンソールまたはコマンド・ラインを使用すると、LogMBeanインタフェースでHandlerオブジェクトのフィルタを構成できます。
WebLogic Serverインスタンスに対するログ・フィルタの設定方法については、Oracle WebLogic Server管理コンソール・ヘルプのログ・フィルタの作成に関する項を参照してください。
例4-4のWLSTコマンドは、ドメイン・ログ・ブロードキャスタに対するフィルタを作成して設定します。
例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 WebLogic Scripting Tool』のWebLogic Scripting Toolの使用に関する項を参照してください。setDomainLogBroadcastFilterの詳細は、Oracle WebLogic Server MBeanリファレンスのLogMBeanを参照してください。
各管理対象サーバーからドメイン・ログにパブリッシュされるメッセージをフィルタ処理する場合は、管理コンソール (「ログ・フィルタの作成」を参照)またはWLST (例4-4を参照)を使用して、ドメイン・ログのログ・フィルタを作成できます。
ただし、サーバー・インスタンスのログ・ファイルを管理するLoggerオブジェクトでJavaロギングの重大度またはフィルタを設定すると、ドメイン・ログ・フィルタは無効となります。たとえば、サーバーのLoggerオブジェクトの重大度がWARNINGに設定されている場合、ドメイン・ログ・フィルタはWARNINGレベル以上のメッセージのみを受信します。
1つまたは複数のサーバーがドメイン・ログに送信するメッセージを変更するドメイン・ログ・フィルタを定義できます。デフォルトでは、重大度がNOTICE以上のすべてのメッセージが送られます。
|
注意: 重大度がDEBUGのメッセージは、フィルタを使用してもドメイン・ログには送信されません。 |
管理コンソールを使用したWebLogic Serverインスタンスのドメイン・ログ・フィルタの構成については、Oracle WebLogic Server管理コンソール・ヘルプのログ・メッセージのフィルタ処理に関する項を参照してください。
管理コンソールとWLSTを使用すると、標準MBeanコマンドでAppenderオブジェクトに対する重大度を設定できます。Loggerオブジェクトの重大度を設定するには、この項で説明するようにLoggerAPIを使用するか、「ロガーの重大度の指定」で説明するように管理コンソール、WLST、またはコマンドラインを使用して設定できます。
APIを使用してAppenderオブジェクトの重大度を設定するには、次のように動作するクラスを作成します。
以下のLog4jLoggingHelperメソッド(例4-5を参照)の1つを呼び出します。
getLog4jServerLogger (現在のコンテキストがサーバーJVMであり、かつローカル・サーバー・ログを管理するためにサーバーで使用されるLoggerオブジェクトを取得する必要がある場合)。
getLog4jDomainLogger (現在のコンテキストが管理サーバーであり、かつドメイン・ログを管理するLoggerオブジェクトを取得する必要がある場合)。
logger.getAllAppenders()メソッドを呼び出します。
Enumeration e = logger.getAllAppenders();
このメソッドは、Loggerオブジェクトに登録されているすべてのアペンダを返します。
アペンダのリストを検索して、各アペンダ名を取得します。
app.setThreshold(WLLog4jLevel level)メソッドを呼び出します。
Log4j Appenderオブジェクトのレベルを設定するには、weblogic.logging.log4j.WLLog4jLevelクラスで定義されている値を渡す必要があります。WebLogic Serverは、org.apache.log4j.Levelを、対応するWLLevelにマップします。有効な値については、Oracle WebLogic Server APIリファレンスのweblogic.logging.WLLevelクラスに関する説明を参照してください。
フィルタを設定するには、org.apache.log4j.Filterを拡張するクラスを実装し、フィルタをアペンダに追加して、app.addFilter(Filter newFilter)メソッドを呼び出します。
例4-5は、以下のことを行うクラスのサンプルです。
重大度がWARNING以上のメッセージをサーバー・ログにパブリッシュします。
重大度がINFO以上のメッセージを標準出力にパブリッシュします。
HTTPサブシステムからのINFOメッセージを拒否します。
例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;
/**
* This class sets a level and filter on a Log4j Appender.
*/
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)) {
// Set the threshold level of messages going to the log file to WARNING
// This will result in NOTICE, INFO, DEBUG, and TRACE messages being
// suppressed from going to the server log file
app.setThreshold(WLLog4jLevel.WARN);
System.out.println("Set WARNING level on the log file appender");
} else if (name.equals(AppenderNames.STDOUT_APPENDER)) {
// Set level to INFO on the stdout filter
app.setThreshold(WLLog4jLevel.INFO);
// First clear the existing filters on the appender
app.clearFilters();
// Add a filter to block INFO messages from the HTTP subsystem
app.addFilter(new MyFilter());
}
}
// Now test the filter
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
}
}
/**
* Deny messages from the HTTP subsystem of level INFO
*/
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;
}
}
}