로깅은 애플리케이션에서 발생하는 이벤트나
데이터를 시스템의 저장소(파일,데이터베이스,콘솔 등)에 기록 하는 것을 의미한다.
로깅은 애플리케이션의 상태를 모니터링 하거나 오류를 디버깅하는 데 아주 유용한 방법
또한 로깅은 시스템의 성능 측정, 오류 추적, 정보 분석,보안 감사 등 다양한 목적으로 사용될 수 있다
오늘은 로깅에 대해서 이론적인 부분만 간단하게 알아본다.
로그의 중요성에 따라 다양한 레벨(INFO,DEBUG,WARN,ERROR 등)이 있다
로그 레벨에 따라 출력되는 로그의 양과 상세성을 조절할 수 있다.
로깅할 내용을 담은 메세지 간단한 정보 문자열부터 JSON 객체나 XML과 같은 복잡한 데이터 구조까지 다양할 수 있음
로그 메시지가 출력되는 대상을 의미함
위에서 언급했듯이 파일,데이터베이스,콘솔 등 다양한 형태가 될 수 있음
로그 메시지가 어떻게 구성되어 있는지 정의 할 수 있음
일반 텍스트,JSON,XML 등 다양한 형식을 사용가능
프로그램에서 오류가 발생했을 때 로그를 통해 문제를 쉽게 파악하고 수정 가능.
애플리케이션의 상태와 성능을 실시간으로 모니터링 할 수 있다.
누가 언제 어떤 작업을 수행했는지 등을 로그를 통해 기록하면
보안 이슈나 부정행위를 추적할 때 유용하다
로그를 통해 시스템의 작동 방식을 기록하면 이후에 시스템을 유지보수하거나
업그레이드할 때 참고 자료로 활용 가능
특정 업게나 국가에서는 데이터 처리와 관련된 여러가지 규정을 준수해야 할 수 있다
로깅은 이를 증명하는 데 많은 도움을 준다.
자바 표준 라이브러리에 포함되어 있는 있는 로깅 API
Apache Logging Services 프로젝트의 일부
환경 설정이 매우 유연하며 다양한 로그 레벨과 출력 형식을 지원함
2021년도에 보안 이슈가 있었다
관련 기사 : https://www.boannews.com/media/view.asp?idx=105393
Apache Log4j2 버전 2.0-beta7부터 2.17.0(보안 수정 릴리스 2.3.2 및 2.12.4 제외)은 로깅 구성 파일을 수정할 수 있는 권한을 가진 공격자가 원격 코드를 실행할 수 있는 JNDI URI를 참조하는 데이터 소스를 가진 JDBC 애펜더를 사용하여 악의적인 구성을 구성할 수 있는 원격 코드 실행(RCE) 공격에 취약합니다. 이 문제는 Log4j2 버전 2.17.1, 2.12.4 및 2.3.2에서 JNDI 데이터 소스 이름을 자바 프로토콜로 제한함으로써 해결되었습니다.
현재는 해결된 상태
다양한 로깅 프레임워크에 대한 단순한 파사드또는 추상화 계층을 제공하며
Log4j,JUL등 다양한 로깅 라이브러리를 동일한 API로 사용할 수 있도록 해줌
퍼사드 패턴 관련 자료: https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4
SLF4J와 통합이 잘 되어 있으며, 자체적으로도 많은 기능을 제공한다.
Log4j의 창시자인 Ceki Gülcü에 의해 개발되었다.
이외에도 Commons Logging,Tinylog 등 더 존재한다
나는 항상 '왜?'가 중요하다
JAVA에서 제공되는
System.out.println
System.out.print
System.out.prinf
System.err.println
등이 있는데
왜 라이브러리를 써가며 logging을 하는 걸까?
찾아보니 여러 이유가 있지만
개인적으로 생각 했을때 가장 큰 이유중 하나는
비동기 로깅 때문인거 같다
로깅 라이브러리는 대부분 비동기 로깅을 지원하는데
애플리케이션의 성능을 덜 방해한다
System.out.print와 같은 것들은 동기적으로 동작하므로 성능에 부담을 줄 수 있다
비동기 로깅이 있다면 동기 로깅도 있다는 소린데 둘의 차이를 간단하게 알아보자
애플리케이션이 로그 메시지를 생성하면 로깅 시스템은 해당 메시지를 즉시 처리한다
메시지가 파일,데이터베이스 또는 다른 저장소에 성공적으로 저장될 때까지 애플리케이션은 다른 작업을 진행하지 않는다.
로그 메시지를 처리하는 동안 애플리케이션이 멈추므로 I/O 작업이 느리거나 저장소가 잠깐 멈춘 경우 애플리케이션의 전반적인 성능이 저하될 수 있다
애플리케이션이 로그 메시지를 생성하면 로깅 시스템은 그 메시지를 큐에 저장하고
즉시 제어를 애플리케이션에 반환한다 별도의 스레드가 이 큐를 처리하여 로그 메시지를 저장소에 기록한다.
이 방식을 사용하면 애플리케이션이 로그 메시지를 저장소에 쓰는데 걸리는 시간을 기다릴 필요가 없으므로 애플리케이션의 성능이 향상 될 수 있다
최근 혼자 무언갈 할 때 로그를 찍는게 에러가 나지 않는 이상은 찍지 않았는데
에러가 날거 같은 곳에서 로그를 미리미리 찍어두고 해야겠다...