log 4 j簡明マニュアル下
6684 ワード
servletの初期化
log 4 jの初期化には、特別なservletを使用することもできる.次に例を示します.
Web.xmlファイルで、次のservletをネットワークアプリケーションに定義します.
initialization servletを記述することはlog 4 jを初期化するために最も柔軟な方法である.制限されず、このservletの
Nested Diagnostic Contexts
実際のシステムの多くは、複数のクライアントの問題を同時に処理する必要があります.このようなシステムの典型的なマルチスレッド実装では、通常、異なるスレッドが異なる顧客ニーズをそれぞれ処理する.Loggingは特に複雑なプログラム追跡とエラーの排出に適している.1つの一般的な処理方法は、各顧客に新しい分離されたloggerを生成することによって、異なる顧客のログ出力情報を区別することである.しかし、これはloggersの増殖を促進し、loggingの管理負担を増大させた.
より簡潔なテクノロジーは、同じ顧客からの各ログリクエストをユニークにマークすることです.Neil Harrisonは彼の本の中で「Patterns for Logging Diagnostic Messages」in Pattern Languages of Program Design 3,edited by R.Martin,D.Riehle,and F.Buschmann(Addison-Wesley,1997)がこの方法を説明した. Pattern Languages of Program Design 3
各ログ要求をユニークにマークするには、ユーザがコンテキスト情報をNDCに送る.NDCはNested Diagnostic Contextの略である.NDC類は以下のように展示されている.
NDCクラスは、スレッドコンテキストを保存するstackとして、単一スレッド(per thread)で管理される.
この点を説明するために,servletが複数のクライアントに情報内容を送信する例を挙げる.このサーブレットプログラムは、クライアントからの要求を受け、他のコードを実行する前に、まずNDCを作成します.このコンテキスト情報は、クライアントのホスト名、および他のリクエストに固有の情報であり、通常はcookiesに含まれる情報である.したがって、このサーブレットプログラムは、複数のクライアントに同時にサービスを提供し、同じコードで起動されたこれらのlogs、例えば同じloggerに属しても、異なるクライアント要求が異なるNDC stackを有するため、区別することができる.これは、顧客要求中にインスタンス化されたloggerを実行するすべてのコードに渡す複雑さとは対照的である.
しかし、仮想ネットワークサーバなどの複雑なアプリケーションでは、仮想ホストのコンテキスト言語環境や、リクエストをパブリッシュするソフトウェアコンポーネントに基づいて異なるlogを作成する必要があります.最近のlog 4 jリリースでは、多層ツリーがサポートされています.この機能の強化により、各仮想ホストが独自のlogger階層バージョンを持つことができます.
パフォーマンス
よく提起される議論はloggingの演算オーバーヘッドである.このような関心は、中程度のアプリケーションでも少なくとも数千個のlog出力が発生するため、理にかなっている.多くの作業はlogging性能の測定と改善に費やされている.Log 4 jはそれが迅速で柔軟であることを宣言した:速度が第一で、柔軟性が第二である.
ユーザーは、次のようなパフォーマンスに関する問題を明確に理解する必要があります. Logging performance when logging is turned off.loggingが完全に閉じられた場合、またはset of levelsだけが閉じられた場合、ログ要求のオーバーヘッドはメソッドの呼び出しと整数の比較である.233 MHz Pentium IIマシンでは、このオーバーヘッドは通常5 to 50ミリ秒の範囲内である. set of levelsただし、メソッドの呼び出しには、パラメータのある構築上の「隠し」オーバーヘッドが含まれます.例えば、次のlogger
log 4 jの初期化には、特別なservletを使用することもできる.次に例を示します.
package com.foo;
import org.apache.log4j.PropertyConfigurator;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.IOException;
public class Log4jInit extends HttpServlet {
public
void init()
{
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4j-init-file");
// if the log4j-init-file is not set, then no point in trying
if(file != null) {
PropertyConfigurator.configure(prefix+file);
}
}
public
void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
Web.xmlファイルで、次のservletをネットワークアプリケーションに定義します.
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>com.foo.Log4jInit</servlet-class>
<init-param>
<param-name>log4j-init-file</param-name>
<param-value>WEB-INF/classes/log4j.lcf</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
initialization servletを記述することはlog 4 jを初期化するために最も柔軟な方法である.制限されず、このservletの
init()
メソッドに任意のコードを入れることができます.Nested Diagnostic Contexts
実際のシステムの多くは、複数のクライアントの問題を同時に処理する必要があります.このようなシステムの典型的なマルチスレッド実装では、通常、異なるスレッドが異なる顧客ニーズをそれぞれ処理する.Loggingは特に複雑なプログラム追跡とエラーの排出に適している.1つの一般的な処理方法は、各顧客に新しい分離されたloggerを生成することによって、異なる顧客のログ出力情報を区別することである.しかし、これはloggersの増殖を促進し、loggingの管理負担を増大させた.
より簡潔なテクノロジーは、同じ顧客からの各ログリクエストをユニークにマークすることです.Neil Harrisonは彼の本の中で「Patterns for Logging Diagnostic Messages」in Pattern Languages of Program Design 3,edited by R.Martin,D.Riehle,and F.Buschmann(Addison-Wesley,1997)がこの方法を説明した. Pattern Languages of Program Design 3
各ログ要求をユニークにマークするには、ユーザがコンテキスト情報をNDCに送る.NDCはNested Diagnostic Contextの略である.NDC類は以下のように展示されている.
public class NDC {
// Used when printing the diagnostic
public static
String get();
// Remove the top of the context from the NDC.
public static
String pop();
// Add diagnostic context for the current thread.
public static
void push(String message);
// Remove the diagnostic context for this thread.
public static
void remove();
}
NDCクラスは、スレッドコンテキストを保存するstackとして、単一スレッド(per thread)で管理される.
org.apache.log4j.NDC
クラスのすべての方法は静的であることに注意してください.NDC印刷機能がオンになっていると仮定し、ログ要求があるたびに、対応するlog 4 jコンポーネントは、この現在のスレッドのNDC stack全体をログ出力に含めて印刷する.このようにしてユーザの介入を必要とせず,ユーザはコードに明確に指定されたいくつかの点でpush
とpop
の方法で正しい情報をNDCに置けばよい.逆に、per-client loggerメソッドはコードに多くの変更を加える必要があります.この点を説明するために,servletが複数のクライアントに情報内容を送信する例を挙げる.このサーブレットプログラムは、クライアントからの要求を受け、他のコードを実行する前に、まずNDCを作成します.このコンテキスト情報は、クライアントのホスト名、および他のリクエストに固有の情報であり、通常はcookiesに含まれる情報である.したがって、このサーブレットプログラムは、複数のクライアントに同時にサービスを提供し、同じコードで起動されたこれらのlogs、例えば同じloggerに属しても、異なるクライアント要求が異なるNDC stackを有するため、区別することができる.これは、顧客要求中にインスタンス化されたloggerを実行するすべてのコードに渡す複雑さとは対照的である.
しかし、仮想ネットワークサーバなどの複雑なアプリケーションでは、仮想ホストのコンテキスト言語環境や、リクエストをパブリッシュするソフトウェアコンポーネントに基づいて異なるlogを作成する必要があります.最近のlog 4 jリリースでは、多層ツリーがサポートされています.この機能の強化により、各仮想ホストが独自のlogger階層バージョンを持つことができます.
パフォーマンス
よく提起される議論はloggingの演算オーバーヘッドである.このような関心は、中程度のアプリケーションでも少なくとも数千個のlog出力が発生するため、理にかなっている.多くの作業はlogging性能の測定と改善に費やされている.Log 4 jはそれが迅速で柔軟であることを宣言した:速度が第一で、柔軟性が第二である.
ユーザーは、次のようなパフォーマンスに関する問題を明確に理解する必要があります.
cat
プログラムセグメントでは、 logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
は、メッセージがログに記録されるかどうかにかかわらず、メッセージパラメータを構築するオーバーヘッドがあり、例えば、整数iと配列entry[i]
をStringに変換し、中間文字列を接続する.パラメータ構造のこのオーバーヘッドは、介入するパラメータの数に依存して高い可能性があります.このようなパラメータ構造のオーバーヘッドを回避するために、以上のコードセグメントを if(logger.isDebugEnabled() {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
に書き換え、エラー機能が使用されなければ、パラメータ構造上のオーバーヘッドは発生しない.しかし、一方で、loggerの並べ替え機能が起用されると、loggerが起用されたかどうかを評価するのに2倍のコストがかかります.1回はdebug
Enabled、1 はdebugが されたかどうかを します.しかし、これは、loggerを する がlog の の1%に ぎないため、log 4 jではログ をLoggerクラスの としている.Loggerはインタフェースではなくクラスであり,これは にプログラム び しのオーバーヘッドを するためであるが,インタフェースがもたらす を にしている. のユーザーは、 またはcompile-timeテクノロジーを してすべてのlog をコンパイルします.このようにlogging の はとても いです.しかし、resultingアプリケーションbinaryにはlog が まれていないため、このバイナリプログラムにloggingを することはできません. から れば、これは さな の のために きな を っている.
The performance of deciding whether to log or not to log when logging is turned on. に に する はloggerの である.logging が かれると、log 4 jは としてlog のレベルをrequest loggerのレベルと する がある.ただし、loggersの には が り てられていないものもありますが、 の のloggerから を することができます.したがって、 を する に、loggerはancestorsを する がある があります.Log 4 jはこの で きな をして、このような の レベルの (hierarchy walk)をできるだけ くするようにしました.たとえば、 loggersは、 のancestorsにのみリンクされます. のBasicConfigurator
では、com
.foo.Barと ばれるloggerはroot loggerに リンクされ、 しないcomまたはcom.foo
loggersを している.これにより、 の が に します. の (walking the hierarchy)のオーバーヘッドは、loggingが に じたときより3 いことにある.
Actually outputting log messagesここではlog のフォーマットとlog をターゲット に するオーバーヘッドについて します.Log 4 jはこの でもフォーマットをできるだけ く できるように を れている.appendersにも じです. 、フォーマット のオーバーヘッドは、100~300マイクロ の である があります. な はorg.apache.log4.performance.Loggingを してください.
log 4 jは くの を するが、 は 1の である. を させるために、いくつかのlog 4 jの は も き えられたことがある.それでもlog 4 jの たちは しい を えず している.SimpleLayoutで されている 、パフォーマンステストではlog 4 jログの とSystem.out.println
ログの が じくらい いことに くべきです.
Log 4 jはJavaで された にポピュラーなlogging パッケージです.その な の つはloggersに の を したことである.このようなloggerの を いると, log の を に することができる.これにより、log の が し、loggingのオーバーヘッドが される.
Log 4 j APIの の1つは、その である.log がコードに されると、ソースコードを コンパイルすることなくプロファイルによって されます.ログ の は、ユーザが したフォーマットに って くの なる に することができるように、 に または にすることができる.Log 4 jパッケージの は,コードにlog を しながら きな をもたらさない.