Oracle® Fusion Middleware Oracle WebLogic Serverログ・ファイルの構成とログ・メッセージのフィルタ処理 12c (12.1.2) E48026-03 |
|
前 |
次 |
この章では、WebLogicロギング・サービスが提供するフィルタ処理オプションを説明します。このため、どのメッセージがWebLogic Serverログ・ファイルと標準出力に書き込まれ、どのメッセージがクライアントJVMが管理するログ・ファイルと標準出力に書き込まれるのかを柔軟に指定できます。それらのフィルタ処理機能のほとんどは、 java.util.logging パッケージのJavaロギングAPIの実装です。
この章の内容は以下のとおりです。
関連情報については、以下を参照してください。
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にデプロイされたアプリケーションへのWebLogicロギング・サービスの追加のクライアント・アプリケーションからのメッセージの記述に関する項を参照してください。
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/7/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 Java 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/7/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 Java 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使用の詳細は、『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使用の詳細は、『WebLogic Scripting Toolの理解』のWebLogic Scripting Toolの使用に関する項を参照してください。setDomainLogBroadcastFilter
の詳細は、Oracle WebLogic Server MBeanリファレンスのLogMBean
に関する項を参照してください。
各管理対象サーバーからドメイン・ログにパブリッシュされるメッセージをフィルタ処理する場合は、管理コンソール (「ログ・フィルタの作成」を参照)またはWLST (例4-4を参照)を使用して、ドメイン・ログのログ・フィルタを作成できます。
ただし、サーバー・インスタンスのログ・ファイルを管理するLogger
オブジェクトでJavaロギングの重大度またはフィルタを設定すると、ドメイン・ログ・フィルタは無効となります。たとえば、サーバーのLogger
オブジェクトの重大度がWARNING
に設定されている場合、ドメイン・ログ・フィルタはWARNING
レベル以上のメッセージのみを受信します。
1つまたは複数のサーバーがドメイン・ログに送信するメッセージを変更するドメイン・ログ・フィルタを定義できます。デフォルトでは、重大度がNOTICE
以上のすべてのメッセージが送られます。
注意: 重大度が |
管理コンソールを使用したWebLogic Serverインスタンスのドメイン・ログ・フィルタの構成については、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのログ・メッセージのフィルタ処理に関する項を参照してください。
管理コンソールとWLSTを使用すると、標準MBeanコマンドでAppender
オブジェクトに対する重大度を設定できます。Logger
オブジェクトの重大度を設定するには、この項で説明するようにLogger
APIを使用するか、「ロガーの重大度の指定」で説明するように管理コンソール、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 Java 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; } } }