2015. 3. 16. 22:45

로깅(logging)은 "비 기능 요구사항(Non Functional Requirement)"에 속한다. 그러나 고객의 요구 여부에 상관없이 로그 출력 기능은 프로그램 개발 중 디버깅 및 개발 완료 후 문제 발생 시 원인 분석을 위해 좋은 프로그램이 필수적으로 갖추어야 하는 요구조건에 속한다.


로깅이란 무엇인가? How To BeAProgrammer 발췌


로그 기록(logging)이란 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동을 말한다. 프린트 줄 넣기(printlining)는 간단한, 보통은 일시적인, 로그를 생성하기만 한다. 완전한 초보자들은 프로그래밍에 대해 아는 것에 한계가 있기 때문에 로그를 이해하고 사용해야 한다. 시스템 설계자들은 시스템의 복잡성 때문에 로그를 이해하고 사용해야 한다. 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도, 설정 가능해야 한다. 일반적으로 로그 기록은 다음의 이점이 있다.

  • 그는 재현하기 힘든 (예를 들어, 개발 완료된 환경에서는 발생하지만 테스트 환경에서는 재현할 수 없는) 버그에 대한 유용한 정보를 제공할 수 있다.
  • 로그는, 예를 들어, 구문(statement)들 사이에 걸리는 시간과 같이, 성능에 관한 통계와 정보를 제공할 수 있다.
  • 설정이 가능할 때, 로그는 예기치 못한 특정 문제들을 디버그하기 위해, 그 문제들을 처리하도록 코드를 수정하여 다시 적용하지(redeploy) 않아도, 일반적인 정보를 갈무리할 수 있게 한다.


    자바에서 로그를 출력하는 방법

    초보자들은 System.out.print() 메소드를 이용해 실행 중 다양한 입출력 및 변수 값들을 출력한다. System.out.println 명령은 출력되는 로그의 양(혹은 수준)을 조절할 수가 없고, 표준출력(standard out)을 통해 출력하는 것은 로그를 파일 등에 저장하기도 불편하고 성능 면에서도 낮은 편에 속한다.


    자바 개발자를 위한 로깅 라이브러리는 이미 다양하게 개발되어 있기 때문에 직접 로그 출력 기능을 개발하는 것은 무의미하다. 다만, 다양한 라이브러리 중에서 적합한 것을 고르는 안목이 필요하다. 


    널리 쓰이는 로그 출력 라이브러리

    다양한 오픈 소스 로그 라이브러리가 존재하지만, 그 중에 널리 쓰이는 것들이 있기 마련이다.

    • java.util.logging
      JDK(Java Development Kit) 1.4 버전부터 자바에 포함된 표준 로그 API 이다. 별도의 라이브러리를 추가할 필요가 없다는 점이 장점이나, 다른 것들이 더 많이 사용되는 이유는 아마도 제공하는 기능이 가장 적다는 이유 때문일 것이다.
      Java Doc 혹은 Java Logging API - Tutorial 사이트를 참조하길 바란다.

    • Apache Commons logging
      아파치 재단(Apache Foundation)이 웹 서버(Apache Web Server)나 톰캣(Apache Tomcat) 서버만 제공하는 것이 아니다. 오히려, 아파치 재단에서 제공하는 다양한 오픈 소스 자바 라이브러리들이 아파치 재단의 영향력을 잘 보여준다. 그중에서 Commons 라이브러리는 프로그램의 기초를 단단히 다지고자 하는 학생에서는 멋진 도서관이다. Commons 라이브러리 중에서 로그 출력 기능을 제공하는 라이브러리가 Commons Logging 이다. Apache Commons logging 공식 홈페이지를 참조하길 바란다.

    • Log4j
      재밋는 사실은 아파치 재단에서 제작되는 로그 라이브러리가 하나 더 있다는 점이다. log4j 는 로그 라이브러리 중에서 가장 성공적이고 널리 사용된 라이브러리일 것이다. (공식 통계는 없지만....) Log4j 공식 홈페이지는 역시 아파치 사이트 중 하나이다. 참고로 Log4j version 2 부터는 JAVA 6 이상을 필요로 한다.

    • Logback
      Log4j를 만드신 분은 Ceki Gülcü 인데, Log4j를 만들어 놓고 더 좋은 라이브러리를 새로 만들게 된 것이 logback 이다. 오픈 소스 진영은 이렇듯 "창조적 파괴"가 빈번히 일어나기 때문에, 이미 잘 알고 있거나 오래도록 쓰고 있던 기술이 있더라도 항상 더 나은 기술이 나오지는 않았는지 살펴보는 주의력이 필요하다. 자칫 뒤떨어지기 마련이다. Logback 홈페이지는 다른 라이브러리에 비해서 매뉴얼이 상세한 편이다. 그만큼 제공하는 기능이 많다는 점은 확실히 부담스럽다.

    • 세상의 모든 로그 라이브러리
      남들이 쓰지 않는 특이한 것에 관심이 있다면 거의 모든 오픈 소스 로그 라이브러리 목록 : 
      Open Source Logging in Java 을 참고하면 된다.

    로그 라이브러리를 갈아끼울 수는 없을까?
    컴퓨터에 설치된 소프트웨어는 언제나 지우고 다른 제품을 설치할 수 있다. 그렇다면, 로그 라이브러리도 필요에 따라 갈아끼울 수는 없을까? 이런 생각을 하는 사람들이 분명 있다. 앞서 설명한 바와 같이 오픈 소스 진영에서 계속 새로운 라이브러리가 나오고 있으니 말이다.
    로그 라이브러리를 갈아 끼울 수 있게 만드려면 무엇이 필요할까? 혹은 어떤 선행 조건이 필요한가? 전기 콘센트에는 TV, 냉장고, 세탁기, 그외에 다양한 전자제품을 연결할 수 있다. 콘센트와 플러그가 호환만 된다면 말이다. 플러그는 제품에 붙어 있지만, 콘센트는 항상 벽에 붙여 있다. 이렇듯 프로그램에서 콘센트 역할을 하는 모듈과 플러그 역할을 하는 모듈을 분리하면 언제든 기능을 교체할 수 있다.

    그래서 콘센트 역할 - 이것을 디자인 패턴에서 사드(facade) 패턴이라고 한다 -을 하는 라이브러리가 나오게 되었고 SLF4J 라고 한다. SLF4J 자체는 로그를 출력하는 기능을 제공하는 것이 아니다. (콘센트가 있다고 저절로 냉장고가 생기는게 아닌 것처럼...) 하지만, 다양한 로그 라이브러리를 골라가며 쓰고 싶다면 한번쯤 공부해볼 만한 기법이다. 실제로 다양한 오픈 소스 제품들이 SLF4J를 활용하고 있다.


    그외에 읽을만한 거리...

    로거(logger)쯤은 이미 잘 활용하고 있기에 끝까지 한 달음에 읽었다면 다음 글들도 한 번 읽어보시길 권한다.

    logback을 사용해야 하는 이유

    아키텍처 설계: Logback을 활용한 Remote Logging


    SLF4J 로깅 처리


    Logging framework logback

    Posted by 곽중선