Log4j를 사용하여 프로젝트 설정 로그 출력에 대한 응용 상세 설명 및 예시 구현 분석
Log4j는 다음과 같은 세 가지 중요한 구성 요소로 구성됩니다.
1. 로그 정보의 우선 순위(Logger)
2. 로그 정보의 출력 목적지(Appender)
3. 로그 정보의 출력 형식(Layout)입니다.
개요:
로그 정보의 우선순위는 높은 것부터 낮은 것까지 ERROR, WARN, INFO, DEBUG로 각각 이 로그 정보의 중요도를 지정하는 데 사용된다.
로그 정보의 출력 목적지는 로그가 컨트롤러에 인쇄될지 파일에 인쇄될지 지정합니다.
출력 형식은 로그 정보의 표시 내용을 제어합니다.
Log4j 소개
Log4j는 Apache의 오픈 소스 프로젝트입니다. Log4j를 사용하면 로그 정보 전송을 제어할 수 있는 목적지는 컨트롤러, 파일, GUI 구성 요소, 심지어 인터페이스 서버, NT의 이벤트 기록기, UNIX Syslog 수호 프로세스 등입니다.우리도 모든 로그의 출력 형식을 제어할 수 있으며, 모든 로그 정보의 단계를 정의함으로써 로그의 생성 과정을 더욱 세밀하게 제어할 수 있다.log4j--log for java(java의 로그).
Log4j 다운로드 주소:http://logging.apache.org/log4j/2.x/download.html
Log4j 프로필 형식
Log4j는 두 가지 구성 파일 형식을 지원합니다.
1. XML 형식의 파일
2.properties 형식의 파일
프로필을 전혀 사용하지 않고 코드에 Log4j 환경을 설정할 수도 있습니다.그러나 프로필을 사용하면 응용 프로그램을 더욱 유연하게 할 수 있습니다.
Log4j 정의 프로필
1. 루트 로거 구성
그 문법은:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
매개변수 설명:level은 로그 기록의 우선 순위로 OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL 또는 사용자가 정의한 단계로 나뉩니다.
Off: 모든 로깅을 닫는 데 사용되는 최고 레벨
Fatal: 모든 심각한 오류 이벤트가 프로그램을 종료할 수 있음을 나타냅니다.
Error: 오류 이벤트가 발생했지만 시스템이 계속 실행되는 데 영향을 주지 않습니다.
Warn: 잠재적인 오류가 발생할 수 있음을 나타냅니다.
Info: 일반적으로 어플리케이션의 전체 과정을 강조하는 굵은 입도 레벨에 사용됩니다.
Debug: 일반적으로 굵은 입도 수준에서 응용 프로그램의 전체 과정을 강조합니다.
All: 모든 로깅을 열 수 있는 최저 레벨입니다.
Log4j는 우선 순위가 높은 단계부터 낮은 단계까지 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
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에서 제공하는 layout은 다음과 같습니다.org.apache.log4j.HTMLLayout(HTML 테이블로 레이아웃),
org.apache.log4j.PatternLayout(배치 모드를 유연하게 지정할 수 있음),
org.apache.log4j.SimpleLayout(로그 정보의 수준 및 정보 문자열 포함),
org.apache.log4j.TTCCLayout(로그 생성 시간, 스레드, 카테고리 등 정보 포함)
Log4J는 C 언어의 printf 함수와 유사한 인쇄 형식으로 로그 정보를 포맷합니다. 인쇄 매개 변수는 다음과 같습니다.
% m 출력 코드에 지정된 메시지
%p 출력 우선 순위, 즉 DEBUG, INFO, WARN, ERROR, FATAL
%r 출력 응용 프로그램에서 로그 정보를 출력하는 데 소모되는 밀리초
% c 출력에 속하는 클래스, 통상적으로 해당 클래스의 전체 이름입니다.
% t 출력이 로그 이벤트를 생성하는 스레드 이름
%n은 Windows 플랫폼은 "rn", Unix 플랫폼은 "n"으로 리턴 문자를 내보냅니다.
% d 출력 로그 시간의 날짜나 시간, 기본 형식은 ISO8601이며, 그 다음에 형식을 지정할 수도 있습니다. 예를 들어%d {yyy MMM dd HH:mm:ss, SSS}, 출력 유사: 2002년 10월 18일 22:10:28921
% l 출력 로그 이벤트의 발생 위치, 클래스 이름, 발생한 루틴, 코드에 있는 줄 수를 포함합니다.예: Testlog4.main(TestLog4.java:10)
%x: 현재 라인과 연결된 NDC(끼워 넣은 진단 환경)를 출력합니다. 특히javaservlets와 같은 다중 고객 다중 라인의 응용에 사용됩니다.
%%:% 문자 출력%F: 로그 메시지가 생성될 때 파일 이름
%L: 출력 코드의 행 번호
%m: 출력 코드에 지정된 메시지, 로그 세부 정보
% n: 리턴 줄 바꿈 문자를 출력합니다. Windows 플랫폼은 "\r", 유닉스 플랫폼은 "출력 로그 정보 줄 바꿈은%와 패턴 문자 사이에 수식자를 붙여서 최소 너비, 최대 너비, 텍스트의 정렬 방식을 제어할 수 있습니다.
예:
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:[email protected]"> </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, Base Service 등이다. 그러면 우리는 각 층의 로그 정보를 분류하여 각 파일에 출력할 수 있다.2. Log4J는 같은 로그 정보를 여러 목적지로 출력합니다
/* */
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)
);
프로필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('%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 : <a href="mailto:[email protected]"> </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");
}
}