Log4j を使用して異なるパッケージのログを異なるファイルに出力する方法

高洛峰
リリース: 2017-01-18 12:42:24
オリジナル
1305 人が閲覧しました

はじめに

プロジェクトの規模が大きくなるにつれ、新しいモジュールが継続的に導入され、最終的には、私のプロジェクトではログがまったく表示されなくなります。

外部メッセージを受信するためのログと、外部メッセージを送信するためのログ。

バックグラウンド常駐スレッドの処理ログ。

外部インターフェースによってアクセスされる結果を返します。データベースにアクセスするサービスによって生成されます ;

その中で、メッセージ ログとバックグラウンド スレッドのログ データの量は非常に多く、すべてのログを 1 つのファイルに出力する場合、tail -f log.log ファイルを使用します。ログが急速にスクロールし、特定の SQL またはサービス アクセス ログを表示することも、特定のファイルを見つけることもできないことがわかります。

解決策は、相互のログが相互に影響を及ぼさないように、異なるログを分類して出力することです。これにより、特に重要なインターフェイスのアクセス ログが問題を簡単に特定してトラブルシューティングできるようになります。

ステップ 1: log4j.properties で設定する

まず、私自身の log4j.properties 設定をすべて投稿します:

log4j.rootLogger=INFO, console, file
  
log4j.appender.console=net.czt.log.AsyncConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p crazyant-web %-17c{2} (%13F:%L) %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} - %m%n
log4j.appender.console.bufferSize=10000
log4j.appender.console.encoding=UTF-8
  
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.file=/home/work/apache-tomcat-6.0.39/logs/crazyant.log
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.MaxFileSize=1GB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p] crazyant-web %d{yyyy-MM-dd HH:mm:ss,SSS} %X{USER_ID}|%X{USER_IP}|%X{SERVER_ADDRESS}|%X{SERVER_NAME}|%X{REQUEST_URI}|%X{SESSION_ID} method:%l%n%m%n
log4j.appender.file.bufferSize=10000
log4j.appender.file.encoding=UTF-8
  
log4j.logger.net.czt.crazyant.msg=DEBUG, message
log4j.additivity.net.czt.crazyant.msg=false
log4j.appender.message=org.apache.log4j.RollingFileAppender
log4j.appender.message.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_message.log
log4j.appender.message.Append=true
log4j.appender.message.MaxFileSize=1GB
log4j.appender.message.MaxBackupIndex=5
log4j.appender.message.layout=org.apache.log4j.PatternLayout
log4j.appender.message.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.message.encoding=UTF-8
  
log4j.logger.net.czt.crazyant.async.service=DEBUG, async
log4j.additivity.net.czt.crazyant.async.service=false
log4j.appender.async=org.apache.log4j.RollingFileAppender
log4j.appender.async.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_async.log
log4j.appender.async.Append=true
log4j.appender.async.MaxFileSize=1GB
log4j.appender.async.MaxBackupIndex=5
log4j.appender.async.layout=org.apache.log4j.PatternLayout
log4j.appender.async.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.async.encoding=UTF-8
  
log4j.logger.net.czt.orm.mybatis.SqlMonitorManager=DEBUG, showsql
log4j.additivity.net.czt.orm.mybatis.SqlMonitorManager=false
log4j.logger.net.czt.transaction.interceptor.SmartTransactionInterceptor=DEBUG, showsql
log4j.additivity.net.czt.transaction.interceptor.SmartTransactionInterceptor=false
log4j.appender.showsql=org.apache.log4j.RollingFileAppender
log4j.appender.showsql.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_sql.log
log4j.appender.showsql.Append=true
log4j.appender.showsql.MaxFileSize=1GB
log4j.appender.showsql.MaxBackupIndex=5
log4j.appender.showsql.layout=org.apache.log4j.PatternLayout
log4j.appender.showsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.showsql.encoding=UTF-8
  
log4j.logger.net.czt.crazyant.service=DEBUG, service
log4j.additivity.net.czt.crazyant.service=false
log4j.appender.service=org.apache.log4j.RollingFileAppender
log4j.appender.service.File=/home/work/apache-tomcat-6.0.39/logs/crazyant_service.log
log4j.appender.service.Append=true
log4j.appender.service.MaxFileSize=1GB
log4j.appender.service.MaxBackupIndex=5
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] [%t] - %m%n
log4j.appender.service.encoding=UTF-8
ログイン後にコピー

設定ファイルの下部で、メッセージ (メッセージ)、非同期 (最後の終了) を行うことが簡単にわかります。 thread)、showsql(データベースログ)、service(インターフェース呼び出し)はそれぞれ別のログファイルに出力されます。

いくつかの説明:

log4j.rootLogger=INFO、console、file

log4jには、rootLoggerと通常のLoggerの概念があります。デフォルトでは、必要なrootLoggerは1つだけです。つまり、すべてのログはこれにのみ出力されます。ファイルにログを記録します。

一般的な Logger の設定を見てみましょう (インターフェイス ログ サービスを例にします):

1. log4j.logger.net.czt.crazyant.service=DEBUG, service


この文では、「net. czt.crazyant.service」は、共通ロガーのログ設定が有効になるパッケージのフルパスを示します


‑ ‑‑ ‑ 共通の名前を表すサービス


2、log4j.additivity .net.czt.crazyant.service=false


「net.czt.crazyant.service」は、上記と同様に、この設定項目の対象となるパッケージを示します。ログを出力するこのパッケージを rootLogger ログに出力する場合は、ログ


3、log4j.appender.service=org.apache.log4j.RollingFileAppender、およびこの設定セクションの設定項目のみを出力します。

ここの「サービス」文字列と、上の最初の設定項目の「サービス」は同じで、通常のロガーの設定を示します。


以下の設定項目は rootLogger と同じで、毎日の出力ファイルを示します。 、エンコードUTF8、断片化ルール、各行の出力モードなど。


私自身 私が遭遇した問題は、上記のlog4j.propertiesを構成した後、各ログファイルが作成されたことがわかったが、その中にコンテンツが存在しないことでした。どうしてこれなの?以下の 2 番目の注意点を見てみましょう


ステップ 2. ログを出力する場合、ログ オブジェクトに対応する特定のクラスを設定する必要があります

これは何を意味しますか?上記の設定項目の中に「net.czt.crazyant.service」というパッケージ文字列がありますが、log4j はどのようにして異なるパッケージのロガーログを異なるファイルに出力するのでしょうか。考えてみると、2 つのタイプがあります。方法:

1. log4j は、インターセプターまたは aop を使用して、ログがどのパッケージから生成されたかを検出すると、それを対応するファイルに出力します。 log4j はそれを取得します。このクラスに対応するパッケージは、さまざまなログ ファイルを見つけるためのガイドとして使用されます。

コードを見ると、log4j が後者の単純で直接的な方法を使用していることがわかります。 .getLog(MyClassImpl. class) には、ロガーを使用した Class パラメータが渡され、リフレクションによって得られた Class のパッケージ アドレスが、log4j がログを出力するために使用されるパッケージ アドレスになります。

このアプローチも強力で、論理的なログの分類が容易になります。たとえば、多くのコードはパッケージに属していませんが、メッセージ処理は単にインターフェイスを介してサービス パッケージを呼び出すだけではない可能性があります。 msg パッケージ内のログをサービスに出力したい場合は、msg ロガーの初期化時にサービス クラスを渡すだけです。

または、特定のタイプのすべてのログについて、そのすべてのロガー オブジェクトは単一のカプセル化されたオブジェクト インスタンスから取得され、この単一のオブジェクト インスタンスから渡されるパラメーターは 1 つだけであり、この論理分類を識別するために使用されます。

概要


Log4j.properties では、パッケージまたは特定のクラスのログを個別に出力することがサポートされていますが、コード内でロガーが初期化されるときに、ログ構成内のパッケージに対応できる必要もあります。

それでは、この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。

Log4j を使用してさまざまなパッケージのログをさまざまなファイルに出力する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!