>  기사  >  Java  >  Log4j를 사용하여 프로젝트에 대한 로그 출력 애플리케이션 세부 정보 및 샘플 데모 구현 분석을 구성합니다.

Log4j를 사용하여 프로젝트에 대한 로그 출력 애플리케이션 세부 정보 및 샘플 데모 구현 분석을 구성합니다.

高洛峰
高洛峰원래의
2017-01-18 13:12:391276검색

Log4j 컴포넌트 구성

Log4j는 세 가지 중요한 컴포넌트로 구성됩니다.

1. 로그 정보의 우선 순위(Logger)

2. 로그 정보 출력 목적 )

3. 로그 정보의 출력 형식(레이아웃)입니다.

요약:

로그 정보의 우선 순위는 ERROR, WARN, INFO, DEBUG이며 각각 이 로그 정보의 중요도를 지정하는 데 사용됩니다.

로그 정보의 출력 대상은 로그가 콘솔에 인쇄될 것인지 파일에 인쇄될 것인지를 지정하며

출력 형식은 로그 정보의 표시 내용을 제어합니다.

Log4j 소개

Log4j는 Apache의 오픈 소스 프로젝트입니다. Log4j를 사용하면 콘솔, 파일, GUI 구성 요소, 심지어 소켓까지 로그 정보가 전송되는 대상을 제어할 수 있습니다. 서버, NT 이벤트 레코더, UNIX Syslog 데몬 등 각 로그의 출력 형식을 제어할 수도 있으며, 각 로그 정보의 수준을 정의하여 로그 생성 프로세스를 보다 세부적으로 제어할 수 있습니다. log4j-- Java 로그(java 로그) .

Log4j 다운로드 주소: http://logging.apache.org/log4j/2.x/download.html

Log4j 구성 파일

Log4j는 두 가지 구성 파일 형식을 지원합니다.

1. XML 형식 파일

2. 속성 형식 파일

도 완전히 사용할 수 있습니다. 대신 구성 파일을 사용하여 코드에서 Log4j 환경을 구성하세요. 그러나 구성 파일을 사용하면 애플리케이션이 더욱 유연해집니다.

Log4j 정의 구성 파일

1. 루트 로거 구성

구문:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

매개변수 설명:

수준 로그 기록의 우선 순위는 OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL 또는 사용자가 정의한 수준으로 구분됩니다.

끄기: 모든 로깅을 끄는 데 사용되는 가장 높은 수준

치명: 각 심각한 오류 이벤트로 인해 애플리케이션이 종료됨을 나타냅니다.

오류: 오류 이벤트가 발생하더라도 여전히 시스템의 지속적인 작동에 영향을 미치지 않음을 나타냅니다.

경고: 잠재적인 오류 상황이 발생할 것임을 나타냅니다

정보: 일반적으로 대략적인 수준에서 사용되며 애플리케이션의 전체 실행 프로세스를 강조합니다

디버그: 일반적 대략적인 수준에서 사용되며 애플리케이션의 전체 실행 프로세스를 강조합니다.

모두: 가장 낮은 수준으로 모든 로깅을 켜는 데 사용됩니다.

Log4j에서는 높은 수준부터 낮은 수준까지 ERROR, WARN, INFO 및 DEBUG의 4가지 수준만 사용할 것을 권장합니다. 여기에 정의된 수준을 통해 애플리케이션에서 해당 로그 정보 수준의 설정 및 해제를 제어할 수 있습니다.

appenderName은 로그 정보가 출력되는 위치를 나타내며 동시에 여러 출력 대상을 지정할 수 있습니다.

2. 로그 정보 출력 대상 Appender를 구성합니다.

구문은

log4j.appender.appenderName = fully.qualified.name.of.appender.class  
log4j.appender.appenderName.option1 = value1  
...  
log4j.appender.appenderName.option = valueN

Log4j에서 제공하는 Appender는 다음과 같습니다.

 org.apache .log4j.ConsoleAppender(콘솔)

org.apache.log4j.FileAppender(파일)

org.apache.log4j.DailyRollingFileAppender(매일 로그 파일 생성)

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

Log4j에서 제공하는 레이아웃은 다음과 같습니다.


org.apache.log4j.HTMLLayout(HTML 테이블 형식의 레이아웃),

org.apache.log4j.PatternLayout(레이아웃 모드를 유연하게 지정할 수 있음),

org.apache.log4j.SimpleLayout(로그 정보의 수준 및 정보 문자열 포함),

org.apache.log4j.TTCCLayout(로그 생성 시간, 스레드, 카테고리 등 포함)

Log4J는 C 언어의 printf 함수와 유사한 인쇄 형식을 사용하여 로그 정보의 형식을 지정합니다.

%m은

%p INFO, WARN, ERROR, FATAL 우선 순위를 출력합니다.

%r 애플리케이션 시작부터 로그 정보 출력까지 걸린 시간을 밀리초 단위로 출력합니다.

%c 출력이 속하는 카테고리, 일반적으로 클래스의 전체 이름

%t 로그 이벤트를 생성한 스레드 이름 출력

%n 캐리지 리턴 및 줄 바꿈 문자 출력 , Windows 플랫폼의 경우 "rn", Unix 플랫폼의 경우 "n"

% d 로그 시점의 날짜 또는 시간을 출력합니다. 기본 형식은 ISO8601입니다. 다음과 같이 형식을 지정할 수도 있습니다. %d{yyy MMM dd HH:mm:ss,SSS}. October 18, 2002 22 :10:28,921  

%l 카테고리 이름을 포함하여 로그 이벤트가 발생한 위치를 출력합니다. , 발생한 스레드 및 코드의 줄 수입니다. 예: Testlog4.main(TestLog4.java:10)

%x: 특히 Java 서블릿 중간과 같은 다중 클라이언트 및 다중 스레드 애플리케이션의 경우 현재 스레드와 관련된 NDC(중첩 진단 환경)를 출력합니다.

%%: "%" 문자 출력 %F: 로그 메시지가 생성된 파일 이름 출력

%L: 코드의 줄 번호 출력

%m : 코드에 지정된 메시지와 생성된 특정 로그 정보를 출력합니다.

%n: 캐리지 리턴 및 줄 바꿈을 출력합니다. Windows 플랫폼에서는 "rn"이고 Unix에서는 "n"입니다. 플랫폼 출력 로그 정보의 줄 바꿈은 최소 너비, 최대 너비 및 텍스트 정렬을 제어하기 위해 패턴 문자 사이의 %와 추가 수정자 사이에 있을 수 있습니다.

如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

log4j.xml的配置方式

View Code
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="appender1"
        class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logfile08.html" />
        <param name="MaxFileSize" value="1MB" />
        <param name="MaxBackupIndex" value="5" />
        <layout class="org.apache.log4j.HTMLLayout">
        </layout>
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="appender1" />
    </root>
</log4j:configuration>

代码中使用Log4j


  在程序中使用 Log4j之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将 log4j.properties放于src根目录中。 在类中使用log4j,首先声明一个静态变量 Logger logger=Logger.getLog("classname").现在就可以使用了。

用法如下:logger.debug("debug message")或者logger.info("info message").

1.得到记录器 

  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。

其语法为:

  public static Logger getLogger( String name)

  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

 

2.读取配置文件 

  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

  BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。

  PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。

  DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

 

3.插入记录信息(格式化日志信息) 

  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,语法如下:

   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  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
  *    
  *  @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.");
}

如果这个类作为基类,如J2EE中的BaseDao、BaseAction、BaseService等等,则我们可以将各层的日志信息分类输出到各个文件。

2.Log4J将同一个日志信息输出到多个目的地

/* 创建数据库 */ 
create database db_log4j;
/* 切换数据库 */
use  db_log4j;
/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment &#39;流水号&#39; ,
    createDate varchar(45) default null comment &#39;日志生成时间&#39; ,
    thread varchar(45) default null comment &#39;当前线程&#39;,
    level varchar(45) default null comment &#39;当前日志级别&#39; ,
    class varchar(45) default null comment &#39;生成日志的类&#39;,
    message varchar(245) default null comment &#39;日志具体信息&#39;,
    primary key(logId)
);

应用实例将日志信息同时输出到控制台,文件和数据库中.

创建数据库与 表

/* 创建数据库 */ 
create database db_log4j;
/* 切换数据库 */
use  db_log4j;
/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment &#39;流水号&#39; ,
    createDate varchar(45) default null comment &#39;日志生成时间&#39; ,
    thread varchar(45) default null comment &#39;当前线程&#39;,
    level varchar(45) default null comment &#39;当前日志级别&#39; ,
    class varchar(45) default null comment &#39;生成日志的类&#39;,
    message varchar(245) default null comment &#39;日志具体信息&#39;,
    primary key(logId)
);

配置文件log4j.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(&#39;%d&#39;,&#39;%t&#39;,&#39;%-5p&#39;,&#39;%c&#39;,&#39;%m&#39;)

Java测试代码

package org.demo.log4j.dennisit;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
 *
 *  @version : 1.1
 *  
 *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
 *    
 *  @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");
    }
}

更多使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.