プロジェクトの操作中に、機能的なデバッグを実行し、ユーザーの動作を追跡および記録する必要があることがよくあります。 System.outを使用することに慣れている人もいますが、これは推奨されません。使いやすいだけですが、メンテナンスは簡単ではなく、スケーラビリティはありません。 LOG4Jと比較して、LOG4Jは宛先、出力形式、ログ情報のレベルなどを制御できるため、ログ生成プロセスをより慎重に制御できます。
log4j2はlog4j1へのアップグレードであり、マルチスレッドのスループットの強化、プレースホルダーのサポート、自動構成ファイルのリロードなど、パフォーマンスと機能が大幅に改善されます。
1。はじめに
1。JARパッケージをダウンロードします
pox.xml
<Dependencies> <Dependency> <GroupId> org.apache.logging.log4j </groupid> <artifactid> log4j-api </artifactid> <version> 2.10.0 </version> </dependency> <deplency> <groupid> org.apache.logging.log4J <バージョン> 2.10.0 </version> </dependency> </dependencies>
2。構成ファイル
LOG4Jには、JSON、YAML、プロパティ、XMLの4つの構成工場の実装が含まれています。この記事では、一般的に使用されるメソッドXMLを紹介します。
log4jには、初期化中に自動的に自動的に構成する機能があります。 log4jが起動すると、ClassPathの下にあるすべての名前に準拠したファイルが適切に配置されます。
3。簡単な例
XML設定:
<?xml version = "1.0" encoding = "utf-8"?> <configuration status = "warn"> <appenters> <コンソールname = "console"ターゲット= "> <patternlayout pattern ="%d {hh:mm:ss.sss} [%t]%-5level%logger {36}-%msg% <loggers> <root level = "info"> <appenderref ref = "console"/> </rooger> </loggers> </configuration> Javaコード:
プライベート静的最終ロガーロガー= logmanager.getLogger(myapp.class); @test public void testlog4j(){logger.info( "hello world!"); }}コンソール情報
22:17:47.146 [Main] Info MyApp -Hello World!
2。モジュールの紹介
<configuration>
| 財産 | 説明する |
| MonitorInterval | ファイルが変更された場合、設定は指定された時間の後にリロードされます。秒単位、最小値は5です |
| パッケージ | カスタムフィルター、付属器などのプラグインを検索するために使用されるパッケージ名のコンマ分離されたリスト。プラグインは1回のみロードされます。そのため、変更後に有効にしたい場合は、プロジェクトを再起動する必要があります。 |
| 状態 | 内部ログレベル、デバッグに値を設定すると、コンソールのログイベントフロー全体がはっきりとわかります。使用されるロガーは、org.apache.logging.log4j.core.loggerです |
| 厳しい | 厳密なXML形式が許可されています。 JSON構成はサポートされていません |
| 冗長 | プラグインを読み込むときに診断情報を有効にします |
<付録>
log4jを使用すると、ログ要求を複数の宛先に印刷できます。 log4j言語では、出力宛先はAppenderと呼ばれます。現在、コンソール、ファイル、リモートソケットサーバー、Apache Flume、JMS、リモートUnix Syslog Daemons、さまざまなデータベースAPIに付録が存在しています。以下は、より一般的に使用されるいくつかの付録を紹介します。もっと知る必要がある場合は、公式ウェブサイトで確認できます。
1。コンソーペンダー
コンソールへの出力、<console>
パラメーター名 | タイプ | 説明する |
フィルター | フィルター | フィルター |
レイアウト | レイアウト | ログ出力形式 |
フォローする | ブール | |
直接 | ブール | |
名前 | 弦 | Appenderの名前 |
exceptionsを無視します | ブール | デフォルトの真、書き込み例外を無視します |
ターゲット | 弦 | System_outまたはSystem_err、デフォルトはSystem_outです |
2。FILEAPPENDER
ファイルへの出力、<ファイル>
パラメーター | タイプ | 説明する |
|---|---|---|
追加 | ブール | デフォルトはtrueで、新しいレコードはファイルの最後に追加されます |
Bufferedio | ブール | デフォルトは真です。バッファーを使用するとパフォーマンスが大幅に向上する可能性があります |
緩衝液 | int | Bufferedioが真の場合、このプロパティのバッファーサイズはデフォルトで8192バイトです。 |
createondemand | ブール | Appenderは、需要のあるファイルを作成します。 Appenderは、ログイベントがすべてのフィルターを通過し、Appenderにルーティングされた場合にのみ、このファイルを作成します。デフォルト値はfalseです |
フィルター | フィルター | イベントをこのAppenderが処理する必要があるかどうかを判断するフィルター。複数のフィルターを複合フィルターで使用できます |
ファイル名 | 弦 | 書かれるファイルの名前。ファイルまたはその親ディレクトリのいずれかが存在しない場合、それらは作成されます |
即時フラッシュ | ブール | デフォルトでは、それぞれの書き込みの後にリフレッシュが行われます。これにより、バッファーのデータがディスクに書き込まれることが保証されますが、パフォーマンスに影響を与える可能性があります。 |
レイアウト | レイアウト | ログ形式 |
ロック | ブール | ファイルロック、デフォルトのfalse |
名前 | 弦 | Appenderの名前 |
exceptionsを無視します | ブール | デフォルトの真、書き込み例外を無視します |
filepermissions | 弦 | ファイル権限を定義します 例:RW ------またはRW-RW-RWなど... |
ファイルオーナー | 弦 | ファイル所有者を定義します |
FileGroup | 弦 | ファイルグループを定義します |
3。JDBCAAPPENDER
JDBCAppenderは、標準のJDBCを使用して、ログイベントをリレーショナルデータベーステーブルに書き込みます。 JNDIデータソースまたはカスタムファクトリーメソッドを使用してJDBC接続を取得するように構成できます。メソッドに関係なく、接続プールでサポートする必要があります。
それ以外の場合、ロギングのパフォーマンスは大きな影響を受けます。
構成されたJDBCドライバーがバッチステートメントをサポートし、バッファサイズを正の数に構成する場合、ログイベントはバッチされます。
(1)<jdbc>
パラメーター | タイプ | 説明する |
|---|---|---|
名前 | 弦 | Appenderの名前 |
exceptionsを無視します | ブール | デフォルトは、ログイベントの例外を無視します |
フィルター | フィルター | フィルター |
緩衝液 | int | 0を超える整数の場合、バッファがそのサイズに到達したときに、Appenderがログイベントをバッファーし、書き込みデータを更新します |
ConnectionSource | ConnectionSource | データベース接続を取得する必要があります |
タブネーム | 弦 | 必須、ログイベントのデータテーブル名を挿入します |
columnconfigs | columnconfig [] | データベースに挿入する必要があるフィールドは、複数の<column>要素で構成されています |
列マッピング | 列マッピング[] | 必須、フィールドマッピング構成 |
(2)<DataSource>を使用してJDBC接続を取得するには、JNDIのみがここにリストされています。
| パラメーター | タイプ | 説明する |
|---|---|---|
| jndiname | 弦 | 設定されたJNDIがJDBC/LoggingDatabaseの場合、ここの値はJava:comp/env/jdbc/loggingdatabaseです。データソースは、接続プールでサポートする必要があります。それ以外の場合、ロギングは非常に遅くなります。 |
(3)<column>を使用して、テーブルに書き込む列とそれらの書き方を指定します。 SQL注入の脆弱性はありません。
| パラメーター | タイプ | 説明する |
|---|---|---|
| 名前 | 弦 | 必須、テーブルフィールド名 |
| パターン | 弦 | PatternLayoutモードを使用して値を挿入します。注:同じ列要素では、パターン、リテラル、およびIseventTimestampの3つの属性のうちの1つのみが、同じ列要素に存在することができます。 |
| リテラル | 弦 | この値はSQLステートメントに直接含まれ、実行されます。たとえば、rand()関数はmyibatsの$ {}と同様の乱数を生成します |
| ISEVENTTIMESTAMP | ブール | 時間形式Java.sql.types.timestampかどうか |
| isunicode | ブール | このプロパティは、パターンが指定されていない限り無視されます。 trueの場合、値はUnicodeに挿入されます。それ以外の場合、値は非ユニコードに挿入されます。 |
| isclob | ブール | このプロパティは、パターンが指定されていない限り無視されます。 trueの場合、値はCLOBに挿入されます。そうしないと、varchar、nvarcharは |
例:
<?xml version = "1.0" encoding = "utf-8"?> <configuration status = "error"> <appenters> <jdbc name = "databaseappender" tablename = "dbo.application_log"> <datasource jndiname = "java:/comp/env/jdbc/loggingdatasource"/< iSeventTimestamp = "true" /> <column name = "level" pattern = "%level" /> <列name = "logger" pattern = "%logger" /> <column name = "message" pattern = "%message" /> <column name = "column name ="%ex {full} " />> < /jdbc> ref = "databaseappender"/> </root> </loggers> </configuration><PatternLayout>
(1)日付、%d/%日付
パターン | 例 |
|---|---|
%d {デフォルト} | 2012-11-02 14:34:02,781 |
%d {ISO8601} | 2012-11-02T14:34:02,781 |
%d {iso8601_basic} | 20121102T143402,781 |
%d {絶対} | 14:34:02,781 |
%d {date} | 2012年11月2日14:34:02,781 |
%d {compact} | 20121102143402781 |
%d {hh:mm:ss、ss} | 14:34:02,781 |
%d {dd mmm yyy hh:mm:ss、ss} | 2012年11月2日14:34:02,781 |
%d {hh:mm:ss} {gmt+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
もちろん、%d {yyyy-mm-dd hh:mm:ss}などの形式をカスタマイズすることもできます。
(2)ロガー、%C/%ロガー
変換パターン | ロガー名 | 結果 |
|---|---|---|
%C {1} | org.apache.commons.foo | foo |
%C {2} | org.apache.commons.foo | commons.foo |
%c {10} | org.apache.commons.foo | org.apache.commons.foo |
%C {-1} | org.apache.commons.foo | apache.commons.foo |
%C {-2} | org.apache.commons.foo | commons.foo |
%C {-10} | org.apache.commons.foo | org.apache.commons.foo |
%c {1。} | org.apache.commons.foo | oacfoo |
%C {1.1。〜。〜} | org.apache.commons.test.foo | oa〜。〜.foo |
%c {。} | org.apache.commons.test.foo | .... foo |
{?} - いつ ?正の整数であり、n部品が右から採取され、負の整数はn部品が左から除去されることを意味します。なぜ%c {-10}が完全な名前であるのか、私にはわかりません。メッセージを残してください
(3)ログ情報、%m/%msg/%メッセージ
(4)ログレベル、%レベル
<filter>
LOG4J2には、直接使用するさまざまなフィルターが付属しており、フィルターを自分で定義することもできます。
myfilter.java
org.apache.logging.log4j.level; Import org.apache.logging.log4j.marker; import org.apache.logging.log4j.threadcontext; import org.apache.logging.log4j.core.logevent; import org.apache.logging.log4j.core.logger; org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.pluginfactory; import org.apache.logging.log4j.core.filter.abstractfilter; Import org.apache.logging.log4j.message.message; @plugin(name = "myfilter"、category = "core"、elementtype = "filter"、printobject = true)public final class extends abstractfilter {プライベート最終レベル; PrivateMyFilter(レベルレベル、結果オンマッチ、結果オンマイマチ){super(onmatch、onmismatch); this.level = level; } public resultフィルター(ロガーロガー、レベルレベル、マーカーマーカー、string msg、object [] params){return(level); } public resultフィルター(ロガーロガー、レベルレベル、マーカーマーカー、オブジェクトMSG、スロー可能なt){return(level); } public resultフィルター(ロガーロガー、レベルレベル、マーカーマーカー、メッセージmsg、スロー可能なt){return(level); } @Override public resultフィルター(logevent event){return filter(event.getLevel()); } private resultフィルター(レベルレベル){ / * * business logic * * / return level.ismorespificthan(this.level)? onMatch:onmismatch; } @Override public String toString(){return level.toString(); } @pluginFactory public static myfilter createfilter(@pluginattribute(value = "level"、defaultString = "error")レベル、@pluginattribute(value = "onmatch"、defaultString = "neutral")onmatch onmatch、@pluginattribute(value = "onmismatch") onmatch、onmismatch); }}log4j2.xml
<?xml version = "1.0" encoding = "utf-8"?> <configuration status = "warn" monitorinterval = "5" packages = "your packages" verbose = "false" strict = "true"> <console name = "console" target = "System_out" Ingainexections = "true HH:mm:ss}%level%logger {10} - %msg "/> <myfilter level =" info "onmatch =" Accept "/> </console> </appenters> <loggers> <root level =" info "> <appenderref ref =" console "/>> </root> </logger補充:
実際のアプリケーションでは、リクエストパラメーター、ユーザーIDなどのユーザーアクセス情報を記録する必要がある場合があります。Log4j1では、MDCとNDCを使用してアプリケーションコンテキスト情報を保存し、LOG4J2はThreadContextを使用してMDCとNDCの両方の関数を実装します。
(1)NDCは、スタックのようなメカニズムを使用してコンテキスト情報を保存し、スレッドは独立しています。
%xを使用してパターンレイアウトに出力し、xは小文字であることに注意してください。
例:
test.java
threadcontext.push( "Hello World!");
log4j2.xml
<列name = "tip" pattern = "%x" />
(2)MDCはマップのようなメカニズムを使用して情報を保存し、スレッドは独立しています。
PatternLayoutで%x {userId}を使用して出力を使用して、xが大文字であることに注意してください。
例:
test.java
threadcontext.put( "userid"、 "1");
log4j2.xml
<列name = "userid" pattern = "%x {userid}" />使用した後、Clearall()を呼び出してコンテキストマップとスタックをクリアします。
API:http://logging.apache.org/log4j/2.x/javadoc.html
公式ウェブサイトの住所:https://logging.apache.org/log4j/2.x/index.html
log4j2プロジェクトログコンポーネントの上記の例コードは、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。