본문 바로가기
OS/Linux

편리한 로그 수집을 위한 Apache Log4j 소개

by BTC_닌닌니닌 2022. 7. 17.

안녕하세요~~ 저희는 공공의 적 팀입니다~~<(*^.^*)/ 


로그(Log) 란 서비스나 프로세스 등 컴퓨팅 작업의 처리 내용이나 이용 내용을 시간의 흐름에 따라 기록한 정보입니다.

로그를 기록하는 행위를 로깅(Logging)이라하며

로깅을 위한 로깅 도구의 종류는 대표적으로 다음과 같습니다.

 

로깅툴의 종류

 

commons-logging : 스프링 3에서 사용하던 로깅툴

log4j : 효율적인 메모리 관리로 그동안 많이 사용되었음

logback : log4j 보다 성능이 더 우수하여 최근에 많이 사용되고 있음

SLF4J : logback을 사용하기 위한 인터페이스

 

이번 시간에는 이 중 현재까지도 널리 사용되고 있는 log4j 를 소개하겠습니다.

 

 

 

Log4j

Log4j는 Ceki Gülcü가 처음 개발한 자바 기반 로깅 도구입니다. 아파치 소프트웨어 재단의 프로젝트 아파치 로깅 서비스(Apache Logging Services)의 일부입니다. 또, Log4j는 여러 자바 로깅 프레임워크들 가운데 하나입니다.

최종 사용자가 제품의 문제나 정보를 식별하기 위해, 그리고 소프트웨어 개발자가 프로그램을 개발하는 도중에 디버깅 등을 위해 타임스탬프 등 정해진 양식에 맞추어 화면 상이나 파일로 로그를 남길 목적으로 사용됩니다.

Log4j의 후속으로 Log4j2가 개발되었으며 Log4j의 개발 수명이 만기되어 현재는 일반적으로 Log4j2가 사용되고 있습니다.따라서 아래의 설명은 Log4j2에 기반하고 있음을 유의해주세요.

 

기능

로그 레벨

log4j의 최근 버전에 의하면 높은 등급에서 낮은 등급으로의 7개 로그 레벨을 가지고 있습니다. 설정 파일에 대상별(자바에서는 패키지)로 레벨을 지정이 가능하고 그 등급 이상의 로그만 저장하는 방식입니다.

 

레벨설명

OFF   가능성이 가장 높은 순위. 로그를 끄기 위해 사용한다.
FATAL 이른 종료를 일으키는 심각한 오류. 상태 콘솔에 바로 표시될 것으로 예측.
ERROR 다른 런타임 오류 또는 예기치 못한 조건. 상태 콘솔에 바로 표시될 것으로 예측.
WARN 구식 API의 사용, 잘 활용하지 못한 API 사용, 오류에 '가까운' 것, 그 밖에 꼭 잘못된 것은 아니지만 만족을 하지 못하거나 예기치 않은 런타임 상황. 상태 콘솔에 바로 표시될 것으로 예측.
INFO 흥미로운 런타임 이벤트(시작/종료). 콘솔에 바로 표시될 것으로 예측되므로 가능한 보수적으로 최소한으로 사용.
DEBUG 시스템 전반의 흐름에 관한 자세한 정보. 로그에만 기록될 것으로 예측. 일반적으로 응용 프로그램이 기록하는 대부분의 줄은 DEBUG로 작성하는 것이 좋다.
TRACE 가장 세세한 정보. 로그에만 기록될 것으로 예측. 버전 1.2.12부터 지원.

사용자 지정 로그 레벨

Log4j 2는 사용자가 자신만의 로그 레벨을 정의할 수 있게 허용합니다. 내장된 로그 레벨과 동일한 사용자 지정 로그 레벨을 지원하는 Loggers를 만들기 위해 소스 코드 생성기 도구를 제공합니다.

 

 

Log4j 구성

Log4j는 구성 파일 또는 자바 코드를 통해 구성할 수 있습니다. XML, JSON, YAML 또는 properties 파일 포맷으로 작성이 가능합니다. 구성 내에서 사용자는 Loggers, Appenders, Layouts라는 3개의 주요 구성 요소를 정의할 수 있습니다.

파일을 통해 로깅을 구성할 경우 Log4j를 사용하는 응용 프로그램을 수정하지 않더라도 로깅을 켜고 끌 수 있다는 장점이 있습니다. 응용 프로그램은 문제가 생길 때까지 로그를 끄도록 허용하는 것이 가능한데, 예를 들어 로깅을 되돌리거나 단순히 구성 파일을 수정하는 것만으로 가능합니다.

  • Loggers는 로그 메시지 도착지 이름
  • Appenders는 실제 출력을 수행하는 실체
  • Layouts는 Appenders가 로그 항목의 서식을 지정하기 위해 사용
  • Filters는 Log4j 2의 기능으로, 어느 로그 항목이 어느 Loggers와 Appenders에 의해 처리되어야 하는지를 세밀히 조절하기 위한 것입니다.

 

TTCC

TTCC는 Log4j가 사용하는 메시지 서식입니다. TTCC는 "Time Thread Category Component"를 가리킵니다.

다음의 패턴을 사용합니다.

 %r [%t] %-5p %c %x - %m%n

 

표현설명

%r 로깅 이벤트가 발생하기 전까지 레이아웃 구성에 소요된 밀리초를 출력하기 위해 사용한다.
%t 로깅 이벤트를 생성한 스레드의 이름을 출력하기 위해 사용한다.
%p 로깅 이벤트의 우선 순위를 출력하기 위해 사용한다.
%c 로깅 이벤트의 범주를 출력하기 위해 사용한다.
%x 로깅 이벤트를 발생시킨 스레드와 관련된 NDC(nested diagnostic context)를 출력하기 위해 사용한다.
%X{key} 특정 키에 대한 로깅 이벤트를 생성한 스레드와 관련된 MDC(mapped diagnostic context)를 출력하기 위해 사용한다.
%m 로깅 이벤트에 관련된 응용 프로그램이 제공한 메시지를 출력하기 위해 사용한다.
%n 하나 이상의 플랫폼 특화 새줄문자를 출력하기 위해 사용한다.

 

Log4Shell 취약점

 

Log4j 2에서 원격 코드 실행을 수반하는 제로 데이 공격, 즉 서술자 Log4Shell(CVE-2021-44228)이 알리바바그룹에 의해 2021년 11월 24일 발견되어 아파치에 보고되었으며 2021년 12월 9일 트위터를 통해 일반에 공개되었습니다. 자세한 내용은 다음에 소개해 드리겠습니다.

 

 

Log4j2.xml 예시

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Properties>
  <Property name="logNm">logtest</Property>
  <Property name="layoutPattern">%d [%t] %-5level %c(%M:%L) - %m%n</Property>
</Properties>
<Appenders>
  <Console name="console" target="SYSTEM_OUT">
   <PatternLayout pattern="${layoutPattern}" />
  </Console>

  <RollingFile name="file" fileName="/log/${logNm}.log" filePattern="/log/logs/${logNm}_%d{yyyy-MM-dd}_%i.log">
   <PatternLayout pattern="${layoutPattern}" />
   <Policies>
    <SizeBasedTriggeringPolicy size="10MB" />      
    <TimeBasedTriggeringPolicy module="true" interval="1" />
   </Policies>
   <DefaultRolloverStrategy max="500" fileIndex="min" />
  </RollingFile>
 </Appenders>

 <Loggers>
 
  <Root level="debug" additivity="false" >
   <AppenderRef ref="console" />
   <AppenderRef ref="file" />
  </Root>

 
     <logger name="org.springframework" level="info" additivity="false" >
      <AppenderRef ref="console" />
      <AppenderRef ref="file" />
     </logger>

     <logger name="com.test" additivity="false" >
      <AppenderRef ref="console" level="info" />
      <AppenderRef ref="file" level="debug" />
     </logger>

 </Loggers>
</Configuration>

 

 

참고사이트

https://en.wikipedia.org/wiki/Log4j

'OS > Linux' 카테고리의 다른 글

SSH 터널링  (0) 2022.07.30
tar  (0) 2022.07.25
[Linux] 리눅스 패키지 비교 (1)  (0) 2022.07.14
Tomcat 일자별 로그 순환 및 삭제 (catalina.out)  (0) 2022.07.01
[Linux] ssh 접속  (0) 2022.06.24

댓글