▶LOG4J시작하기
Log4j에 대하여 알아보자.
먼저 Log4j를 사용하기 위해 우선 해당 jar파일이 라이브러리에 등록이 되어있어야한다.
현재 우리 프로젝트에서는 Log4j의 1.2.14 버젼을 사용하고있다.
jar는 등록되어있으니 Source파일을 찾아서 연결을 먼저 한다.(우리는 Log4j오픈소스를 기반으로 기능을 추가 하기위함이다.)
여기서 오픈소스르 받았다 버전은 1.2.14로 받아서 등록해주었다.
이제 준비는 끝났다.
간단히 Log4j의 구조에 대해서 살펴보자.
1.LOG4J의 분류
Log4j는 일반적을 3단계 분류로 나눌수 있다.
1. Logger : 로그의 주체 (로그 파일을 작성하는 클래스)
- Log4j의 심장부에 위치하며, 개발자가 로그출력 여부를 런타임에 조정되도록 해준다.
로거는 로그레벨을 가지고 있으며, 로그의 출력여부는 로그문의 레벨과 로거의 레벨을 가지고 결정된다.
- 어플리케이션을 작성하기전 어떤 로거를 사용해야 할지 정해야 한다.
ex) static Logger logger = Logger.getLogger(SimpleLog.class);
2. Appender : 로그를 출력하는 위치
- 로그를 출력하는 위치를 의미하며,
Log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력위치를 어느정도 짐작할 수 있다.
http://logging.apache.org/log4j/docs/api/index.html
3. Layout : Appender의 출력포맷
- 일자, 시간, 클래스명등 여러가지 정보를 선택하여 로그정보내용으로 지정할 수 있다.
자세한 패턴은 아래의 클래스정보를 살펴보면 알수있다.
http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html
※ Layout의 종류
1) DateLayout,
2) HTMLLayout,
3) PatternLayout, ( 일반적으로 PatternLayout을 사용하는 것이 디버깅에 가장 적합함 )
4) SimpleLayout,
5) XMLLayout
2.LOG4J의 설정법
1.프로그램으로 처리하는 방법
2.XML로 처리하는 방법
3.Properties파일을 사용하는방법
기본적으로 Log4J는 별도의 설정없이 Properties 파일을 Default로 읽어 드리기때문에
Properties파일을 가지고 설정을 해주는 것이 일반적이다.
우리는 Properties파일을 사용한 설정법만 사용해보겠다.
먼저 log4j.properties파일을 생성한다.생성후 WEB-INF의 conf에 넣어준다.
*log4j.properties설정
log4j.rootLogger=DEBUG, sysout, logfile
log4j.logger.org.apache=WARN
log4j.appender.sysout=org.apache.log4j.ConsoleAppender
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender |
일반적인 설정을 가지고 설명하도록 하겠다.
위에서 설명한듯이 Log4j는 Logger에 Appender를 추가하고 그 Appender에 Pattern을 정의해서 사용하는 방식이다.
이 Properties파일의 값으로 설정이 셋팅 되는 이유는 Log4j에서 해당 Properties파일을 읽어드릴수 있도록
Class가 제공되고있기 때문에 속성값을 읽어드려 설정할수있는것이다.
(org.apache.log4j.PropertyConfigurator 에 log4j.rootLogger 및 다른 설정라인을 읽어드릴수있게 정의되어있다.)
우선 RootLogger의 레벨과 Appender형식을 지정하여준다.
1)RootLogger의 Level
- Debug < Info < Warn < Error < Fatal 순으로 Level이 나뉘고
RootLogger에서 지정한Level밑으로는 Log정보가 출력되지않는다.
ex) log4j.rootLogger = WARN --properties파일설정
log.debug("Hello Log4j"); --java Class입력
위 예제의 경우 Level설정이 Warn으로 지정되었기때문에 그하위 Level인 debug와 Info는 출력되지 않는다.
Appender형식은 RootLogger에서 선언만 해주고 하위 속성에 내용을 지정해준다.(Appender설정법에서 다시 설명)
위 설정에서 RootLogger밑에 log4j.logger.org.apache=WARN, log4j.logger.org.springframework=WARN의 설정이 있다.
apache와 springframework에서 발생하는 Log정보는 Warn이상의 Level만 출력하겠다는 의미이다.
2)Appender설정
- Appender는 여러종류가 있지만 일반적을 가장많이 사용하는 Appender를 설정하겠다.
- RootLogger에서 지정한 sysout, logfile을 선언하였다.
sysout = 콘솔로 사용할 Appender선언
logfile = 파일로 사용할 Appender선언
* log4j.appender.sysout = org.apache.log4j.ConsoleAppender
//콘솔 Appender를 사용하기위해 Class지정
* log4j.appender.logfile = org.apache.log4j.DailyRollingFileAppender
//일자별 파일기록 Appender를 사용하기위해 Class지정
Appender파일은 대부분 Class가 *Appender형식으로 구분되어있어 해당Appender를 사용자가 변경하려면 해당Appender를
상속받아서 작업을 진행하면 될것같다.
ConsoleAppender는 설정해 줄것이 없지만 DailyRollingFileAppender는 파일로 기록하기 때문에 몇가지 설정을 추가해준다.
* log4j.appender.logfile.File = ${tahoe.root}WEB-INF\\log\\tahoe-log.log
* log4j.appender.logfile.DatePattern = '.'yyyy-MM-dd
우선 File이라는 속성값을 사용하여 Log파일이 저장도리 경로를 지정해 준다.
그리고 DatePattern을 사용하여 Log파일의 날짜별 Log파일을 생성하기 위한 옵션을 추가해준다.
그렇게 되면 DatePattern별로 Log파일이 기록된다.
3) Layout
- 마지막 설정인 Pattern이다.
위의 설정을 참고하면 PatternLayout은 Class지정이 같다.
Log4j가 Part별로 Class를 효율적으로 나누지 않았을까하는 생각이다.
기본적인 Debug를 위한 가장 효율적인 Pattern은 PatternLayout이라는 Layout을 사용한다.
(org.apache.log4j.PatternLayout 을 지정하면된다.)
위설정은 우리의 PatternLayout을 사용하기 위해서 새로운 Class를 생성하여 지정해주었다.
* log4j.appender.sysout.layout = tahoe.lm.manager.THPatternLayout
//Tahoe의 패턴을 사용하기 위해 Class지정
* log4j.appender.sysout.layout.ConversionPattern = [%d{yyyy:mm:dd hh:mm:ss}][%p][%c] - %m%n
//다음과같은 Pattern을 사용하겠다고 정의함.
기본 Pattern의 기능 정리(자세한 사항은 API를 참조)
------------------------------------------------------------------------------------------------------------
C : 클래스명을 출력한다. {1}과 같은 설정을 추가하여 클래스 이름 또는 특정 패키지 이상만 출력하도록 설정할 수 있다.
d : 로그 시간을 출력한다. java.text.SimpleDateFormat에서 적절한 출력 포맷을 지정할 수 있다.
F : 파일 이름을 출력한다. 로그시 수행한 메소드, 라인번호가 함께 출력된다.
L : 라인 번호만 출력한다.
m : 로그로 전달된 메시지를 출력한다.
M : 로그를 수행한 메소드명을 출력한다.
n : 줄 바꿈
p : 로그 이벤트명 (DEBUG등)
r : 로그 처리시간 (milliseconds)
--------------------------------------------------------------------------------------------------------------------이로서 설정을 완료할수있다.
3.Class 사용하여 Pattern을 추가
Log4j를 사용하기 위해 우리는 차후에 기본 Pattern이 아닌 우리가 지정한 새로운 Pattern을 정의하기 위해 새로운 Pattern Class를
생성하였다. PatternLayout,PatternPaser,PatternConverter,FormatInfo Class가 연관 되어있지만 실질적인 Pattern옵션을 가지고있는Class는 PatternPaser이다.
구조를 먼저 파악하고보니 PatternLayout Class에서 public PatternPaser createPatternParser(String pattern) 을
사용하여 PatternPaser를 생성하여 사용하기때문에 PatternLayout을 먼저 THPatternLayout으로 상속받아서 구현한다.
THPatternLayout.java
package tahoe.lm.manager; import org.apache.log4j.PatternLayout;
private String pattern; public THPatternLayout() public THPatternLayout(String pattern) |
이제 THPatternPaser를 생성해야 한다.
THPatternPaser에서 옵션을 찾아서 Converting하는 함수는 protected void finalizeConverter(char c) 를 사용하여
정보를 찾는다. 다음처럼 상속받은 THPatternPaser를 구현한다.
THPatternPaser.java
package tahoe.lm.manager; import org.apache.log4j.helpers.FormattingInfo;
public class THPatternPaser extends PatternParser
public THPatternPaser(String pattern)
//옵션의 값을 case조건에 추가한후 이벤트를 작성한다. public void finalizeConverter(char formatChar)
//Type을 이용하여 event의 구분을 나누어 구현하는 부분실질적으로 Conerting을 구현한다. private static class ThPatternConversion extends PatternConverter public String convert(LoggingEvent event)
|
위와같이 %s 와 %a를 추가하여 내용을 구현하였다.
그런후에 위에서 지정한바와 같이 layout에 PatternLayout Class를 지정해 준후 방금 추가한 옵션을 사용하여 Log를 출력해
보았다.
%s : "tahoe"라는 메세지를 출력한다.
%a : log출력시 시작시간과 종료시간을 계산한 값을 return해준다.
다음과 같은 로그정보를 얻을수 있었다.
[2010:54:08 04:54:23][DEBUG][tahoe.lm.manager.THPatternPaser] [Tahoe] [0]-Test!!
계산시간이 0인 이유는 System.currentTimeMillis();가 ms단위이기때문에 system상에서 문자출력하는데 걸리는 시간은
0.00001초도 안되서 처리 될것이다. 만약 수치를 확인하고 싶다면 nanoTime()함수를 사용하여 체크해보면 값이 나올것이다.
위의 예제는 Pattern의 옵션을 추가로 정의해서 사용하기 위한 예제이다.
위처럼 작성할 경우 사용자가 지정한 옵션으로 구현한 Pattern Format을 얻을수 있을 것이다.
'Other' 카테고리의 다른 글
반응형 웹 (0) | 2014.02.19 |
---|---|
log4j 설명 (0) | 2012.02.29 |
플랙스(Flex) PHP+MySQL과 연동하기(MySQL데이터 꺼내오기-HTTPService) (0) | 2012.02.28 |
플랙스(Flex) PHP+MySQL과 연동하기(DB저장-HTTPService) (0) | 2012.02.28 |
플렉스 서로다른 네비게이터 접근방법(권한) (0) | 2012.02.28 |