'Java/Log4j'에 해당되는 글 1건

  1. 2008.07.14 Log4J and Java Util Logging ( Java Devleoper's Journal 200503 )
2008.07.14 14:52
이 글은 Java Developer's Journal 2005 03의 Log4J and Java Util Logging을 대강 해석한 글입니다. 대강대강, 정반대의 의미로 써놓았을 수도......
저자 : Joe McNamara ( jem@quantumleap.us )

Log4j 에 대한 소개
     Log4J 는 Apache Software Foundation 의 Logging Services Project의 하위 프로젝트로 개발되었습니다. 1990년 대에 IBM에서 개발된 logging library에 기초하여 만들어졌으며, 1999년에 첫 버전이 발표되었습니다. JBoss와 Hibernate를 비롯한 오픈 소스 프로젝트에서 폭넓게 사용되고 있습니다.
     Log4j 는 loggers, appenders, layouts 의 세가지 주 concept으로 이루어집니다. 이 세 가지 concept 는 개발자가 type과 중요도 따라 기록할 수 있도록 해주며, message를 어디서 마치고 어떻게 나타내져야 하는지를 정할 수 있도록 해줍니다.
     Logger 들은 애플리케이션이 로깅 작업을 초기화하기 위해 처음 호출하는 객체입니다. 기록해야 할 메시지가 주어졌을 때, Logger 들은 주어진 메시지를 포장하기 위한 Logging-Event 객체를 생성합니다. Logger에서 생성한 Logging-Event 들은 연결된 Appenders 에 넘겨지고, Appender  들은 LoggingEvents 에 포함된 정보를 특정한 목적지에 보냅니다. 예를 들어 ConsoleAppender는 System.out에 정보를 쓰며, FileAppender는 log file 에 정보를 기록합니다. LoggingEvent 정보가 최종적으로 출력 목적지에 보내지기 전에, 어떤 appender는 layout을 사용하여 정보를 원하는 형태로 가공할 수 있습니다. Log4j 는 XMLLayout class를 포함하고 있는데, XML 문자열의 형태로 바꾸기 위해 사용될 수 있습니다.
    LoggingEvents 는 중요도를 나타내는 level 이 지정됩니다. Log4j의 default level은 중요도가 높은 것부터, OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL 이 있습니다. 각각의 Logger와 Appender 에는 level이 지정되는데, 지정된 level보다 우선순위가 같거나 높은 기록 요청만을 수행할 수 있습니다. 예를 들어 어떤 appender의 level이 ERROR인데, WARN level의 LoggingEVent 가 요청되었다면, 이 요청을 받아들여지지 않고, 메시지가 기록되지 않습니다.
     모든 Logger 는 이름을 갖고 있습니다. Java language에서 package가 구성되는 것과 같은 방식으로 logger 들을 이름을 이용하여 트리 구조로 구성합니다. Log4j의 문서에서는 다음과 같이 설명하고 있습니다. "A logger is said to be an ancestor of another logger if its name followed by a dot is a prefix of the descendant logger name. A logger is said to be a parent of a child logger if there are no ancestors between itself and the descendant logger." logger에 명시적으로 level을 지정하지 않은 다면, 가장 가까운 조상 logger의 level의 level로 자동으로 지정됩니다. Logger는 또한 조상으로부터 appender도 상속받습니다. 하지만 직접 해당 logger에 설정된 appender만 사용하도록 할 수 도 있습니다.
     Logger 가 message를 기록하도록 요청받으면, level이 해당 logger에 설정된 level 보다 종요도가 높은지 먼저 확인한 다음, 주어진 messege로부터 LoggingEvent를 생성하고, 목적 output으로 보내집니다.

JUL( Java Util Logger ) 에 대한 소개
     Sun 이 2002년 Java SDK 1.4 버전과 함께 소개한 java.util.logging package는 JSR47, Logging API Specification 의 결과로 나온 것입니다. JUL은 Log4j와 매우 유사하여, 거의 같은 개념들을 사용하고 있으며, 몇몇은 바뀐 이름으로 사용됩니다. appenders 는 handeler로, layouts는 formatter로 사용되며, LoggingEvents는 LogRecords로 사용됩니다. 다음 표는 Log4J와 JUL의 이름과 개념들을 요약한 것입니다.
사용자 삽입 이미지

Functionality Differences
     기능적인 다른 점은 다음과 같이 요약할 수 있습니다. "JUL이 할 수 있는 것, 그 이상을 Log4j는 할 수 있습니다.". JUL과 Log4j 는 쓸만한 appender/handler의 구현과 쓸만한 formatter/layout 의 구현, 설정의 유연성에서 큰 차이를 보이고 있습니다.
     JUL에서는 네 개의 handler 구현을 해놓았습니다. 그리고 Log4j에서는 12개 이상의 appender 가 구현되어 있습니다. JUL 의 handler는 buffer, console, socket, file 등에 기록할 수 있어, 기본적인 기록 수단으로 적당합니다. Log4j의 appender는 당신이 생각할 수 있는 모든 방법으로 기록할 수 있습니다. NT event log와 Unix syslog, 그리고 심시어 e-mail로도 기록할 수 있습니다. 다음 표는 JUL과 Log4j의 appender 에 대한 요약입니다.
사용자 삽입 이미지

     JUL은 XMLFormatter와 SimpleFormatter 두 개의 formatter 클래스를 갖고 있습니다. Log4j는 XMLFormatter와 SimpleFormatter를 포함하여 좀더 풍부한 내용을 포함할 수 있도록 LoggingEvents를 형식화하는 TTCCLayout 을 제공하며, HTML table로 작성할 수 있도록 HTMLLayout도 제공하고 있습니다.
     TTCCLayout 과 HTMLLayout 도 매우 유용하지만 Log4j가 formatter/handler 사용에 있어서 더 좋은 점은 바로 PatternLayout 때문입니다. PatternLayout을 이용하면 마치 C언어의 printf 함수를 사용하여 패턴을 변환하는 것처럼 다양하게 설정할 수 있습니다. PatternLayout 에서는 message를 기록하게 한 thread 는 "%t" 를 이용할 수 있으며, message를 기록하게 한 class의 이름은 "%C" 를 이용할 수 있습니다. "%m"은 해당 message를 의미합니다. "%t:%m" 은 "main thread:This is my message."  과 같이 나타날 것이며, "%C-%t:%m"  은 결과로 "org.nrdc.MyClass - main thread: This is message." 와 같이 나타날 것입니다. PatternLayout 은 아주 유용하고, JTL's 의 두 가지 formatter classs 로는 이러한 융통성을 발휘하기 힘듭니다. log4j user는 일반적으로 PatterLayout conversion patterns 를 익히는 것이 필요하지만, 일반적으로 JUL 유저들은 직접 formatter class를 작성하지는 않습니다.
     Log4j 와 JUL 모두 configuration file로 설정을 할 수 있지만, Log4j 에서는 더 다양한 것들을 설정할 수 있도록 해줍니다. JUL은 .properties 파일을 이용해 설정을 저장하는데, J2SE 5.0까지는 handler의 설정을 instance 별로는 할 수 없었고, class별로만 가능했습니다. 만약 당신이 pre-Tiger SDK( Tiger는 J2SE SDK 5.0 의 code name 입니다) 를 사용하려 한다면, 서로 다른 FileHandler instances 들이 서로 다른 파일에 출력하다록 하는 등의 유용한 설정 옵션을 할 수 없게 될 것 입니다.
     한가지 중요한 점은 pre-Tiger JUL은 코드 안에서 여러 출력 파일로 쓰도록 코드 안에서 수정해야 하며, 기본적인 설정 메커니즘으로는 할 수 없다는 것입니다. Log4j 는 .properties 파일 또는 XML 파일, 또는 그 둘 모두를 이용해서 설정을 저장할 수 있고, appender는 instance 별로 설정을 할 수 있습니다. 또한 Log4j는 layout instances 를 appender instance와 연결시킬 수 있도록 하고 있으며, instance 별로 layout을 설정할 수 있도록 합니다. 이는 PatternLayout instance를 포함하여 conversion pattern을 각 configuration 파일 안에서 설정할 수 있습니다. 개발 도중에 log 기록 설정을 바꾸기 위해 재컴파일 할 필요가 없으며, 배포 후에도 재컴파일을 할 필요없이 로그 기록 설정을 바꾸어주면 됩니다.  Log4j 는 특별이 pre-Tiger 보다 더 많은 융통성을 제공합니다.

Which Library Do You Choose?
     다음과 같은 질문을 통해서 결정을 할 수 있습니다.

Question One
     SMTPHandler, NTEventLogHandler, 또는 아주 편리한 FileHandler와 같은 JUL에는 없지만, Log4j 에는 있는 똑똑한 Handler를 이용할 필요가 있는가?

Question Two
     logging format을 자주 바꾸어야 할 필요가 있는가? 쉽고 융통성있게 바꾸어야 할 필요가 있는가? 다시 말해서 Log4j의 PatternLayout 이 필요한가?

Quertion Three
     Application 이 컴파일되어 배포된 후에도 logging 설정을 바꾸어야 할 필요가 있는가? 예를 들어 그 설정은 다음과 같을 수 있다. “이 클래스의 Server message는 담당자에게 이메일로 보내고,어떤 클래스 들의 severe message 는 syslog에 message로 보내고, 또다른 어떤 클래스 들의 warning message들은 네트워크 드라이브 A로 보낸다. 그리고 모든 message는 네트워크 드라이브 B에 있는 한 파일에 기록한다”

     만약 위의 질문 중 어떤 하나라도 그 대답이 “응, 그렇지” 라면 Log4j를 사용하십시오. 그리고 모든 질문의 대답이 “아니오” 라면 SDK에 이미 포함되어 있는 JUL이 적당할 수 있습니다.

Conclusion
     Log4j와 JUL은 유사한 API입니다. 하지만 개념적인 세부 사항이 약간 다르고, Log4j 는 필요하지 않을지도 모르지만 더 많은 기능을 갖고 있습니다.
     logging labrary 를 선택하는 일은 애플리케이션의 성능에 영향을 줄 수 있습니다. logger에 대한 참조를 다시 사용하여 가능한 영향을 적게 주도록 하십시오. static 또는 instance pointer를 유지하고, Logger.getLogger("loggerName") 를 호출하는 것은 삼가하세요. log를 기록하는 statement를 상식에 맞게 배치하고, tight, heavily iterated loops에 넣지 마세요.
     이 글은 Log4j 또는 JUL의 사용을 위해 깊에 다룬 글을 아닙니다. 더 많은 내용은 인터넷을 찾아 보세요.

Resources
- Log4j's home page : http://logging.apache.org/log4j
- Aggarwal, V. "third Party Logging API." Java Devleoper's Journal, Vol. 5, issue 11 : http://sys-con.com/story/?storyid=36144
- Banes, J. "Building the Ultimate Logging Solution." Java Developer's Journal, Vol. 9, issuse 5: http://sys-con.com/story/?storyid=44689
- Writing a sweet Log4j Appender that sends instanct messges : www-106.ibm.com/developerworks/jva/library/j-instlog/
- For those who don't like JUL or Log4j, try the Logging Toolkit for Java from IBM : wwww.alphaworkds.ibm.com/teck/loggingtoolkit4j

Posted by 나야

댓글을 달아 주세요