Oracle® Fusion Middleware Oracle WebLogic Server ログ ファイルのコンフィグレーションとログ メッセージのフィルタ処理 11g リリース 1 (10.3.1) B55548-01 |
|
![]() 戻る |
![]() 次へ |
WebLogic ロギング サービスでは、複数のフィルタ処理オプションを利用できます。このため、どのメッセージが WebLogic Server ログ ファイルと標準出力に書き込まれ、どのメッセージがクライアント JVM が管理するログ ファイルと標準出力に書き込まれるのかを柔軟に指定できます。それらのフィルタ処理機能のほとんどは、java.util.logging
パッケージの Java ロギング API の実装です。
以下の節では、WebLogic ロギング サービスで生成されるメッセージをフィルタ処理する方法について説明します。
関連情報については、以下を参照してください。
WebLogic Server インスタンスに対するログ フィルタの設定方法については、Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「ログ フィルタの作成」
メッセージ ハンドラの作成方法およびサブスクライブ方法については、「メッセージのサブスクライブ」
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 Fusion Middleware 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
以上のすべてのメッセージを管理サーバのドメイン全体のメッセージ ログにパブリッシュする。
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/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 Fusion Middleware Oracle WebLogic Server API Reference』の weblogic.logging.WLLevel
クラスに関する説明を参照してください。
次に例を示します。
setLevel(WLLevel.ALERT)
API を使用して Handler
オブジェクトの重大度を設定するには、次のように動作するクラスを作成します (コード リスト 4-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
) を参照してください。
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 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
オブジェクトの重大度をコンフィグレーションできます。
重大度の設定方法については、Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「ログ メッセージのフィルタ処理」を参照。
コード リスト 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 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 でのみ設定できます。
フィルタを設定するには、次の手順に従います。
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; } } }
Administration Console またはコマンドラインを使用すると、LogMBean
インタフェースで Handler
オブジェクトのフィルタをコンフィグレーションできます。
WebLogic Server インスタンスに対するログ フィルタの設定方法については、Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「ログ フィルタの作成」を参照。
コード リスト 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 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 オンライン ヘルプの「ログ メッセージのフィルタ処理」を参照してください。
Administration Console と WLST を使用すると、標準 MBean コマンドで Appender
オブジェクトに対する重大度を設定できます。Logger
オブジェクトの重大度を設定するには、この節で説明するように Logger
API を使用するか、「ロガーの重大度の指定」で説明するように Administration Console、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 Fusion Middleware Oracle WebLogic Server API Reference』の 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; /** * このクラスにより 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; } } }