はじめに
プロジェクトの規模が大きくなるにつれ、新しいモジュールが継続的に導入され、最終的には、私のプロジェクトではログがまったく表示されなくなります。
外部メッセージを受信するためのログと、外部メッセージを送信するためのログ。
バックグラウンド常駐スレッドの処理ログ。
外部インターフェースによってアクセスされる結果を返します。データベースにアクセスするサービスによって生成されます ;
その中で、メッセージ ログとバックグラウンド スレッドのログ データの量は非常に多く、すべてのログを 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、およびこの設定セクションの設定項目のみを出力します。
ステップ 2. ログを出力する場合、ログ オブジェクトに対応する特定のクラスを設定する必要があります
これは何を意味しますか?上記の設定項目の中に「net.czt.crazyant.service」というパッケージ文字列がありますが、log4j はどのようにして異なるパッケージのロガーログを異なるファイルに出力するのでしょうか。考えてみると、2 つのタイプがあります。方法:
コードを見ると、log4j が後者の単純で直接的な方法を使用していることがわかります。 .getLog(MyClassImpl. class) には、ロガーを使用した Class パラメータが渡され、リフレクションによって得られた Class のパッケージ アドレスが、log4j がログを出力するために使用されるパッケージ アドレスになります。
このアプローチも強力で、論理的なログの分類が容易になります。たとえば、多くのコードはパッケージに属していませんが、メッセージ処理は単にインターフェイスを介してサービス パッケージを呼び出すだけではない可能性があります。 msg パッケージ内のログをサービスに出力したい場合は、msg ロガーの初期化時にサービス クラスを渡すだけです。
または、特定のタイプのすべてのログについて、そのすべてのロガー オブジェクトは単一のカプセル化されたオブジェクト インスタンスから取得され、この単一のオブジェクト インスタンスから渡されるパラメーターは 1 つだけであり、この論理分類を識別するために使用されます。
Log4j.properties では、パッケージまたは特定のクラスのログを個別に出力することがサポートされていますが、コード内でロガーが初期化されるときに、ログ構成内のパッケージに対応できる必要もあります。
それでは、この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。
Log4j を使用してさまざまなパッケージのログをさまざまなファイルに出力する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。