序文
プロジェクトのサイズが大きくなり、より大きくなると、新しいモジュールが継続的に導入されます。異なるモジュールが独自のログを印刷し、最終的にログを表示できなくなります。たとえば、私自身のプロジェクトでは、次のログが存在します。
その中で、メッセージログとバックグラウンドスレッドのログデータの量は非常に大きいです。すべてのログが1つのファイルに印刷され、 tail -f log.logファイルを使用している場合、ログが迅速にスクロールしていることがわかり、特定のSQLまたはサービスアクセスログを表示または見つけることさえできません。
解決策は、相互ログが互いに影響を与えないように、異なるログを分類および出力することです。特に重要なインターフェイスによるログへのアクセスは、問題を簡単に見つけてトラブルシューティングすることができます。
ステップ1:log4j.propertiesで構成します
最初に私自身のすべてのlog4j.properties構成を投稿してください:
log4j.rootlogger = info、console、file log4j.appender.console = net.czt.log.asynconsoleappenderlog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.appender.console.layout.convert.convertionionionionionionionioniontionpatternverout.convertionpitrntioniontion-oltionionioniontion-oltionionionionionionionionionioniontion-otternvertionnvertion %-17C {2}(%13f:%l)%x {user_id} |%x {user_ip} |%x {server_address} |%x {server_name} |%x {request_uri} |%x {session_id} - %m%nlog4j.appender.console.buffersize = 10000log4j.appender.console.encoding = utf-8 log4j.appender.file = org.apache.log4j.rollingfileappenderlog4j.appender.file.file.file.file =/home/work/apache-tomcat-6.0.39/logs/crazy.loglog4j.appender.file.maxb ackupindex = 5log4j.appender.file.maxfilesize = 1gblog4j.appender.file.layout = org.apache.log4j.patternlayoutlog4j.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} {session_id}方法:%l%n%m%nlog4j.appender.file.buffersize = 10000log4j.appender.file.encoding = utf-8 log4j.logger.net.czt.crazyant.msg = debug、 messagelog4j.additivity.net.czt.crazyant.msg = falselog4j.appender.message = org.apache.log4j.rollingfileappenderlog4j.appender.message.file =/home/work/work/apache-tomcat-6.0.0.39/logs/crazyant_message.-message.-message.-message age.append = truelog4j.appender.message.maxfilesize = 1gblog4j.appender.message.maxbackupindex = 5log4j.appender.message.layout = org.apache.log4j.patternlayoutlog4j.adpender.message.layout.converntionpattern = dd HH:mm:ss} [%-5p] [%c {1}] [%t] - %m%nlog4j.appender.message.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = debug、 asynclog4j.additivity.net.czt.crazyant.async.service = falselog4j.appender.async = org.apache.lollingfileappenderlog4j.appender.async.file =/home/home/work/apache-tomcat-6.0.39/logs/crazys_async.lg r.async.append = truelog4j.appender.async.maxfilesize = 1gblog4j.appender.async.maxbackupindex = 5log4j.appender.async.layout = org.log4j.patternlayoutlog4j.Appender.async.layOut.convers.convers.convers.convers. HH:mm:ss} [%-5p] [%c {1}] [%t] - %m%nlog4j.appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitormanager = dabug、 showsqllog4j.additivity.net.czt.orm.mybatis.sqlmonitormanager = falselog4j.logger.net.czt.transaction.interceptor.interceptor.smarttransactionceptor = debug、 showsqllog4j.additivity.net.czt.transaction.interceptor.smarttransactionInterceptor = falselog4j.appender.showsql = org.apache.log4j.rollingfileappenderlog4j.appender.showsql.file =/home/work/work/apache-tomcat-6.0.0.0.39/cakscat-6.0.0.39 og4j.appender.showsql.append = truelog4j.appender.showsql.maxfilesize = 1gblog4j.appender.showsql.maxbackupindex = 5log4j .appender.showsql.layout = org.apache.log4j.patternlayoutlog4j.appender.showsql.layout.conversionpattern =%d {yyyy-mm-dd HH:mm:ss} [%-5p] [%c {1}] [%t] - %m%nlog4j.appender.showsql.encoding = utf-8 log4j.logger.net.czt.crazyant.service = debug、 servicelog4j.additivity.net.czt.crazyant.service = falselog4j.appender.service = org.apache.log4j.rollingfileappenderlog4j.appender.service.file =/home/work/work/apache-tomcat-6.0.39/logs/logs/crazyant_service.log4j rvice.append = truelog4j.appender.service.maxfilesize = 1gblog4j.appender.service.maxbackupindex = 5log4j.appender.service.layout = org.apache.log4j.patternlayoutlog4j.appender.service.lay.conurtionpitrndd HH:mm:ss} [%-5p] [%c {1}] [%t] - %m%nlog4j.appender.service.encoding = utf-8構成ファイルの下では、メッセージ(メッセージ)、Async(バックエンドスレッド)、showQL(データベースログ)、およびサービス(インターフェイスコール)をそれぞれ異なるログファイルに出力することが簡単にわかります。
これらの説明のいくつか:
log4j.rootLogger=INFO, console, file
log4jには、rootloggerと普通のロガーの概念があります。デフォルトでは、ルートロガーのみが必要です。つまり、すべてのログはこのログファイルにのみ出力されます。
通常のロガーの構成を見てください(インターフェイスログサービスを例として使用):
1。log4j.logger.net.czt.crazyant.service log4j.logger.net.czt.crazyant.service=DEBUG, service
この文の「 net.czt.crazyant.service 」は、通常のロガーログ構成で有効になるパッケージの完全なパスを示しています
カラーサービスは、普通のロガーの名前を示しています
2。log4j.additivity.net.czt.crazyant.service 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.インターセプターまたはAOPメソッドを使用して、log4jはログ出力を単独で検出します。ログが生成されるパッケージを検出すると、対応するファイルに出力されます。
2。ユーザーはクラスパラメーターを渡し、log4jはクラスの対応するパッケージを取得し、これを基礎として使用して異なるログファイルを見つけます。
コードを見ると、Log4Jが後者のシンプルで直接的な方法を使用することは明らかです。
Import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory;パブリッククラスmyClassimplはmyclass { / ** * loger * / private static final logger = logfactory.getlog(myclassimpl.class); / ** * my func */ public void myfunc(){logger.info( "call method myfunc。"); }} logger = LogFactory.getLog(MyClassImpl.class)では、ロガーを使用したクラスパラメーターが渡され、クラスが反映されるパッケージアドレスは、log4jがログを出力するために使用するパッケージアドレスです。
このアプローチには、論理的なログ分類を容易にする強力な機能もあります。たとえば、多くのコードはパッケージに属していませんが、論理的に一緒に属します。たとえば、メッセージの処理は、サービスパッケージを呼び出すインターフェイスだけでなく、MSGの送信の操作を呼び出すこともあります。 MSGパッケージのいくつかのログをサービスに出力する場合、MSGロガーが初期化されたら、サービスクラスが渡されます。
または、特定のクラスのすべてのログについて、すべてのロガーオブジェクトは単一のカプセル化されたオブジェクトインスタンスからのものであり、この単一のオブジェクトインスタンスに渡されたパラメーターは1つだけで、この論理分類を識別するために使用できます。
要約します
Log4j.propertiesでは、パッケージまたは特定のクラスのログの個別の出力がサポートされていますが、コードのロガーの初期化がログ構成のパッケージに対応できることも必要です。
さて、上記はこの記事のコンテンツ全体です。この記事の内容が、すべての人の勉強や仕事に役立つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。