개발관련/(과거)메모

Log4j 2 Manual - Introduction

동팡 2017. 4. 29. 15:46

Log4j2 번역 및 정리 작업

출처:  https://logging.apache.org/log4j/2.x/manual/index.html


Introduction

대부분의 대규모 응용프로그램은 자체 logging or tracing API가 포함되어있다.[각주:1] 1996년 초 E.U. SEMPER 프로젝트는 tracing API를 만들기 결정하고, 결국 이 프로젝트의 기능을 향상 및 구체화하여 Log4j Java용 로깅 패키지로 발전했다. 이 패키지는 Apache Software License(ver 2.0)[각주:2] 에 의해 배포된다. 


log statements를 코드에 넣는것은 디버깅을위한 간단한(low-tech) 방법이다. 디버거가 항상 사용 가능하거나 적용 가능하지 않기 때문에 유일한 방법일 수 있다. 대개 멀티 스레드 및 분상 프로그래밍의 경우가 해당된다.


logging은 개발 사이클에 중요한 요소이다. 응용 프로그램 실행에 대한 context 정보를 제공한다. logging을 코드에 넣으면 logging 출력을 위해 개발자가 개입할 필요가 없다. 또한, 로그 출력은 파일처리를 통해 스토리지에 보관하여 차후에 활용할 수 있다.(감사 등)


As Brian W. Kernighan and Rob Pike put it in their truly excellent book "The Practice of Programming":


As personal choice, we tend not to use debuggers beyond getting a stack trace or the value of a variable or two. One reason is that it is easy to get lost in details of complicated data structures and control flow; we find stepping through a program less productive than thinking harder and adding output statements and self-checking code at critical places. Clicking over statements takes longer than scanning the output of judiciously-placed displays. It takes less time to decide where to put print statements than to single-step to the critical section of code, even assuming we know where that is. More important, debugging statements stay with the program; debugging sessions are transient.


Logging은 프로그램의 속도(성능)을 느려지게할 수 있는 단점이 있다. logging이 지나치게 길 경우, 스크롤하는데 맹목적일 수 있다(blindness). 이런 우려로 인하여 log4j는 안정적, 신속, 확장 가능하도록 설계하였다. logging은 프로그램의 메인 요소가 아니기 때문에, log4j API는 쉽게 이해할 수 있고, 사용이 간단하다. 


Log4j 2

log4j 1.x는 많은프로그램에 널리 적용(채택)되어, 사용하고 있다. 그러나, 수 년의 개발 과정에서 느려졌다. 낮은 버전의 Java와 호환 여부와 어려운 유지 보수로 인하여 2015년 8월 업데이트가 끝났다. Its alternative, SLF4J/Logback made many needed improvements to the framework.(대안으로, SLF4J/Logback은 많은 개선들이 필요해졌다.) Log4j2에 집중할 이유

1. Log4j 2는 감사 로깅을 사용할 수 있도록 설계하였다. Log4j 1.x 및 Logback은 reconfiguring(재구성)하는 동안 이벤트가 소멸된다. Logback에서 Appenders의 Exception은 어플리케이션에서 볼 수 없지만, Log4j 2의 경우 Appenders 는 Exception 이 통과(퍼지도록)할 수 있도록 설정(허용)할 수 있다.

2. Log4j 2는 LMAX Disruptor[각주:3] 라이브러 기반으로 한 차세대 비동기 로거가 포함되어 있다. 멀티 스레드 시나리오에서 Asynchronous Loggers(동기화 로거)는 Log4j 1.x 및 Logback 보다 10배 빠르고 대기시간도 훨씬 짧다.

3Log4j 2 is garbage free for stand-alone applications, and low garbage for web applications during 
steady state logging. (Log4j 2는 독립 실행형 어플리케이션에서는 가비지가 없고, 웹앱에서 정상 로깅 작업할 경우, 낮은 가비지 처리 기능을 제공한다. ) Garbage Collector의 사용 빈도를 줄이고, 더 나은 응답 시간을 제공한다. 

4. Log4j 2는 Appender Filters, Layouts, Lookups, Pattern Converters를 추가하여 매우 쉽게 확장할 수 있는 플러그인 시스템을 사용한다. 

5. 플러그인 시스템 구성으로 인해 더 간단하다. Configuration의 Entries들은 클래스 이름을 지정할 필요가 없다. 

6. Custom Log Level을 지원한다. 이것은 code 또는 config 파일에서 정의할 수 있다.

7. 람다식 제공. Java 8에서 실행중인 클라이언트 코드는 request된 log-level만 활성화된 경우에만, 로그 메시지를 사용하여 lazily하게 로그 메시지를 구성할 수 있다. 

8. Message objects 지원. Support for Message objects. Messages allow support for interesting and complex constructs to be passed through the logging system and be efficiently manipulated.( 구문 자체가 이해 안감)
사용자는 자신의 Message type을 만들고 사용자 정의 Layouts, Filters, Lookups을 정의하여 컨트롤할 수 있다.

9. Log4j 1.x의 Appenders는 Filters를 지원한다. Logback은 TurboFilters을 추가하여, Logger가 처리되기 전에, 이벤트를 필터링 할 수 있게한다. Log4j 2는 Logger가 이벤트를 처리하기 전에, 이벤트를 처리하도록 구성할 수 있는 Filter를 제공한다. 

10. 다양한 Logback Appenders는 Layout을 허용하지 않으며, 고정된 형식으로만 데이터를 보낸다. Log4j 2 Appenders는 레이아웃을 허용하며 원하는 형식으로 데이터를 전송할 수 있다.

11. Log4j 1.x와 Logback Layouts은 문자열을 리턴한다. 이로인해 Logback Encoder에서 문제가 발생한다. Log4j2는 Layouts이 항상 바이트 배열을 반환하는 간단한 접근 방식을 사용한다. OutputStream에 쓰는 것 뿐만 아니라, 모든 Appender에서 사용할 수 있는 장점이 있다. 

12. Syslog Appender는 TCP, UDP는 물론 BSD syslog, RFC 5424 형식을 지원한다. 

13. Log4j 2는 Java 5 동시성 지원을 활용하고 저 수준에서 잠금을 수행한다. Log4j 1.x에는 교착 상태 문제가 있다. 이 중 많은 부분이 Logback에서 수정되었지만, 많은 Logback 클래스는 여전히 높은 수준의 동기화가 필요하다. 



  1. (대부분, 다양한 오픈 소스 프로젝트( Mybatis, Spring KMIP4J 등)에는 logging을 사용한다. 거의 필수이며, 아파치 Log4j1.x는 De facto Standard(사실상 표준)라고 칭한다. ) [본문으로]
  2. BSD와 유사하며, 소스 코드 공개 여부:X 사용 여부에 대한 명시를 해야하며 명시에 대한 양식은 Apache 홈페이지에 있다. [본문으로]
  3. http://lmax-exchange.github.io/disruptor/ http://stackoverflow.com/questions/14630901/what-is-lmax-disruptor-design-pattern 어렵다..;; 나중에 따로보자 [본문으로]