この記事では、主にSLF4J+ログバックを特定の理解を持っている読者向けのSLF4J+ログバックの構成を紹介します。
SLF4J+ログバック構成を導入する前に、最初にログコンポーネントのログバックログバックを導入します。
(1)ログコンポーネントログバックの導入と構成
1。ログバックの紹介
LogBackは、LOG4Jの創設者によって設計されたもう1つのオープンソースログコンポーネントです。ログバックは現在、ログバックコア、ログバッククラシック、ログバックアクティビティの3つのモジュールに分割されています。 Logback-Coreは、他の2つのモジュールの基本モジュールです。 Logback-Classicは、LOG4Jの改良バージョンです。さらに、Logback-ClassicはSLF4J APIを完全に実装して、LOG4JやJDK14ロギングなどの他のロギングシステムに簡単に置き換えることができます。 Logback-Access Accessモジュールは、サーブレットコンテナと統合され、HTTPを介してログにアクセスする機能を提供します。 LogBackは、次のように2つのコンポーネントとSLF4Jを組み合わせた公式Webサイトです。
Logbackの公式ウェブサイト:http://logback.qos.ch
SLF4Jの公式ウェブサイト:http://www.slf4j.org
この記事で使用されているコンポーネントは次のとおりです。公式Webサイトにアクセスしてダウンロードしてください!
logback -access -.0.0.jar
logback -classic -.0.0.jar
logback-core-1.0.0.jar
SLF4J-API-1.6.0.jar
2。Log4jを置き換えるログバックの理由:
logbackとlog4jは非常に似ています。LOG4Jに精通している場合、ログバックは非常に簡単に処理できます。 log4jに対するログバックの利点は次のとおりです。
1.ログバックのカーネル書き換えをより速く実装すると、いくつかのキー実行パスでパフォーマンスが10倍以上増加します。さらに、ログバックはパフォーマンスを向上させるだけでなく、初期化されたメモリ負荷も少なくなります。
2.非常に完全なテストログバックは、数年間、数え切れないほどの時間をテストしてきました。 Logbackのテストは完全に異なります。著者の観点から見ると、これはLog4Jの代わりにログバックを選択するためのシンプルで重要な理由です。
3。Logback-Classicは、SLF4Jを実現するためにSLF4J Logback-Classicを使用して自然に実装されています。 SLF4Jを使用すると、LogBack-Classicを感じることはできません。さらに、Logback-ClassicはSLF4Jを非常に自然に実装しているため、LOG4Jなどに切り替えることは非常に簡単で、SLF4JAPIを介して実装されたコードに触れる必要はありません。
4.非常に完全なドキュメントの公式ウェブサイトには、200ページ以上のドキュメントがあります。
5.構成ファイルを構成ファイルの変更として自動的にリロードすると、Logback-Classicは構成ファイルを自動的にリロードできます。スキャンプロセスは高速で安全で、別のスキャンスレッドを作成する必要はありません。このテクノロジーは、アプリケーションがJEE環境で実行できることを完全に保証します。
6。LILITHLILITHは、log4jのチェーンソーと同様の対数事件の観察者です。 Lilithは、大量のログデータを処理することもできます。
7.警告モードと非常に友好的な回復警告モードでは、複数のFileAppenderインスタンスが複数のJVMの下で実行され、同じログファイルを安全に記述できます。 RollingFileAppenderにはいくつかの制限があります。 LogbackのFileAppenderとRollingFileAppenderを含むそのサブクラスは、I/O例外から非常にフレンドリーなものから回復することができます。
8。構成ファイルは、さまざまな状況を処理できます。これらの構成ファイルはわずかな違いであり、実装して実装できるため、構成ファイルが複数の環境に適応できます。
9。フィルター(フィルター)時々、問題が必要であり、ログが必要です。 log4jでは、ログレベルのみが低下しますが、これにより多くのログが作成され、アプリケーションのパフォーマンスが影響します。ログバックでは、そのログレベルを維持し続け、例えば、ユーザーがログインする場合、彼女のログはデバッグレベルで再生され、他のユーザーがワーーンレベルで再生され続けることができます。この関数を達成するには、XML構成の4行を追加するだけです。 mdcfilterを参照できます。
10。SiftingAppener(非常に多機能的なAppender)は、特定の動作パラメーターに従ってログファイルを分割するために使用できます。たとえば、SiftingAppenderは、ユーザーのセッションに続くユーザーのセッションを区別でき、各ユーザーにログファイルがあります。
11.ヒットしたログRollingFileAppenderを自動的に圧縮します。圧縮は非同期プロセスであるため、大規模なログファイルであっても、圧縮プロセスでアプリケーションは影響を受けません。
12.スタックツリーには、スタックツリーログを再生すると、バッグのデータが表示されます。
13. TimeBasedRollingPolicyまたはSizeandtimeBasedFnatpのMaxHistoryプロパティを設定して、古いログファイルを自動的に削除します。 MaxHistory 12が設定されている場合、12か月以上になったログファイルは自動的に削除されます。
要するに、ログバックはLOG4Jよりも優れています。
3。ログバックの構成の紹介
1。ロガー、アペンダー、レイアウト
Loggerは、ログのレコーダーとして、使用される対応するコンテキストに関連付けられていますが、主にログの種類とレベルを定義できます。
Appenderは、主にログ出力の宛先を指定するために使用されます。
レイアウトは、イベントの出力を文字列にフォーマットしたログ情報に責任を負います。
2。ロガーのコンテキスト
各ロガーは、LoggerContextに関連付けられています。他のすべてのロガーは、org.slf4j.loggeractoryクラスのgetloggerの静的方法によっても取得されました。 GetLoggerメソッドは、Loggerによって名前が付けられています。同じ名前を使用して、loggerfactory.getLoggerメソッドを呼び出します。
3。有効レベルとレベルの継承
ロガーに割り当てることができます。レベルには、ch.qos.logback.classic.Levelクラスで定義されているトレース、デバッグ、情報、ワーーン、エラーが含まれます。ロガーが割り当てられていない場合、分布レベルの最も近い祖先からレベルを継承します。ルートロガーのデフォルトレベルはデバッグです。
4。印刷方法と基本選択ルール<BR />印刷方法は、リクエストのレベルを決定します。たとえば、Lがロガーインスタンスの場合、ステートメントl.info( "..")はレベル情報を含む記録的なステートメントです。ログ要求のレベルは、ロガーの有効なレベルよりも高い場合と呼ばれます。それ以外の場合は、無効と呼ばれます。レコード要求レベルはPで、ロガーの有効なレベルはQです。
このルールは、ログバックの中心にあります。レベルソートは次のとおりです。TRACE<DEBUG <INFO <WARN <ERROR
4。Logbackのデフォルト構成<br />構成ファイルlogback-test.xmlとlogback.xmlが存在しない場合、LogbackはデフォルトでBasicConfiguratorを呼び出して最小化された構成を作成します。ルートロガーに関連付けられているコンソープンダーで構成される構成を最小限に抑えるため。出力モードは%d {hh:mm:ss.sss} [%thread]%-5level%logger {36} - %msg%nのPatternLayoutEndCoderです。ルートロガーのデフォルトレベルはデバッグです。
1.ログバックの構成ファイル
ログバック構成ファイルの構文は非常に柔軟です。柔軟性のため、DTDまたはXMLスキーマを定義できません。それにもかかわらず、この方法で構成ファイルの基本構造を説明できます。<configuration>から始めて、ゼロまたはそれ以上の<ppender>要素、ゼロ以上<Olgger>要素、および最大<root>要素があります。
2。ログバックのデフォルト構成の手順
(1)。
(2)。ファイルが存在しない場合は、ファイルlogback.xmlを見つけます。
(3)。両方のファイルが存在しない場合、LogbackはBAS icConfiguratorを使用して自動的に構成します。これにより、レコード出力がコンソールになります。
3。Logback.xmlファイル
<?xmlバージョン= "1.0" encoding = "utf-8"?> <configution> <! appender name = "stdout"> <! - log output encoding-> <encoding> utf-8 </encoding> <laayout> <! - format output:d vean date、%swrewはスレッド名、% - 5レベルを示します。左からレベル5文字幅5文字幅%msg:ログメッセージ、%nはシンボル - > <attern>%d {yyyy-mm-dd hh:mm:ss.sss} [%スレッド]% - 5LEVEL%LOGGER {50} - %MSG%N </pattern> </layout> </appender> <! - 毎日ログファイルを生成 - > <ppender name = "file"> <encoding> utf-8 </エンコード> <RollingPolicy> <! - ログファイルによるファイル名出力 - > <FilenAmepattern> $ {log_home} /myapp.log。%d {yyyy-mm-dd} /maxhistory> </rollingpolice> <layout> <! - 処方出力:%dは日付を表し、%スレッドはスレッド名を表します。ログメッセージ、%nは変化文字 - > <パターン>%d {yyyy-mm-dd hh:mm:ss.sss} [%thread]%-5level%logger {50} - %msg%n </pattern > </layout> <! - ログファイルの最大サイズ - > <triggeringpolice> <maxfilesize> 10mb </maxfilesize> </triggeringpolice> </appen der> <! - 冬眠のカスタマイズに専念するハイバネートSQLのパラメーターを表示 - > <logger name = "organnate.type.descriptor.sql.basicbinder =" trace " /> <logger =" org.hibernate "level =" debug " /> <logger name =" org.hibernate.sql "level =" def " /> <log。erameters" level = "debug" /> <logger name = "org.hibernate.engine.qury.hqlqueryplan" level = "debug" /> <! - ログ出力レベル - > <root level = "info"> <ppender-ref = "stdout" /> <ppender-ref ref = "file" /> < /root> <! - データベースへのログ - > <ppender名= "db"> <!< DataBasename </url> <user> root </user> <password> root> root </password> </dataSource> </connectionSource> </appender> - > </configuration >> </configuration >> </configuration >> </configuration >> 5.プログラムで参照ログバックを使用します
パッケージcom.stu.system.action; import org.slf4j.logger; Import org.slf4j.loggerfactory; public class blogaction {// loggerfactoryを介して取得したグローバルなロガーを定義します。クラス); ** @param args * / public static void main(] logger.info( "logback success");}}次に、JavaプロジェクトでSLF4J+ログバックの構成を紹介しましょう。
1。Maven-Based SLF4J+LOGBACK POM.XML構成
<依存関係> groupId> org.slf4j </groupId> <artifactid> slf4j-api </artifactid> <bersion> 1.7.10 </version> </dependency> <groupid> c h.qos.logback </groupId> <artifactid> logback-classic </artifactid> <バージョン> 1.1.2 </version> </deendecy> <g.qos </groupid> rtifactid> artifactid> <バージョン> 1.1.2 < /バージョン> </依存関係>
2。classpathディレクトリに新しいlogback.xml構成ファイルを作成します
<?xml version = "1.0" encoding = "utf-8"?> <! - スキャン:このプロパティがtrueに設定されている場合、構成ファイルが変更された場合、リロードされ、デフォルト値がtrueになります。 ScanPeriod:時間間隔を設定して、時間ユニットが与えられていない場合、デフォルトのユニットがMillisecondsになります。デフォルトの時間間隔は1分です。デバッグ:この属性がtrueに設定されている場合、ログバックの内部ログ情報が印刷され、ログバックの実行ステータスがリアルタイムで確認されます。デフォルト値はfalseです。 - > <構成scan = "false" scanperiod = "60秒" debug = "false"> <! - logのルートディレクトリを定義します - > <プロパティname = "log_home" value = "/app/log " /> <! - ログファイル名を定義します - > <プロパティ名=" appname "value =" netty "> < / property> <! - ch.qos.logback.core.consoleAppender <appender name = "stdout"> <encoding> utf-8 </encoding> <! - log outputフォーマット:%d平均日付、%スレッドはスレッド名を示します。 %%%%%% %% 5文字幅%%%%%%ロガー{50}は、ロガー名が50文字であることを意味します。そうしないと、期間に応じて分割されます。 %msg:ログメッセージ、%nは行の変更 - > <レイアウト> <パターン>%d {yyyy-mm-dd hh:mm:ss.sss} [%thread]%-5level%logger {50} - %msg%n </pattern> </layout> </appender> <! - ファイルを録画するためにスクロールし、最初に指定されたファイルにログを記録し、特定の条件が満たされたら、ログを他のファイルに記録します - - > <appender name = "Applogappender"> <encoding> utf-8 </encoding> <! - 指定されたログファイルの名前 - > <ファイル> $ {log_home}/$ {appname} .log </file> <転がるとき、RollingFileAppenderの動作は、時刻基準の動きを伴うと判断されます。 - > <RollingPolicy> <! - Rolling%d {yyyy-mm-dd}の間に生成されたファイルのストレージロケーションとファイル名:毎日ロールロール{log_home}/$ { appname} - %d {yyyy-mm-dd} - %i.log </filenamepattern> <! - オプションのノード、数量が数量を超えた場合に最大のアーカイブファイルを制御し、古いファイルを削除します。毎日ロールされており、Maxhistoryが365であると仮定すると、以前に古いファイルを削除するために最後の365日ファイルのみが保存されます。古いファイルが削除され、アーカイブ用に作成されたディレクトリも削除されることに注意してください。 - > <maxhistory> 365 </maxhistory> <! - ログファイルのサイズはmaxfilesizeを超え、上記の%に従ってログファイルがローリングしますTimeBasedFileNamingAndTriggeringPolicy> <MaxFilesize> 100MB </maxfilesize> </timebasedfilenamingan dtriggeringpolicy> </rolingpolicy> <! - log outputフォーマット:%dは日付時間を表します。左の表示5文字幅%ロガー{50}は、ロガー名が50文字であることを示します。そうしないと、期間に応じて分割されます。 %msg:ログメッセージ、%nは行の変更です - > <laayout> <pattern>%d {yyyy-mm-dd hh:mm:ss.sss} [%thread] - [%-5level] [%logger {50}:%line] - %msg%n </pattern> </layout> </appender> <! - 主にログタイプとレベルの名前を定義するために使用できます。パッケージレベルの前半:トレースを含む記録されるログレベル<debug <info <warn <error addition:functionは、rootloggerによって設定された出力のためにrootloggerによって構成されたAppenderを使用するかどうか、false:それはそれのみを意味するかどうかです現在のロガーのappenderが使用されます-ref、true:現在のロガー - refおよびrootlogger-refのappender-ref and rootloggerは効果的です - > <! = "エラー" /> <<! "level =" info "additivity =" true "> <ppender-ref ref =" applogappender " /> < /logger> <! - ルートとロガーは父と息子の関係です。特別な定義がない場合、それはそうですデフォルトのロガー、rootのいずれかの審査の鍵は、このロガーを見つけてから、このロガーのレベルを判断することです。 - > <rootレベル= "info"> <ppender-ref = "stdout" /> <ppender-ref = "applogappender" /> < /root> < /configuration>