1.1はじめに
それを言うのは恥ずかしいです。最近、会社はクライアント会社に送られ、アウトソーシング開発職にインタビューしました。私はもともと、Redis、RabbitMQ、SSMフレームワーク、および私が行ったいくつかのプロジェクトレビューに関するいくつかの関連インタビューの質問を準備しました。私は自信を持ってインタビューに行きました。その結果、最近のプロジェクトで使用されたログシステムが私が登場するとすぐに、誰かが尋ねました。ログレベルはどのように構成されていますか?当時私は混乱していました。私は通常、プロジェクトマネージャーからそれを世話しました。インターネットを検索して貼り付けましたが、大丈夫でした。私が話し終わった後、インタビュアーは私に深い外観を与えてくれました。その時、私は恥ずかしかった...
1.2ゴシップについてあまり教えて、ログの開発のストーリーを教えてください(すでに知っている場合は、それをスキップして1.3ログの構成を見ることができます)
ログテクノロジーの実装を詳細に理解するには、個人的にはLogback + SLF4Jを読むことをお勧めします。ログの構成に関しては、ほとんどのプロジェクトは現在log4jを使用しているため、LOG4Jを理解する方が良いです。さて、ログの開発ストーリーから始めましょう:
1999年、Apache Open SourceコミュニティはLOG4Jをリリースし、プログラムの世界全体に感覚を引き起こしました。それ以来、ロギングの標準となり、Javaプログラマーによって広く使用されています。その後、SunはJDKバージョン1.4でロギングメカニズム(Java.util.logging、以下7月と呼ばれる)もリリースしましたが、メカニズムは一般に認識されていません。すぐにApacheがコモンズログのログフレームワークを開始しました(開発者はログテクノロジーを使用することなくログ実装方法を抽象化することができます。レイマンの用語では、携帯電話でディディを呼び出します。このフレームワークは、太陽の軽emptのようです。ログ出力のために、現在の環境でログテクノロジーを自動的に見つけて呼び出すことができます。ログフレームワークは、Log4Jまたは7月をサポートできます。 Commons-Logging+Log4Jは、その後長い間Javaログの古典的な組み合わせになりました。ただし、コモンズログはしばらく更新されていません。コモンズロギングのデザインは十分ではなく、それを最適化するのがより困難であるのだろうか。なぜそれを言うのですか?次の優れたロギングフレームワークSLF4Jが生まれたため、著者(CekiGülcü)はLog4Jの著者の1人です。彼のSLF4Jはデザインがよりエレガントであり、Log4Jよりも最先端のログバックテクノロジーも実装しています。この時点で、ログシステムがCommons-Logging+Log4Jによって支配されている状況が揺れ始め、さまざまなコモンズログ+Log4J? slf4j+log4j? slf4j+logback?組み合わせは本当に悲痛です。さらに恐ろしいのは、CekiGülcüBossがLog4Jの最適化を支援したことであり、それ以来、世界には別のロギングテクノロジーがあります-Log4J2があります。これは、TencentからWeChatとQQを行うことを学ぶつもりですか?それは本当に666です。したがって、ロギングテクノロジーを深く理解したい場合は、Logback + SLF4Jに関する関連情報を見つけることができます。構成ファイルについては、以下に書いたLOG4J構成の詳細な説明を理解できると思います。結局のところ、多くの企業は現在、LOG4Jフレームワークを使用しています。
1.3トピック、基本的なログ構成に移動します
1. ClassPathまたはリソースパッケージ(Maven Project)の下に新しいlog4j.Propertiesファイルを作成します。初期プロジェクト構成には、次のパラメーターで十分です。より詳細な構成については、
1.4 log4jログレベルの構成を引き続き表示します。
#ルートロガーを介してログレベルと出力ソースを指定します#ログ出力の優先度:debug <info <warn <error <fatal#ルートロガーのログレベル(情報)を定義し、出力ソース(コンソール、myfile)のエイリアスを定義します。 log4j.rootlogger = info、console、myfile ######出力ソースコンソールの特定の実装をコンソール出力として構成############## define出力ソースエイリアスコンソール(つまり、ルートロガーによって定義された出力ソース) log4j.appender.console = org.apache.log4j.consoleAppender#log outputフォーマットを指定するためのフォーマットコンバーターは、パターンレイアウトの実装クラスlog4j.appender.layout = org.apache.log4j.patternlayout#特定の形式を定義します。 log4j.appender.console.layout.conversionpattern =%d%-5p [%c。%m()] - %m%n #########出力ソースMyFile特定の実装をファイル出力として構成output source)log4j.appender.myfile = org.apache.log4j.rollingfileappender#log file log4j.appender.file.file.file.file = src/log/logproperties/log4j.log#log#define of log file log4j.apmyfile.mmmyfile.mmyfile.m axfilesizeizeのサイズを定義します。 (0から1、つまり、ここで最大3つのファイルを計算します) log4j.appender.console.layout.conversionpattern =%d%-5p [%c。%m()] - %m%n ######################%d:ログ印刷の時点で、デフォルトの形式はISO8601であり、形式も指定できます。 #definitionは次のとおりです。%d {yyy year mm month day hh hour mm ming sss sss}、出力は次のとおりです。 " - "サインは右側にあります)、あなたはそれから学ぶことができます#%c:ログが配置されているクラスのフルネーム#%m:ログが配置されているメソッドの名前2.ログを呼び出して、構成結果をテストします。
org.apache.log4j.logmanager; import org.apache.log4j.logger; Import org.apache.log4j.propertyconfigurator; public class logpropertest {public static void main(string [] args){ /*asspats stringの下で構成ファイルを課すファイルlog4jpath = system.getProperty( "user.dir")+"// src // log // logproperties // log4j.properties"; propertyconfigurator.configure(log4jpath);*/ logger log = logmanager.getLogger(logpropertiestest.class); log.debug( "debug"); log.info( "情報"); log.warn( "警告"); log.error( "エラー"); log.fatal( "致命的なエラー"); }}1.4ログレベルの構成
ログレベルの構成は、3つのカテゴリに分割できます。上記の構成は、親ロガーのログレベルを構成すること、2番目のカテゴリはサブクラスロガーのログレベルを構成すること、3番目のカテゴリは出力ソース(コンソール、ファイルなど)のログレベルを構成することです。ログレベルの解析優先度は、低から高に配置されています。特定の声明をはっきりと説明していないことをお詫びします。私はケースを直接理解できるはずです!
1.親ロガー(rootlogger)のログレベル(情報レベルであると仮定)の場合、サブクラスロガーのログレベルは構成されておらず、出力ソースのログレベルが構成されていない場合、出力ソースは出力レベル以下のみを出力できます。
2。親ロガー(RootLogger)のログレベル(情報レベルであると仮定)、サブクラスロガーのログレベル(デバッグレベルであると仮定)、および出力ソースのログレベルが構成されていない場合、出力ソース出力はデバッグレベルを超えています。
3。親ロガー(RootLogger)のログレベル(情報レベルであると仮定)、サブクラスロガーのログレベル(デバッグレベルであると仮定)、および出力ソースのログレベル(情報レベルであると仮定)の場合、出力ソースは情報レベル以上を出力します。
4.親ロガー(RootLogger)のログレベル(情報レベルであると仮定)の場合、サブクラスロガーのログレベルは構成されておらず、サブクラスロガーのログレベルが構成されています。
出力ソースのログレベル(デバッグレベルであると仮定)、出力ソースは情報レベル以上を出力します。
したがって、上記のケースから、ロガーと出力ソース出力ログレベルの間に2つの論理的な関係があることを知ることができます。
1.出力ソースがログレベルを定義しない場合、サブクラスロガーに最も近いログレベルを継承します。サブクラスロガーがログレベルを定義しない場合、親ロガーに最も近い親ロガーを継承します。
2。ログを印刷すると、出力ソースは、最も近いサブクラスロガーによって定義されたログレベルと比較されます。出力ソースによって定義されたレベルがサブクラスロガーよりも高い場合、ログは出力ソースで定義されたログレベルに従って出力され、その逆も同様です。
したがって、プロジェクトでは、毎日の構成方法に従ってログレベルを構成できます。
#親のロガーのログレベルは情報です。デフォルトでは、情報レベルの上のログのみがすべてのモジュールLOG4J.ROOTLOGGER =情報、コンソール#コンソール#モジュールのログレベルを個別にエラーに制御し、ログがlog4j.logger.logger.log.logger.log.logproperties =エラー#エラーを制御する場合にのみ出力されます。 log4j.logger.log.logproperties.logpropertiestest = debug ###################################################################################################################################################################### ############################################################################################################ #################################################################################################################################################################################################### ############################################################################################################ #現在の出力ソースのログレベルを指定します。前の構成を使用すると、このアイテムを構成する必要はありません#log4j.appender.console.threshold = info#log outputの形式を指定しますlog4j.appender.console.layout = org.apache.log4j.patternlayout #content of specient format log [%c。%m()] - %m%n
1.5結論
この時点で、あなたはログ構成を基本的に理解していると思います。記事には間違っているかもしれない多くのことがあり、すべてのヒーローはそれらを指摘することを歓迎します。このテクノロジーの構成を深く理解できるようにするために、それを要約する記事を書きました。そうすれば、それをより深く理解することができます。