2013년 8월 8일 목요일

[오라클강좌,자바오라클]Log4J Jakarta의 오픈 소스 프로젝트

LOG4j 강좌 입니다.


Log4J 역시 Jakarta의 오픈 소스 프로젝트 입니다. 자바클래스 및 인터페이스로 이루어져 있는데 다양한 출력을 목적으로 만들어 졌습니다. C, C++, .NET등 에서도 변형해서 이용하고 있습니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  





Log4J의 특징 중 로거(logger)라는 개념이 있는데 각 logger들은 부모/자식의 계층 개념을 지원합니다.

예를 들면 com.oraclejava.strus 패키지의 모든 클래스를 위한 logger를 설정하고 com.oraclejava.struts.action 패키지의 모든 클래스에 대해 또 다른 logger를 설정 했다고 하면 앞의 logger가 상위 개념 즉 부모가 되는 것입니다. 이러한 계층 구조는 패키지 구조와 같은 기반에서 어떠한 로그 메시지를 전달할지 컨트롤하는데 유연성을 제공 합니다.

스트럿츠에서 Log4J를 사용하기 위해서는 WEB-INF/lib 아래에 Log4J의 JAR 파일을 설치 합니다. (http://logging.apache.org/site/binindex.html 에서 logging-log4j-1.2.9.zip 파일을다운 받습니다)

---------------------
로거(Logger)란
---------------------

Org.apache.log4j.Logger는 log4j에서 핵심 클래스 입니다. 대부분의 기능이 이 클래스에 의해 수행되며 만약 log4j를 struts와 함께 사용 한다면 log4j의 클래스와 인터페이스는 Commons 로깅 API에 은닉 됩니다.


---------------------
Log4j의 Appender
---------------------

Log4j를 사용하면 다양한 목적지에 로그 메시지를 전송 할 수 있습니다. Log4j 메시지의 목적지는 Appender로 간주하며 다음과 같은 Appender들이 있습니다.

• Console Appender
• File Appender
• Socket Appender
• Java Message Service (JMS) Appender
• NT Event Logger Appender
• Unix Syslog Appender
• Null Appender
• SMTP Appender
• Telnet Appender
• Asynchronous Appender

Log4j 프레임웍에서는 로깅 환경을 위해 Appender를 하나 이상 지원하며 다양한 조건에 기반한 메시지를 전송 할 수 있습니다.


-------------------------------
Log4j의 로그 레벨
-------------------------------

Log4j 메시지는 아래 5개의 레벨 중 하나에 해당 합니다.

• DEBUG
• INFO
• WARN
• ERROR
• FATAL

레벨을 debug로 사용 했다면 이전 버전의 ALL과 같은 의미이고 이전 버전에서의 OFF는 실제 의미가 없습니다. Appender를 사용하지 않게 설정하면 로그가 남지 않을 것 입니다.




------------------------------------------------------------
Log4j의 초기화(log4j.properties 파일을 이용한 초기화)
------------------------------------------------------------
초기화를 위한 첫번째 방법은 필요한 로깅 요소를 포함하는 log4j.properties 파일을 만들어 이를 통해 초기화 하는 것입니다. 아래 예는 INFO 레벨로 oef.apache.log4j.ConsoleAppender를 사용하여 콘솔에 메시지를 출력하는 설정 파일 입니다.
[Log4j.properties]

# A basic log4j configuration file that creates a single
console appender
# Create a single console appender that logs INFO and higher
log4j.rootLogger=INFO, stdout
# Configure the stdout appender to go to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# Configure the stdout appender to use the PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's filename and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

이 설정은 하나의 Appender 즉 System.out으로만 메시지를 출력하는 ConsoleAppender를 사용 합니다.

log4j.properties 파일은 WEB-INF/classes 폴더에 설치해야 하며 다중 애플리케이션 환경일 경우 각 애플리케이션 별로 log4j.properties를 설치 할 수 있습니다.

아래의 log4j.properties 파일은 메시지의 레벨과 다른 파라미터들을 기반으로 하여 여러 Appender에 로그 메시지를 기록하도록 설정 하는 예 입니다. 콘솔에도 출력하고 out.log 파일에도 메시지를 출력 합니다.

[Log4j.properties]

# A sample log4j configuration file
# Create two appenders, one called stdout and the other called rolling
log4j.rootLogger=DEBUG, stdout, rolling

# Configure the stdout appender to go to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# Configure the stdout appender to use the PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's filename and line number
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L)- %m%n

# Configure the rolling appender to be a RollingFileAppender
log4j.appender.rolling=org.apache.log4j.RollingFileAppender

# Configure the name of the logout for the rolling appender
log4j.appender.rolling.File=output.log

# Set up the maximum size of the rolling log file
log4j.appender.rolling.MaxFileSize=100KB

# Keep one backup file of the rolling appender
log4j.appender.rolling.MaxBackupIndex=1

# Configure the layout pattern and conversion pattern for the rolling appender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{ABSOLUTE} - %p %c - %m%n


------------------------------------------------------------
Log4j의 초기화(XML 파일을 이용한 초기화)
------------------------------------------------------------

Log4j.properties 처럼 XML 파일 역시 WEB-INF/classes 폴더에 위치하면 됩니다. 그리고 파일이름은 반드시 log4j.configuration 시스템 프로퍼티에 지정하여 어떤 파일을 로딩 할것인지를 알게 해야 합니다.

Log4j.configuration 파일에서 프로퍼티를 설정 하는 방법은 다음과 같습니다.

set CATALINA_OPTS=-Dlog4j.configuration=log4j.xml

또는 자바 명령행에서 지정하는 것도 가능 합니다.

java -Dlog4j.configuration=log4j.xml


[log4j.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="stdout"
class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p [%t] (%F:%L)- %m%n"/>
</layout>
</appender>
<root>
<priority value ="INFO" />
<appender-ref ref="stdout" />
</root>
</log4j:configuration>


참고로 log4j.xml 파일의 위치를 /WEB-INF/class 에서 상대적으로 지정하지 않고 파일 시스템의 절대 경로를 사용 하기 위해서는 다음과 같이 합니다.

java -Dlog4j.configuration=file:/c:/dev/env/log4j.xml

--------------------------
JSP에서 log4j 이용 하기
--------------------------

JSP 파일 내에서 처리 방법

1. Import the Commons Log and LogFactory classes.
2. Define and initialize a logger variable for the page.
3. Start logging.


[작업 순서]
1.        log4j용 jar 파일 확인(http://logging.apache.org/site/binindex.html 에서 다운받은 압축 파일을 풀면 dist/lib에 log4j-1.2.9.jar 파일이 있는데 이 파일을 /WEB-INF/lib에 복사)
2.        /WEB-INF/classes 에 commons-logging.properties 파일 생성

org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger

3.        /WEB-INF/classes 에 log4j.properties 파일 생성

# A sample log4j configuration file
# Create two appenders, one called stdout and the other called rolling
log4j.rootLogger=DEBUG, stdout, rolling

# Configure the stdout appender to go to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# Configure the stdout appender to use the PatternLayout
# atternLayout은 많은 양의 정보를 기록 하지만 SimpleLayout을 이용하면 적은양이 기록됩니다.
# log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

# Pattern to output the caller's filename and line number
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L)- %m%n

# rolling appender에 RollingFileAppender를 설정
log4j.appender.rolling=org.apache.log4j.RollingFileAppender

# rolling appender를 위한 파일 이름 설정, 이클립스를 사용한다면 기본적으로  eclise 폴더에 만들어 짐
# log4j.appender.rolling.File=output.log
log4j.appender.rolling.File=d:\output.log

# Set up the maximum size of the rolling log file
log4j.appender.rolling.MaxFileSize=100KB

# Keep one backup file of the rolling appender, output.log.1 이라는 파일이 더 만들어 짐
log4j.appender.rolling.MaxBackupIndex=1

# Configure the layout pattern and conversion pattern for the rolling appender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{ABSOLUTE} - %p %c - %m%n

4.        log4j.jsp 작성

<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
<%-- Get a reference to the logger for this class --%>
<% Log logger = LogFactory.getLog( this.getClass( ) ); %>
<% logger.debug( "This is a debug message from a jsp" ); %>
<html>
<head>
<title>Using Commons Logging in a JSP page</title>
</head>
<body>
<% logger.info( "This is another log message in the jsp" );
%>
There should be two log messages in the log file.
</body>
</html>

5.        실행 후 로그


----------------------------------
태그 라이브러리를 이용한 로깅
----------------------------------

http://jakarta.apache.org/taglibs/doc/log-doc/intro.html,또는http://cvs.apache.org/builds/jakarta-taglibs/nightly/projects/log/ 에 가면 log4j 관련 태그라이브러리를 다운 받을 수 있습니다.

jakarta-taglibs-log-20050120.zip 파일을 다운 받아 압축을 풀면 taglibs-log.jar, taglibs-log.zip 파일이 있는데 jar 파일은 /WEB-INF/lib에 tld 파일은 /WEB-INF/ 폴더에 위치 시킵니다.


<%@ taglib uri="/WEB-INF/taglibs-log.tld" prefix="logger" %>
<logger:debug message="This is a debug message from a jsp using the Log tag" />
<html>
<head>
<title>Using the Log Tag in a JSP page</title>
</head>
<body>
<logger:info message="This is another message using the log4j tag" />
There should be two log messages in the log4j log file.
</body>
</html>

[결과]
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet - JspEngine --> /log4j2.jsp
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet -              ServletPath: /log4j2.jsp
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet -                PathInfo: null
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet -                RealPath: D:\Tomcat-Project\Login\log4j2.jsp
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet -              RequestURI: /Login/log4j2.jsp
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet -              QueryString: null
11:25:28,421 - DEBUG org.apache.jasper.servlet.JspServlet -          Request Params: 
11:25:28,491 - DEBUG  - This is a debug message from a jsp using the Log tag
11:25:28,501 - INFO  - This is another message using the log4j tag


로깅에 영향을 미치는 요소는 어떤 정보를 어떤 형식으로 기록 할 것인가? 입니다. Log4j에서는 출력 형식을 지정하기 위해 org.apache.log4j.Layout을 사용 합니다. SimpleLayout이 적은 비용이 들며 PatternLayout은 많은 비용이 들 수 있습니다.  

댓글 없음:

댓글 쓰기