Log 4 j異なるレベルで異なるファイルに出力するいくつかの方法

21540 ワード

log 4 jはもう骨董品ですが、今はプロジェクトがまだ使われていて、異なるレベルで異なるファイルに出力する必要があるので、いくつかの実現方法を記録して、忘れません!以下のいくつかの配置はpropertiesを使用する場合であるが、xmlの原理も同様である.
  • LevelRangeFilter
  • を使用
  • LevelMatchFilter
  • を使用
  • カスタムAppenderは最後に次の必要なプロファイルを貼り付けます.
  • プロジェクトinfoとerrorレベルログはそれぞれallInfoとして記録され、allErrorファイル
  • Aモジュールのログがafile
  • として個別に記録される
  • Aモジュールのinfoレベルログはafileでのみ記録され、allinfoでは記録されない(infoは1回のみ記録される)
  • Aモジュールのerrorレベルログがafile、allErrorに記録されている
  • 次の詳細は、です.
    1.LevelRangeFilterの使用
    これは3種類の中で一番便利なはずですが、配置は以下の通りです.
    log4j.appender.InfoFile = org.apache.log4j.RollingFileAppender
    log4j.appender.InfoFile.File = logs/info1.log
    log4j.appender.InfoFile.MaxFileSize = 10MB
    log4j.appender.InfoFile.Threshold = INFO
    log4j.appender.InfoFile.layout = org.apache.log4j.PatternLayout
    log4j.appender.InfoFile.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
    log4j.appender.InfoFile.filter.F1=org.apache.log4j.varia.LevelRangeFilter
    log4j.appender.InfoFile.filter.F1.LevelMin=INFO
    log4j.appender.InfoFile.filter.F1.LevelMax=INFO

    ここでThresholdで指定する出力レベルはINFOですが、デフォルトではINFOより大きいものも出力します.以下に追加するfilterは最大レベルと最小レベルを指定し、いずれもINFOなので、最終的にはINFOレベルしか出力しません.
    2.LevelMatchFilterの使用
    この構成は少し多いです.例えば、INFOレベルを出力するには、次の構成が必要です.
    log4j.appender.InfoFile2 = org.apache.log4j.RollingFileAppender
    log4j.appender.InfoFile2.File = logs/info2.log
    log4j.appender.InfoFile2.MaxFileSize = 10MB
    log4j.appender.InfoFile2.Threshold = INFO
    log4j.appender.InfoFile2.layout = org.apache.log4j.PatternLayout
    log4j.appender.InfoFile2.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
    log4j.appender.InfoFile2.filter.F1=org.apache.log4j.varia.LevelMatchFilter
    log4j.appender.InfoFile2.filter.F1.levelToMatch=INFO
    log4j.appender.InfoFile2.filter.F1.AcceptOnMatch=true 
    log4j.appender.InfoFile2.filter.F2=org.apache.log4j.varia.LevelMatchFilter
    log4j.appender.InfoFile2.filter.F2.levelToMatch=ERROR
    log4j.appender.InfoFile2.filter.F2.AcceptOnMatch=false
    log4j.appender.InfoFile2.filter.F3=org.apache.log4j.varia.LevelMatchFilter
    log4j.appender.InfoFile2.filter.F3.levelToMatch=WARN
    log4j.appender.InfoFile2.filter.F3.AcceptOnMatch=false  
    log4j.appender.InfoFile2.filter.F4=org.apache.log4j.varia.LevelMatchFilter
    log4j.appender.InfoFile2.filter.F4.levelToMatch=DEBUG
    log4j.appender.InfoFile2.filter.F4.AcceptOnMatch=false  

    ここで注意すべきは、マッチングレベルINFOがtrueであることを指定する後、他のレベルをfalseに設定する必要がある、そうでない場合、他のレベルは出力(Thresholdより指定されたレベルを含む)である.
    3.カスタムアプリケーション
    一般的なプロファイルは次のとおりです.
    log4j.rootLogger=INFO,InfoFile3,errorFile3
    
    log4j.appender.InfoFile3 = org.apache.log4j.RollingFileAppender
    log4j.appender.InfoFile3.File = logs/info3.log
    log4j.appender.InfoFile3.MaxFileSize = 10MB
    log4j.appender.InfoFile3.Threshold = INFO
    log4j.appender.InfoFile3.layout = org.apache.log4j.PatternLayout
    log4j.appender.InfoFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
    
    log4j.appender.errorFile3 = org.apache.log4j.RollingFileAppender
    log4j.appender.errorFile3.File = logs/error3.log
    log4j.appender.errorFile3.MaxFileSize = 10MB
    log4j.appender.errorFile3.Threshold = ERROR
    log4j.appender.errorFile3.layout = org.apache.log4j.PatternLayout
    log4j.appender.errorFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

    ここではThresholdによりレベルを指定するが、デフォルトのインプリメンテーションは指定レベル以上の出力を行うので、このデフォルトインプリメンテーションを変更することができる.
    package com.dingcheng.log;
    
    import org.apache.log4j.Priority;
    import org.apache.log4j.RollingFileAppender;
    
    public class MyRollingFileAppender extends RollingFileAppender {  
         @Override  
         public boolean isAsSevereAsThreshold(Priority priority) {  
             return this.getThreshold().equals(priority);  
         }  
    }

    次に、プロファイルでカスタムクラスを使用します.
    log4j.rootLogger=INFO,InfoFile3,errorFile3
    
    log4j.appender.InfoFile3 = com.dingcheng.log.MyRollingFileAppender
    log4j.appender.InfoFile3.File = logs/info3.log
    log4j.appender.InfoFile3.MaxFileSize = 10MB
    log4j.appender.InfoFile3.Threshold = INFO
    log4j.appender.InfoFile3.layout = org.apache.log4j.PatternLayout
    log4j.appender.InfoFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
    
    log4j.appender.errorFile3 = com.dingcheng.log.MyRollingFileAppender
    log4j.appender.errorFile3.File = logs/error3.log
    log4j.appender.errorFile3.MaxFileSize = 10MB
    log4j.appender.errorFile3.Threshold = ERROR
    log4j.appender.errorFile3.layout = org.apache.log4j.PatternLayout
    log4j.appender.errorFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

    これでいいです.
    もちろん、上記の3つの方法のほかに、異なるレベルで異なるファイルを指すクラスをカスタマイズする方法もあります.
    public class LogUtil{
        public static void error(String msg) {
            Logger.getLogger("error").error(msg);
        }
    }

    方法はたくさんあるから、一番簡単なものを探せばいい.
    最後に、次の必要なプロファイルを貼り付けます.1.プロジェクトinfoとerrorレベルのログはallInfoに別々に記録され、allErrorファイル2.Aモジュールのログはafileに単独で記録されます.3.Aモジュールのinfoレベルのログはafileにのみ記録され、allinfoには記録されません.4.Aモジュールのerrorレベルのログはafileに記録され、Erallrorに記録されます.
    #   ,     info  ,       allInfo,allError
    log4j.rootLogger=INFO,allInfo,allError  
    
    #  allInfo     ,   info  
    log4j.appender.allInfo = org.apache.log4j.RollingFileAppender
    log4j.appender.allInfo.File = /logs/allInfo.log
    log4j.appender.allInfo.MaxFileSize = 50MB
    log4j.appender.allInfo.Threshold = INFO
    log4j.appender.allInfo.layout = org.apache.log4j.PatternLayout
    log4j.appender.allInfo.layout.ConversionPattern =[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l]--> %m %x %n
    log4j.appender.allInfo.filter.F1=org.apache.log4j.varia.LevelRangeFilter
    log4j.appender.allInfo.filter.F1.LevelMin=INFO
    log4j.appender.allInfo.filter.F1.LevelMax=INFO
    
    #  allError     ,   error  
    log4j.appender.allError = org.apache.log4j.RollingFileAppender
    log4j.appender.allError.File = /data/wuliu-provider/logs/order-error.log
    log4j.appender.allError.MaxFileSize = 50MB
    log4j.appender.allError.Threshold = ERROR
    log4j.appender.allError.layout = org.apache.log4j.PatternLayout
    log4j.appender.allError.layout.ConversionPattern=[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l]--> %m %x %n
    
    #A      ,     INFO,      afile,allError ; additivity=false        
    log4j.logger.AMODULE=INFO,afile,allError
    log4j.additivity.AMODULE = false
    log4j.appender.afile = org.apache.log4j.RollingFileAppender
    log4j.appender.afile.File = /data/wuliu-provider/logs/YuanCheng.log
    log4j.appender.afile.MaxFileSize = 50MB
    log4j.appender.afile.Threshold = INFO
    log4j.appender.afile.layout = org.apache.log4j.PatternLayout
    log4j.appender.afile.layout.ConversionPattern =[%p] %d{yyyy-MM-dd HH\:mm\:ss} [%c]%m%n

    コードにAモジュールの個別出力を用いると、
    private static Logger logger = Logger.getLogger("AMODULE");//