Log 4 jを使用したプロジェクト構成ログ出力アプリケーションの詳細および例示的なプレゼンテーションの実装分析

13319 ワード

Log 4 jコンポーネント構成
Log 4 jは3つの重要なコンポーネントから構成されている.
1.ログ情報の優先度(Logger)
2.ログ情報の出力先(Appender)
3.ログ情報の出力フォーマット(Layout).
概要:
ログ情報の優先度は、高いものから低いものまでERROR、WARN、INFO、DEBUGがあり、それぞれこのログ情報の重要度を指定するために使用される.
ログ情報の出力先は、ログがコンソールに印刷されるかファイルに印刷されるかを指定します.
出力フォーマットはログ情報の表示内容を制御します.
Log 4 j紹介
Log 4 jはApacheのオープンソースプロジェクトであり、Log 4 jを使用することで、ログ情報の転送先がコンソール、ファイル、GUIコンポーネント、さらにはソケットサーバ、NTのイベントレコーダ、UNIX Syslogデーモンプロセスなどであることを制御することができる.また、各ログの出力フォーマットを制御することもでき、各ログ情報のレベルを定義することで、ログの生成プロセスをより細かく制御することができます.log 4 j--log for java(javaのログ).
Log 4 jダウンロードアドレス:http://logging.apache.org/log4j/2.x/download.html
Log 4 jプロファイルのフォーマット
Log 4 jは2種類のプロファイルフォーマットをサポートする:
1.XML形式のファイル
2.properties形式のファイル
プロファイルを全く使用せずに、コード内でLog 4 j環境を構成することもできます.ただし、プロファイルを使用すると、アプリケーションがより柔軟になります.
Log 4 j定義プロファイル
1.ルートLoggerの構成
構文は次のとおりです.
 
  
log4j.rootLogger = [ level ] , appenderName, appenderName, …

パラメータの説明:
levelはログ記録の優先度で、OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL、または定義したレベルに分けられます.
Off:すべてのログを閉じるための最高レベル
Fatal:重大なエラーイベントごとにアプリケーションが終了することを示します.
Error:エラーイベントが発生してもシステムの継続に影響しないことを示します.
Warn:潜在的なエラーが発生することを示します
Info:一般的に粗粒度レベルで使用され、アプリケーションの実行過程を強調します.
Debug:一般的には、太さレベルでは、アプリケーションの実行過程を強調します.
All:すべてのログを開くための最下位レベル.
Log 4 jは4つのレベルのみを使用することを推奨し、優先度が高いものから低いものまでERROR、WARN、INFO、DEBUGである.ここで定義したレベルでは、アプリケーション内の対応するレベルのログ情報のスイッチを制御できます.
appenderNameとは、ログ情報がどの場所に出力されるかを指し、複数の出力先を同時に指定できます.
2.ログ情報出力先Appenderの設定
構文は次のとおりです.
 
  
log4j.appender.appenderName = fully.qualified.name.of.appender.class  

log4j.appender.appenderName.option1 = value1  

...  

log4j.appender.appenderName.option = valueN


Log 4 jが提供するappenderには以下のものがあります.
  org.apache.log4j.ConsoleAppender(コンソール)
  org.apache.log4j.FileAppender(ファイル)
  org.apache.log4j.DailyRollingFileAppender(毎日1つのログファイルを生成)
  org.apache.log4j.RollingFileAppender(ファイルサイズが指定サイズに達したときに新しいファイルが生成されます)
  org.apache.log4j.WriterAppender(任意の指定された場所にログ情報をストリーム形式で送信)
 
3.ログ情報のフォーマット
構文:
 
  
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1 = value1 …

log4j.appender.appenderName.layout.option = valueN


Log 4 jが提供するlayoutには以下のものがあります.
  org.apache.log4j.HTML Layout(HTML表形式でレイアウト)、
  org.apache.log4j.PatternLayout(レイアウトモードを柔軟に指定できます)、
  org.apache.log4j.SimpleLayout(ログ情報のレベルと情報文字列を含む)
  org.apache.log4j.TTCCLayout(ログ生成時間、スレッド、カテゴリなどの情報を含む)
Log 4 JはC言語のprintf関数のような印刷形式でログ情報をフォーマットし、印刷パラメータは以下の通りである.
%m出力コードで指定したメッセージ
%p出力優先度、すなわちDEBUG,INFO,WARN,ERROR,FATAL
%r出力アプリケーション起動からlog情報出力までのミリ秒数
%cは属するクラスを出力し、通常はそのクラスのフルネームである.
%t出力ログイベントを生成するスレッド名
%nは折り返し改行を出力し、Windowsプラットフォームは「rn」、Unixプラットフォームは「n」
%dログ時刻の日付または時刻を出力します.デフォルトのフォーマットはISO 8601です.その後、フォーマットを指定することもできます.たとえば、%d{yyy MMM dd HH:mm:ss,SSS}、出力類似:2002年10月18日22:10:28921
%lは、クラス名、発生したスレッド、およびコード内のロー数を含むログイベントの発生場所を出力します.例:Testlog 4.main(TestLog4.java:10)
%x:現在のスレッドに関連付けられたNDC(ネスト診断環境)を出力し、特にjava servletsのようなマルチクライアントマルチスレッドのアプリケーションで使用します.
%%%:「%」文字%F:ログメッセージ生成時に存在するファイル名を出力
%L:出力コードの行番号
%m:コードに指定されたメッセージを出力し、生成されたログの詳細
%n:折り返し改行を出力します.Windowsプラットフォームは「r」、Unixプラットフォームは「」です.出力ログ情報改行は、%とモード文字の間に修飾子を付けて、その最小幅、最大幅、テキストの位置合わせを制御します.
次のようになります.
1)%20 c:出力categoryの名前を指定します.最小幅は20です.categoryの名前が20未満の場合、デフォルトでは右揃えになります.
2)%-20 c:出力categoryの名前を指定し、最小幅は20で、categoryの名前が20未満の場合、"-"番号は左揃えを指定します.
3)%.30 c:出力categoryの名前を指定します.最大幅は30です.categoryの名前が30より大きいと、左から多く出た文字が切り捨てられますが、30より小さいとスペースもありません.
4)%20.30 c:categoryの名前が20未満の場合はスペースを埋め、右揃えにします.名前が30文字より長い場合は、左から遠出した文字を切り取ります.
log4j.xmlの構成方法
 
  
View Code


            class="org.apache.log4j.RollingFileAppender">
       
       
       
       
       

   

   
       
       
   



コードにLog 4 jを使用
プログラムでLog 4 jを使用する前に、まずcommons-logging.JArとlogging-log 4 j-1.2.9.jarはclasspathにインポートするlog 4 j.propertiesはsrcルートディレクトリに配置されます.クラスでlog 4 jを用いる、まず静的変数Logger logger=Loggerを宣言する.getLog("classname").今すぐ使えます.
使い方:logger.debug(「debug message」)またはlogger.info("info message").
1.レコーダを得る
ログ4 jを使用すると、ログ情報の制御を担当するログレコーダを取得します.
構文は次のとおりです.
  public static Logger getLogger( String name)
指定した名前でレコーダを取得し、必要に応じてこの名前に新しいレコーダを作成します.Nameは一般的にこのクラスの名前を付けます.たとえば、次のようにします.
  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
 
2.プロファイルの読み込み
ログレコーダが取得されると、2番目のステップでは、次の構文でログ4 j環境を構成します.
  BasicConfigurator.configure():デフォルトのLog 4 j環境を自動的に高速に使用します.
  PropertyConfigurator.configure(String configFilename):Javaのプロパティファイルを使用して作成されたプロファイルを読み込みます.
  DOMConfigurator.configure(String filename):XML形式のプロファイルを読み込みます.
 
3.レコード情報の挿入(ログ情報のフォーマット)
前の2つの必要なステップが実行されると、異なる優先度のログ文を使用して、ログを記録したい場所に簡単に挿入できます.構文は次のとおりです.
   Logger.debug ( Object message ) ;
   Logger.info ( Object message ) ;
   Logger.warn ( Object message ) ;
   Logger.error ( Object message ) ; 
 
プログラムデモ
1.プログラムによるログ情報出力
 
  
package org.demo.log4j.dennisit;

 import java.io.IOException;

 import org.apache.commons.logging.impl.Log4JLogger;
 import org.apache.log4j.BasicConfigurator;
 import org.apache.log4j.FileAppender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.SimpleLayout;

 /**
  *
  *  @version : 1.1
  * 
  *  @author  :     メールを
  *   
  *  @since      : 1.0        :    2013-1-1        03:19:42
  *    
  *  @function:
  *
  */

 public class Log4jPrintByCode {

     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);

     private Layout layout = new SimpleLayout();
     private FileAppender fileAppender;

 
     // ,
     public Log4jPrintByCode(Layout layout, Level level,String distDir){

         BasicConfigurator.configure();        // , log4j.properties

         try {
             init(layout,level, distDir);
         } catch (Exception e) {
             e.printStackTrace();
         }

     }

    
     public void init(Layout layout, Level level,String distDir) throws Exception{

         logger.setLevel(level);                //
         fileAppender = new FileAppender(layout,distDir,false);
         logger.addAppender(fileAppender);    //

     }

    
     public static void main(String[] args) {

         SimpleLayout layout = new SimpleLayout();
         String logDir = "log4jcode.Log";
         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);

        
         //
         log4jCode.logger.info("log info print by log4j");
         log4jCode.logger.warn("log warn print by log4j");
         log4jCode.logger.error("log error print by log4j");

     }

 
     public Layout getLayout() {
         return layout;
     }

     public void setLayout(Layout layout) {
         this.layout = layout;
     }

     public FileAppender getFileAppender() {
         return fileAppender;
     }

     public void setFileAppender(FileAppender fileAppender) {
         this.fileAppender = fileAppender;
     }

    

 }

効率を高めるために、ログを書く前に判断を増やすことができます.
 
  
// debug
if (logger.isDebugEnabled()) {
    logger.debug("This is debug message from Dao.");
}

// info
if (logger.isInfoEnabled()) {
    logger.info("This is info message from Dao.");
}


J 2 EEのBaseDao、BaseAction、BaseServiceなどのベースクラスであれば、各階層のログ情報を分類して各ファイルに出力することができます.
2.Log 4 J同じログ情報を複数の宛先に出力
 
  
/* */
create database db_log4j;

/* */
use  db_log4j;

/* */
create table tb_log(
    logId int not null auto_increment comment ' ' ,
    createDate varchar(45) default null comment ' ' ,
    thread varchar(45) default null comment ' ',
    level varchar(45) default null comment ' ' ,
    class varchar(45) default null comment ' ',
    message varchar(245) default null comment ' ',
    primary key(logId)
);


アプリケーションインスタンスは、コンソール、ファイル、データベースにログ情報を同時に出力.
データベースとテーブルの作成
 
  
/* */
create database db_log4j;

/* */
use  db_log4j;

/* */
create table tb_log(
    logId int not null auto_increment comment ' ' ,
    createDate varchar(45) default null comment ' ' ,
    thread varchar(45) default null comment ' ',
    level varchar(45) default null comment ' ' ,
    class varchar(45) default null comment ' ',
    message varchar(245) default null comment ' ',
    primary key(logId)
);


プロファイルlog 4 j.properties
 
  
# 3
log4j.rootCategory=INFO,A1,A2,A3

# A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# A1
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n

# A2
log4j.appender.A2=org.apache.log4j.RollingFileAppender
# A2
log4j.appender.A2.File=./log/sysLog.log
# A2
log4j.appender.A2.MaxFileSize = 1KB
# A2
log4j.appender.A2.MaxBackupIndex = 3
# A2 PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
# A2
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

# A3
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
# A3 SQL
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')


Javaテストコード
 
  
package org.demo.log4j.dennisit;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 *  @version : 1.1
 * 
 *  @author  :     メールを
 *   
 *  @since      : 1.0        :    2013-1-1        04:13:59
 *    
 *  @function:
 *
 */

public class Log4jPrintByConfigure {

    private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);

    public static void main(String[] args) throws Exception {

        // log log4j.properties
        PropertyConfigurator.configure("configure/log4j.properties");// src configure

        // src , "bin/log4j.properties" "src/log4j.properties", bin

        //
        logger.debug("logger print DEBUG messgae");
        logger.info("logger print INFO message");
        logger.warn("logger print WARN message");
        logger.error("logger print ERROR message");
        logger.fatal("Here is FATAL message");
    }

}