三方ライブラリ--slf 4 j-log 4 jの使用

15078 ワード

本稿では,ログゲートslf 4 jと他の多くのログフレームワークlog 4 j,log 4 j 2,logback,j.u.l(java.util.logging)との関係を探究するのではなく,slf 4 jとlog 4 jの組合せ使用に重点を置く.
log 4 jは最も古典的で、使用人数が最も多いログフレームワークであるべきである.ブロガーは最近開発されたプロジェクトでslf 4 jとlog 4 jを使用したところ、多くの問題が発見され、slf 4 j-log 4 jのプロジェクトでの使用を簡単に記録し、共有することにした.
log 4 jとlog 4 j 2
私の知っている限りでは、log 4 jはもう更新されていません.公式サイトからの話を引用します.
End of Life On August 5, 2015 the Logging Services Project Management Committee announced that Log4j 1.x had reached end of life. For complete text of the announcement please see the Apache Blog. Users of Log4j 1 are recommended to upgrade to Apache Log4j 2.
はい、log 4 jは1で停止します.xバージョンは、log 4 j 2を迎えました.新しいバージョンの探索を停止すべきではありません.まして古いバージョンは更新されていません.log 4 j 2はlog 4 j全体より大きく改善されており、これも私たちがその主な原因を理解する必要がある.log 4 jとlog 4 j 2の違いは主に以下の点に現れている.
  • はpropertiesファイルをプロファイルとしてサポートしません.
  • Java 6以下のバージョンはサポートされていません.
  • はプラグイン、フィルタなどをサポートする.
  • と比較する.x、性能が大幅に向上しました.

  • log 4 j 2のより詳細な内容については、興味のある学生は自分で理解することができ、今から本稿のテーマであるslf 4 j-log 4 jの使用について話します.
    log 4 jとslf 4 jの組み合わせ使用
    Maven依存のインポート
    現在、ほとんどのプロジェクトはMavenに基づいて作成されているため、IDEAにjarパッケージを導入するという比較的古い操作は説明されず、必要な学生は自分でGoogleすることができます.私たちはpomにいます.xmlファイルに次の依存項目を追加します.
    
    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-log4j12artifactId>
        <version>1.7.25version>
    dependency>
    

    slf 4 j-log 4 j 12このパケットはslf 4 jとlog 4 jに依存するに違いないので、slf 4 j-log 4 jの組み合わせを使用するには、上記の依存を構成すれば十分です.
    log4j.propertiesプロファイル
    log 4 jのプロファイルは、.propertiesファイルは、.xmlファイル、私は慣れています.propertiesファイルであるため、本稿では根拠のみを検討する.propertiesファイルはlog 4 jの構成を行うが、前述のように.propertiesファイルはlog 4 j 2で廃棄された.理由は.xmlファイルの読み取り可能性はもっと良いです(私はどうしてそう思いませんか)?
    Maven(Mavenが管理する)プロジェクトではlog 4 j.propertiesプロファイル(ファイル名はこのように)srcディレクトリの下にあるresourcesディレクトリに置けば、自動的にプロファイルがロードされます.Springフレームワークでは、Webプロジェクトでも、通常のJavaプロジェクトでlog 4 j.propertiesファイルの配置経路でも、ブロガーは検証していないので、必要な学生が自分でGoogleを使うことはありません.
    log4j.properties内容
    log 4 jログレベル
    log 4 jを構成する前に、log 4 jのログレベルについて説明します.ログレベルはログの重要度で、log 4 jログは7つのレベルに分けられます:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF、左から右のレベルは低いから高いまで、私达の最もよく使う4つのレベルはINFO、WARN、ERROR、FATALです.等級付けは、ログ出力の敷居を設定するために行われ、等級がこの敷居以上のログのみが出力されます.
    ALL:各級はカスタムレベルを含む;DEBUG:細粒度情報イベントを指定する;INFO:アプリケーションの実行状況の粗粒度レベルの情報;WARN:潜在的な危害がある状況を指定する;ERROR:エラー・イベントがアプリケーションの実行を継続できる場合があります.FATAL:非常に重大なエラーイベントで、アプリケーションが中止される可能性があります.OFF:最高レベル、ログをオフします.
    log 4 jログインスタンス
    ログ・インスタンスは、コードにインスタンス化されたLoggerオブジェクトです.
    log4j.rootLogger=LEVEL,appenderName1,appenderName2,...
    

    これはグローバルloggerの構成で、LEVELはログレベルを設定するために使用され、1つのログレベルしか設定できません.appenderNameはログ出力器を定義し、ログ出力器は同時に複数を定義できます.
    appenderログ出力器
    ログ出力器はloggerの出力位置を指定します:log4j.appender.appenderName=className.
    出力位置には5つの選択肢があります.
    org.apache.log4j.ConsoleAppender #    
    org.apache.log4j.FileAppender #   
    org.apache.log4j.DailyRollingFileAppender #           
    org.apache.log4j.RollingFileAppender #                      
    org.apache.log4j.WriterAppender #                    
    

    各appenderにはいくつかの構成項目がありますが、ここではよく使われる3つだけを紹介します.
    ConsoleAppender
    Threshold=INFO #              ,  DEBUG
    ImmediateFlush=true #              ,  false    ,    true
    Target=System.err #     System.out
    

    DailyRollingFileAppender
    Threshold=WARN #              ,  DEBUG
    ImmediateFlush=true #              ,  false    ,  true
    Append=false # true            ,false             ,  true
    File=D:/logs/logging.log4j #          logging.log4j  
    DatePattern='.'yyyy-MM #           ,             。          logging.log4j,           logging.log4j.yyyy-MM
    
    #   ,       、 、 、         ,       :
    # 1)'.'yyyy-MM:  
    # 2)'.'yyyy-ww:  
    # 3)'.'yyyy-MM-dd:  
    # 4)'.'yyyy-MM-dd-a:    
    # 5)'.'yyyy-MM-dd-HH:   
    # 6)'.'yyyy-MM-dd-HH-mm:   
    

    RollingFileAppender
    Threshold=WARN #              ,  DEBUG
    ImmediateFlush=true #              ,  false    ,  true
    Append=true # true            ,false             ,  true
    File=D:/logs/logging.log4j #        logging.log4j  
    MaxFileSize=100KB #      KB,MB  GB。           ,      ,         logging.log4j.1  
    MaxBackupIndex=2 #                ,  ,  2     logging.log4j.1,logging.log4j.2         logging.log4j  
    

    Layout出力内容およびフォーマット
    Layout指定logger出力内容およびフォーマット:log4j.appender.appenderName.layout=className.
    Layoutには4つの選択肢があります.
    org.apache.log4j.HTMLLayout #  HTML      
    org.apache.log4j.PatternLayout #            
    org.apache.log4j.SimpleLayout #                
    org.apache.log4j.TTCCLayout #          、  、     
    

    Layoutにも構成項目があります.同様に、最も一般的なPatternLayout構成のみを説明します.
    ConversionPattern=%m%n #             
    

    フォーマットのパラメータの説明は次のとおりです.
    %p:          , DEBUG,INFO,WARN,ERROR,FATAL
    %d:             ,     ISO8601,       :%d{yyyy/MM/dd HH:mm:ss,SSS}
    %r:             log        
    %t:             
    %l:           ,   %c.%M(%F:%L)   ,     、  、            
    %c:           ,       
    %M:            
    %F:               
    %L:        
    %m:              
    %n:         ,Windows   "rn",Unix   "n"
    %x:           NDC(      )
    %%:    "%"  
    

    slf 4 j-log 4 jのJavaコードでの使用
    もともとlog 4 jを使用してJavaでloggerをこのように宣言していました.
    public class Log4jTest {
    
        private static final Logger LOGGER = Logger.getLogger(Log4jTest.class);
    }
    

    今はこのようにすればいいです.
    public class Slf4jTest {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);
    }
    

    同じクラスに複数のログファイルを出力
    次のコードを考慮します.
    private static final Logger LOGGER1 = LoggerFactory.getLogger("test1");
    private static final Logger LOGGER2 = LoggerFactory.getLogger("test2");
    

    同じクラスに2つの異なるログインスタンスを作成することによって、このような生成されたログ情報を異なる場所に出力することで、log 4 jを構成することができる.properties:
    log4j.logger.test1=DEBUG, test11
    log4j.appender.test11=org.apache.log4j.FileAppender
    log4j.appender.test11.File=${myweb.root}/WEB-INF/log/test1.log
    log4j.appender.test11.layout=org.apache.log4j.PatternLayout
    log4j.appender.test11.layout.ConversionPattern=%d %p [%c] - %m%n
      
    log4j.logger.test2=DEBUG, test22
    log4j.appender.test22=org.apache.log4j.FileAppender
    log4j.appender.test22.File=${myweb.root}/WEB-INF/log/test2.log
    log4j.appender.test22.layout=org.apache.log4j.PatternLayout
    log4j.appender.test22.layout.ConversionPattern=%d %p [%c] - %m%n
    

    つまり、loggerを使用するときにカスタマイズされた名前(ここの「test 1」のように)を付けますが、これらのカスタマイズされたログのデフォルトはlog 4 j.rootLoggerが構成したログに同時に出力されるのですが、どのようにして自分の指定したログにのみ出力させるのでしょうか?log4j.rootLoggerの下にlog4j.additivity.org.apache=falseを追加すればよいという問題があります.
    log 4 j階層出力ログファイル
    log 4 jを使用する場合、INFOレベルのログのみがコンソールに印刷され、WARNレベルのログがwarnに印刷されるというニーズがあるはずです.logファイル、ERRORレベルのログをerrorに印刷する.logファイル、私はしばらくこのような需要をlog 4 jログファイルの階層出力として定義します.このようなニーズに対して、次の完全なプロファイルが満たされるかどうかを見てみましょう.
    log4j.rootLogger=INFO,infoConsole,warnFile,errorFile
    log4j.additivity.org.apache=false
    
    # infoConsole
    log4j.appender.infoConsole=org.apache.log4j.ConsoleAppender
    log4j.appender.infoConsole.Threshold=INFO
    log4j.appender.infoConsole.ImmediateFlush=true
    log4j.appender.infoConsole.Target=System.out
    log4j.appender.infoConsole.layout=org.apache.log4j.PatternLayout
    log4j.appender.infoConsole.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c.%M [%t] - %m%n
    
    # warnFile
    log4j.appender.warnFile=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.warnFile.Threshold=WARN
    log4j.appender.warnFile.ImmediateFlush=true
    log4j.appender.warnFile.Append=true
    log4j.appender.warnFile.File=${filePath}/warn.log
    log4j.appender.warnFile.DatePattern='.'yyyy-MM-dd
    log4j.appender.warnFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.warnFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %l [%t] - %m%n
    
    # errorFile
    log4j.appender.errorFile=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.errorFile.Threshold=ERROR
    log4j.appender.errorFile.ImmediateFlush=true
    log4j.appender.errorFile.Append=true
    log4j.appender.errorFile.File=${filePath}/error.log
    log4j.appender.errorFile.DatePattern='.'yyyy-MM-dd
    log4j.appender.errorFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.errorFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %l [%t] - %m%n
    

    答えはできない.INFOレベルのログをコンソールに出力、WARNレベルのログをコンソールとwarnに同時に出力します.logでは、ERRORレベルのログ情報の出力については実践していないが、コンソール、warnにログ情報を出力すると推測できる.logおよびerror.ロゴにあります.
    この問題が発生したのは、log4j.rootLogger=INFOのグローバル構成によるものだと思いますが、グローバル構成のログレベルは1つしか指定できず、INFOを指定しました.したがって、WARNレベルログが生成されると、まずグローバル構成のINFOレベルと比較され、レベルがINFOより大きく、3つのログ出力器の構成が順次一致し始める.我々はinfoConsoleにlog4j.appender.infoConsole.Threshold=INFOを設定、warnFileにlog4j.appender.warnFile.Threshold=WARNを設定すると、WARNレベルのログが正常に一致するため、WARNレベルのログはコンソールとwarnに同時に出力.logファイル.ERRORレベルログ情報の出力状況はこれと同じである.
    どうやってこの問題を解決しますか?各ログ出力に次の構成項目を追加するだけです.
    # warnFile
    log4j.appender.warnFile.filter.warnFilter=org.apache.log4j.varia.LevelRangeFilter
    log4j.appender.warnFile.filter.warnFilter.LevelMin=WARN
    log4j.appender.warnFile.filter.warnFilter.LevelMax=WARN
    
    # errorFile
    log4j.appender.errorFile.filter.errorFilter=org.apache.log4j.varia.LevelRangeFilter
    log4j.appender.errorFile.filter.errorFilter.LevelMin=ERROR
    log4j.appender.errorFile.filter.errorFilter.LevelMax=ERROR
    

    これらの配置項目の詳細な説明については、私はもう貼らないで、必要な学生が自分でGoogleをします.
    log 4 j.propertiesでの相対パスの使用
    もう一つの使用シーンを考えます.もし私が今サードパーティのライブラリを開発したいとしたら、ライブラリでslf 4 j-log 4 jログフレームワークを使用すると、私たちのログファイルの出力経路は異なるオペレーティングシステム環境でエラーが発生しないことを保証する必要があります.それ以外に、私たちが書いたアプリケーションもよくパッケージ化されます.warまたは.JAvaは異なるアプリケーション環境にパブリッシュされます.このとき、log 4 jを配置する.propertiesでは、2つのことを考慮する必要があります.
  • ログファイル出力のパスをどのように指定すれば、異なる環境で常に有効になりますか?
  • 異なるオペレーティングシステム、例えばWindowsシステムのファイルパス:D:\logs\warn.log、クラスUnixシステムのファイルパス:/home/logs/warn.log、2つの異なるパスの表現方式はどのように統一すべきですか?

  • 答えは相対パス表現を使うことです.ロゴ4 jでpropertiesでは相対パスを使用します.まず、コードにシステム環境変数を設定する必要があります.以下のようにします.
    //   user.dir        
    String rootPath = System.getProperty("user.dir");
    System.setProperty("log.base", rootPath);
    

    そしてlog 4 j.propertiesで相対パスを指定します:${log.base}/logs/warn.log.しかし、これは最初の問題を解決しただけで、2番目の問題に対して、どのように解決すればいいですか?
    私が調べた資料によると、今では異なるオペレーティングシステムがパスを自動的に変換しています.つまり、${log.base}/logs/warn.logの相対パスを指定すると、Windowsオペレーティングシステムでは、出力パスにディスクが自動的に追加され、パスの/\に変更されます.これは、主にFileクラスを使用してファイルパスを処理するためです.そのため統一経路の書き方は非常に簡単で、つまりLinux(Unixクラス)パスの書き方だけを残しておけば、ほとんどのプログラムが正常に動作します.しかし、統一パスの書き方をサポートしないプログラムは少ないです(ファイルパスを処理するためにFileクラスを使用していないため、手動で接続されている可能性があります)では、どうすればいいでしょうか.Javaではオペレーティングシステムのバージョンを判断できるので、関数を書いて、統合パスの書き方を現在のオペレーティングシステムのフォーマットに変更することも考えられます.詳細は、このブログを参照してください.[Java]Windows/Linuxパスが異なる場合、warを統合する最も簡単な方法です.
    まとめ
  • log 4 j 2に精通し、log 4 jプロジェクトをlog 4 j 2にスムーズに移行しようと試みる.
  • log 4 jプロファイルの作成方法を熟知している.
  • log 4 jが階層出力をどのように構成するかを熟知している.
  • log 4 jがどのように経路の書き方を統一するかを熟知している.
  • log 4 jがタイミングクリアログファイルを構成する方法を熟知しています.1週間以内のログ情報のみを保持します(本明細書では説明していませんが、重要です).
  • リファレンス
    Javaログフレームワークlog 4 j詳細構成およびslf 4 jとの連携チュートリアル
    Log 4 jのログ出力レベルとプロファイルの詳細
    Log4j.properties構成の詳細
    log 4 jのproperties詳細構成、階層出力ログファイル