4 WebLogic Serverログへのメッセージの書込み
I18Nメッセージ・カタログ・フレームワークの使い方: 主なステップ
メッセージ・カタログの作成
メッセージ・カタログは、一連のテキスト・メッセージを含んだXMLファイルです。通常、アプリケーションはデフォルト言語のメッセージ・セットを含むメッセージ・カタログ1つを使用し、他の言語のメッセージを含む追加カタログを任意で使用します。
適切にフォーマットされたメッセージ・カタログを作成および編集するには、WebLogic Serverと一緒にインストールされるグラフィカル・ユーザー・インタフェース(GUI)、WebLogicメッセージ・エディタ・ユーティリティを使用します。ローカルの言語で対応するメッセージを作成するには、これもWebLogic ServerでインストールされるGUIであるメッセージ・ローカライザを使用します。
メッセージ・エディタにアクセスするには、WebLogic Serverホストから次の手順を実行します。
-
WL_HOME
\server\bin\setWLSEnv.cmd
(UNIXの場合setWLSEnv.sh
)を入力してクラスパスを設定します。WL_HOME
はWebLogic Serverのインストール・ディレクトリです。 -
次のコマンドを入力します。
java weblogic.MsgEditor
-
新しいカタログを作成するには、「ファイル」>「新しいカタログ」を選択します。
「WebLogic Serverメッセージ・エディタの使い方」を参照してください。
-
メッセージ・エディタにメッセージを追加した後は、「ファイル」>「カタログを保存」を選択します。
-
次に、「ファイル」>「終了」を選択します。
メッセージ・ローカライザにアクセスするには、WebLogic Serverホストから次の手順を実行します。
メッセージ・カタログのコンパイル
メッセージ・カタログを作成した後は、i18ngen
およびl10ngen
コマンド行ユーティリティを使用してプロパティ・ファイルを生成し、Javaクラス・ファイルを生成およびコンパイルします。これらのユーティリティはメッセージ・カタログのXMLファイルを入力とし、コンパイルされたJavaクラスを作成します。Javaクラスには、XMLファイルのメッセージに対応するメソッドが含まれます。「WebLogic Server国際化ユーティリティの使い方」を参照してください。
メッセージ・カタログをコンパイルするには、次を行います:
-
コマンド・プロンプトから、
WL_HOME
\server\bin\setWLSEnv.cmd
(UNIXの場合setWLSEnv.sh
)を使用してクラスパスを設定します。WL_HOME
は、WebLogic Serverをインストールしたディレクトリです。 -
次のコマンドを入力します。
java weblogic.i18ngen -build -d targetdirectory source-files
前のコマンドで、
-
targetdirectory
は、i18ngen
ユーティリティが生成およびコンパイルしたファイルを配置するルート・ディレクトリを表します。Javaファイルは、メッセージ・カタログのi18n_package
値およびl10n_package
値に基づいてサブディレクトリに配置されます。カタログのプロパティ・ファイル
i18n_user.properties
は、targetdirectory
に配置されます。デフォルトのターゲット・ディレクトリは現在のディレクトリです。 -
source-files
は、コンパイルするメッセージ・カタログ・ファイルを表します。1つまたは複数のディレクトリ名を指定すると、i18ngen
が指定されたディレクトリ内のすべてのXMLファイルを処理します。ファイル名を指定する場合は、すべてのファイルの名前にXMLの接尾辞が付いている必要があります。すべてのXMLファイルは、msgcat.dtd
の構文に準拠していなければなりません。
i18ngen
でJavaファイルが生成される場合は、Logger
が各メッセージ・カタログ・ファイルの名前に付けられます。 -
-
「メッセージ・カタログの作成」で特定ロケールのカタログを作成した場合は、次の手順に従ってプロパティ・ファイルを生成します。
-
現在のコマンド・プロンプトで、上記ステップ2で指定した
targetdirectory
をCLASSPATH環境変数に追加します。特定ロケールのプロパティ・ファイルを生成するには、i18ngen
ユーティリティで生成されたすべてのクラスがクラスパスになければなりません。 -
次のコマンドを入力します。
java weblogic.l10ngen -d targetdirectory source-files
前のコマンドで、
-
targetdirectory
は、l10ngen
ユーティリティが生成したプロパティ・ファイルを配置するルート・ディレクトリを表します。通常は、ステップ2で指定した
targetdirectoryと同じです。プロパティ・ファイルは、メッセージ・カタログのl10n_package
値に基づいてサブ・ディレクトリに配置されます。 -
source-files
は、プロパティ・ファイルを生成するメッセージ・カタログを表します。メッセージ・エディタで作成される最上位のカタログを指定する必要があります。メッセージ・ローカライザで作成される特定ロケールのカタログは指定しません。通常は、ステップ2で指定したものと同じ
source-filesまたはソース・ディレクトリです。
-
-
-
ほとんどの場合は、メッセージのクラス・ファイルとプロパティ・ファイルはアプリケーションと同じパッケージ階層に配置することをお薦めします。
メッセージのクラスとプロパティをアプリケーションのパッケージ階層に含めない場合は、クラスが必ずアプリケーションのクラスパスに存在するようにする必要があります。
i18ngen
コマンドの詳細は、WebLogic Server国際化ユーティリティの使い方を参照してください。
例: メッセージ・カタログのコンパイル
この例では、メッセージ・エディタで、タイプがloggable
のメッセージが1つ含まれるメッセージ・カタログが作成されています。メッセージ・エディタは、そのメッセージ・カタログをc:\MyMsgCat\MyMessages.xml
として保存します。
例4-1は、メッセージ・カタログの内容を示しています。
例4-1 サンプル・メッセージ・カタログ
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE message_catalog PUBLIC "weblogic-message-catalog-dtd" "http://www.bea.com/servers/wls90/dtd/msgcat.dtd"> <message_catalog i18n_package="com.xyz.msgcat" l10n_package="com.xyz.msgcat.l10n" subsystem="MyClient" version="1.0" baseid="700000" endid="800000" loggables="true" prefix="XYZ-" > <!-- Welcome message to verify that the class has been invoked--> <logmessage messageid="700000" datelastchanged="1039193709347" datehash="-1776477005" severity="info" method="startup()" > <messagebody> The class has been invoked. </messagebody> <messagedetail> Verifies that the class has been invoked and is generating log messages </messagedetail> <cause> Someone has invoked the class in a remote JVM. </cause> <action> </action> </logmessage> </message_catalog>
さらに、メッセージ・ローカライザで、MyMessages.xml
のメッセージのスペイン語バージョンが作成されます。例4-2に示すように、メッセージ・ローカライザは、そのスペイン語のカタログをc:\MyMsgCat\es\ES\MyMessages.xml
として保存します。
例4-2 スペイン語の特定ロケール・カタログ
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE locale_message_catalog PUBLIC "weblogic-locale-message-catalog-dtd" "http://www.bea.com/servers/wls90/dtd/l10n_msgcat.dtd"> <locale_message_catalog version="1.0" > <!-- Mensaje agradable para verificar que se haya invocado la clase. --> <logmessage messageid="700000" datelastchanged="1039546411623" > <messagebody> La clase se haya invocado. </messagebody> <messagedetail> Verifica que se haya invocado la clase y está generando mensajes del registro. </messagedetail> <cause>Alguien ha invocado la clase en un JVM alejado.</cause> <action> </action> </logmessage> </locale_message_catalog>
メッセージ・カタログのコンパイル
メッセージ・エディタで作成されたメッセージ・カタログをコンパイルするには、次のコマンドを入力します。
java weblogic.i18ngen -build -d c:\MessageOutput c:\MyMsgCat\MyMessages.xml
i18ngen
ユーティリティでは、以下のファイルが作成されます。
-
c:\MessageOutput\i18n_user.properties
-
c:\MessageOutput\com\xyz\
msgcat\MyMessagesLogger.java -
c:\MessageOutput\com\xyz\msgcat\MyMessagesLogger.class
-
c:\MessageOutput\com\xyz\msgcat\l10n\MyMessagesLogLocalizer.properties
-
c:\MessageOutput\com\xyz\msgcat\l10n\MyMessagesLogLocalizerDetails.properties
プロパティ・ファイルの作成
スペイン語カタログのプロパティ・ファイルを作成するには、次を実行します。
-
次のように入力して、
i18n
のクラスをコマンド・プロンプトのクラスパスに追加します。 -
set CLASSPATH=%CLASSPATH%;c:\MessageOutput
-
次のコマンドを入力します。
java weblogic.l10ngen -d c:\MessageOutput c:\MyMsgCat\MyMessages.xml
l10ngen
ユーティリティで、以下のファイルが作成されます。
-
c:\MessageOutput\com\xyz\msgcat\l10n\MyMessagesLogLocalizer_es_ES.properties
-
c:\MessageOutput\com\xyz\msgcat\l10n\MyMessagesLogLocalizerDetails_es_ES.properties
コンパイルされたメッセージ・カタログからのメッセージの使用
i18ngen
およびl10ngen
によって生成されたクラスとプロパティ・ファイルは、WebLogic Serverログにメッセージを送信するためのインタフェースを提供します。これらのクラスの中では、各ログ・メッセージはアプリケーションが呼び出す1つのメソッドによって表されます。
コンパイル済みメッセージ・カタログのメッセージを使用するには:
次の例は、このstartup
メソッドを呼び出す単純なクラスを示しています。
import com.xyz.msgcat.MyMessagesLogger; public class MyClass { public static void main (String[] args) { MyMessagesLogger.startup(); } }
JVMのシステム・プロパティで現在の場所がスペインであることが指定されている場合、メッセージはスペイン語で出力されます。
NonCatalogLogger APIの使用
weblogic.logging.NonCatalogLogger
APIを使用してWebLogic Serverログにメッセージを送信できます。カタログからメッセージを呼び出すかわりにNonCatalogLogger
を使用することで、メッセージ・テキストをアプリケーション・コードに直接配置します。アプリケーションを国際化する必要がある場合には、メッセージ・ロギングの唯一の手段としてこの機能を使用することはお薦めしません。
また、NonCatalogLogger
は(WebLogic Server JVM内で実行されているのではなく)独自のJVMで実行されているクライアント・コードによっても使用されます。詳細については、「クライアント・アプリケーションからのメッセージの書込み」を参照してください。
WebLogic Server JVMの内部で実行されるアプリケーションでNonCatalogLogger
を使用するには、以下を行うためのコードをアプリケーションに追加します。
Throwable
引数を取るすべてのメソッドは、サーバー・ログにスタック・トレースを出力する可能性があります。NonCatalogLogger
APIについては、「weblogic.logging.NonCatalogLogger」Javadocを参照してください。
次の例は、NonCatalogLogger
APIを使用して様々な重大度のメッセージをWebLogic Serverログに書き込むサーブレットを示しています。
import java.io.PrintWriter; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.naming.Context; import weblogic.jndi.Environment; import weblogic.logging.NonCatalogLogger; public class MyServlet extends HttpServlet { public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); NonCatalogLogger myLogger = null; try { out.println("Testing NonCatalogLogger. See WLS Server log for output message."); // Constructing a NonCatalogLogger instance. All messages from this // instance will include a <MyApplication> string. myLogger = new NonCatalogLogger("MyApplication"); // Outputting an INFO message to indicate that your application has started. mylogger.info("Application started."); // For the sake of providing an example exception message, the next // lines of code purposefully set an initial context. If you run this // servlet on a server that uses the default port number (7001), the // servlet will throw an exception. Environment env = new Environment(); env.setProviderUrl("t3://localhost:8000"); Context ctx = env.getInitialContext(); } catch (Exception e){ out.println("Can't set initial context: " + e.getMessage()); // Prints a WARNING message that contains the stack trace. mylogger.warning("Can't establish connections. ", e); } } }
前述の例で示したサーブレットを8000
以外のリスニング・ポートを指定するサーバー上で実行すると、次のメッセージがWebLogic Serverログ・ファイルに出力されます。メッセージは山カッコ(< >
)で囲まれた一連の文字列またはフィールドで構成されています。
####<May 27, 2004 8:45:42 AM EDT> <Error> <MySubsystem> <myhost> <adminServer> <ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <system> <> <> <1085661942864> <BEA-000000> <Test NonCatalogLogger message java.lang.Exception: Test NonCatalogLogger message ... >
ServletContextの使用
log(
java.lang.String msg
)
およびlog(
java.lang.String msg
,
java.lang.Throwable
t
)
APIをjavax.servlet.ServletContext
で提供します。これらのAPIの使用の詳細は、javax.servlet.ServletContext
インタフェースのJavadoc (http://docs.oracle.com/cd/E17802_01/products/products/servlet/2.3/javadoc/javax/servlet/ServletContext.html
)を参照してください。
次の例は、ServletContextを使用したJSPロギングを示しています。
<%@ page language="java" %> <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>INDEX</title> </head> <body bgcolor="#FFFFFF"> <% config.getServletContext().log("Invoked ServletContext.log() From a JSP"); out.write("Request param arg0 = " + request.getParameter("arg0")); %> </body> </html>
サーブレットとリソース・アダプタのロギングの構成
WebLogic固有のデプロイメント記述子を使用して、Webアプリケーションとリソース・アダプタのロギングの動作を構成できます。ロギング構成のデプロイメント記述子要素では、ログ・ファイルの名前、場所、ローテーション・ポリシーなど、LogMBean
インタフェースでサーバーのロギングを構成する場合と同じような属性を定義します。
構成時に、アプリケーション・イベントはWebアプリケーション固有のログ・ファイルに送られます。デプロイメント記述子に、ロギング構成情報が含まれていない場合、デフォルトの動作は、これらのイベントをサーバー・ログ・ファイルに書き込むことです。
同様に、WebLogicロギング・サービスはJava EEリソース・アダプタにも対応しており、ManagedConnectionFactory
スコープのロギングを行えます。weblogic-ra.xml
デプロイメント記述子を使用して、リソース・アダプタ・ログのログ・ファイル名、場所およびローテーション・ポリシーを構成します。Oracle WebLogic Serverリソース・アダプタの開発のweblogic-ra.xmlスキーマを参照してください。
次の例は、Webアプリケーションおよびリソース・アダプタのロギング動作を構成するためのデプロイメント記述子のスニペットを示しています。logging
の要素は、LogMBean
インタフェースの属性定義に対応します。この例に、すべてのLogMBean
属性がリストされているわけではありません。ロギング構成は、Webアプリケーションの場合はWEB-INF/weblogic.xml
ファイル内で、リソース・アダプタの場合はMETA-INF/weblogic-ra.xml
ファイル内で定義されています。
<!DOCTYPE weblogic-web-app PUBLIC "//DTD Web Application 9.0//EN" "http://www.bea.com/servers/wls90/dtd/weblogic90-web-jar.dtd"> <weblogic-web-app> <logging> <log-filename>d:\tmp\mywebapp.log</log-filename> <rotation-type>bySize</rotation-type> <number-of-files-limited>true</number-of-files-limited> <file-count>3</file-count> <file-size-limit>50</file-size-limit> <rotate-log-on-startup>true</rotate-log-on-startup> <log-file-rotation-dir>config/MedRecDomain/WebApp</log-file-rotation-dir> </logging> </weblogic-web-app> <weblogic-connector xmlns="http://www.bea.com/ns/weblogic/90"> <jndi-name>eis/900BlackBoxNoTxConnector</jndi-name> <outbound-resource-adapter> <connection-definition-group> <connection-factory-interface>javax.sql.DataSource</connection-factory-interface> <connection-instance> <jndi-name>eis/900BlackBoxNoTxConnectorJNDINAME</jndi-name> <connection-properties> <pool-params> <initial-capacity>5</initial-capacity> <max-capacity>10</max-capacity> <capacity-increment>1</capacity-increment> <shrinking-enabled>true</shrinking-enabled> <shrink-frequency-seconds>60</shrink-frequency-seconds> <highest-num-waiters>1</highest-num-waiters> <highest-num-unavailable>3</highest-num-unavailable> <connection-reserve-timeout-seconds>11</connection-reserve-timeout-seconds> </pool-params> <logging> <log-filename>900BlackBoxNoTxOne.log</log-filename> <logging-enabled>true</logging-enabled> <rotation-type>bySize</rotation-type> <number-of-files-limited>true</number-of-files-limited> <file-count>3</file-count> <file-size-limit>100</file-size-limit> <rotate-log-on-startup>true</rotate-log-on-startup> <log-file-rotation-dir>c:/mylogs</log-file-rotation-dir> <rotation-time>3600</rotation-time> <file-time-span>7200</file-time-span> </logging> <properties> <property> <name>ConnectionURL</name> <value>jdbc:oracle:thin:@bcpdb:1531:bay920</value> </property> <property> <name>unique_ra_id</name> <value>blackbox-notx.oracle.810</value> </property> </properties> </connection-properties> </connection-instance> </connection-definition-group> </outbound-resource-adapter> </weblogic-connector>
クライアント・アプリケーションからのメッセージの書込み
アプリケーションがWebLogic Serverインスタンスから離れたJVMで実行される場合、メッセージ・カタログおよびNonCatalogLogger
は使用できますが、メッセージはWebLogic Serverログには書き込まれません。かわりに、アプリケーションのメッセージはクライアントJVMの標準出力に書き込まれます。
WebLogicロギング・サービスで、クライアントJVMマシンが保持するログ・ファイルにメッセージを送る場合は、クライアントJVMを起動するコマンドで次の引数を指定します。
-Dweblogic.log.FileName=logfilename
前の引数のlogfilename
は、リモート・ログ・ファイルに使用する名前を表しています。
メッセージ・カタログのサブセットとNonCatalogLogger
メッセージをリモートJVMログ・ファイルと標準出力に送る場合は、さらに次の起動引数を指定します。
-Dweblogic.log.StdoutSeverityLevel=String
前の引数のStdoutSeverityLevel
の有効な値は、Debug
、Info
、Warning
、Error
、Notice
、Critical
、Alert
、Emergency
およびOff
です。
サポートされている重大度レベルの詳細は、Oracle WebLogic Server Java APIリファレンスのweblogic.logging.Severities
を参照してください。
デバッグ・メッセージの書込み
アプリケーションの開発中、そのアプリケーションの低レベル・アクティビティを示すメッセージを作成して使用できます。DEBUG
重大度を使用すると、これらの低レベル・メッセージを分類できます。
アプリケーションが生成するすべてのDEBUG
メッセージが、構成された最低限のしきい値の重大度に応じて、すべてのWebLogic Serverロギング宛先に送信されます。
DEBUG
重大度を使用する場合、アプリケーション用の「デバッグ・モード」を作成することをお薦めします。たとえば、アプリケーションがブール値を格納するオブジェクトを作成できるとします。デバッグ・モードを有効または無効にするには、ブール値を切り替えます。次に、DEBUG
メッセージごとに、アプリケーションのデバッグ・モードが有効化されている場合にのみメッセージを出力するラッパーを作成します。
たとえば、次のコードでデバッグ・メッセージを生成できます。
private static boolean debug = Boolean.getBoolean("my.debug.enabled");
if (debug) {
mylogger.debug("Something debuggy happened");
}
この種のラッパーは、メッセージ・カタログ・フレームワークを使用するDEBUG
メッセージとNonCatalogLogger
APIを使用するDEBUGメッセージの両方に対して使用できます。
アプリケーションでこのメッセージを出力できるようにするには、アプリケーションのJVMを起動するときに次のJavaオプションを使用します。
-Dmy.debug.enabled=true