Log4j Migration - Maven,Gradle 없이 순수 jar 파일로 마이그레이션

Woody·2022년 1월 2일
0

Log4j 관련

목록 보기
1/2
post-thumbnail

회사에서 내가 적용에 성공한 방법을 토대로 작성함

우리 부서는 솔루션 설치 시 고객사의 외부망 관련 보안 문제 때문에 Maven이나 Gradle 같은 외부 빌드를 이용하지 않고, jar 파일로 로컬에서 직접 관리하는 방식으로 업무를 진행한다.

사실 기존 부서 담당 프로젝트들이 절반은 자바7 버전 베이스라 Log4j 1.2.16 버전을 사용하고 있었기에 이번 보안 이슈 취약점 대상에선 제외되었지만, 이번 기회에 최신버전으로 마이그레이션 하자는 의견이 나와 진행하게 되었다.

내가 선택한 마이그레이션 버전은 2.12.3 버전이다.

Java 7을 사용하는 몇몇 프로젝트가 있기 때문에 Java 7을 지원하는 보안 취약점 문제가 해결 된 가장 최신 버전이기 때문
2.12.3 버전 다운로드


참고로 회사 코드는 노출시킬 수 없으므로 log4j -> log4j2 로 변경했을 시 log 객체의 메소드 파라미터 타입이 변경되는 점은 눈치껏 알아서 수정해야 함.

기존 프로젝트의 WebContent/WEB-INF/lib 에서 다음 항목들 제거

기존 log4j.xml 파일 제거 후 다른 경로에 log4j2.xml 파일 추가

기존의 log4j.xml 파일은 src 바로 하위 경로에 위치하고 있지만 log4j2.xml 파일은 WebContent/WEB-INF 하위에 classes 라는 디렉토리를 생성해서 그 안에 추가하면 된다.

  • 기존 경로
  • 새 경로

추가할 log4j2.xml 코드 구성

APACHE 공식 래퍼런스 문서 기본 형태

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" name="RoutingTest" monitorInterval="30">
  <Properties>
    <Property name="filename">target/rolling1/rollingtest-$${sd:type}.log</Property>
  </Properties>
  <ThresholdFilter level="debug"/>
 
  <Appenders>
    <Console name="STDOUT">
      <PatternLayout pattern="%m%n"/>
      <ThresholdFilter level="debug"/>
    </Console>
    <Routing name="Routing">
      <Routes pattern="$${sd:type}">
        <Route>
          <RollingFile name="Rolling-${sd:type}" fileName="${filename}"
                       filePattern="target/rolling1/test1-${sd:type}.%i.log.gz">
            <PatternLayout>
              <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            <SizeBasedTriggeringPolicy size="500" />
          </RollingFile>
        </Route>
        <Route ref="STDOUT" key="Audit"/>
      </Routes>
    </Routing>
  </Appenders>
 
  <Loggers>
    <Logger name="EventLogger" level="info" additivity="false">
      <AppenderRef ref="Routing"/>
    </Logger>
 
    <Root level="error">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
 
</Configuration>

요소들에 대해 간단하게 설명하자면
<Configuration> 은 로그 설정의 최상위 노드이다.
<Properties>, <Appenders>, <Loggers>요소를 자식노드로 가지고 있다. status 속성은 log4j의 내부 이벤트에 대한 로그 레벨을 의미.
monitorInterval="30" 은 Log4j가 파일의 변경 여부를 확인하는 주기를 '30'분 주기로 하겠다는 뜻이다.

<Properties> 는 해당 <Configuration> 영역 내에서 사용할 프로퍼티를 의미한다.
자바로 치면 전역변수같은 느낌이랄까

<Layout> 는 날짜나 시간(12,24) 포맷, 색깔, 출력 요소 등을 결정할 수 있는 요소이다.

구체적인 사용 방법은 링크

<Appenders> 는 log 메세지를 특정 위치에 전달해주는 역할이다.

  • ConsoleAppender
  • RollingFileAppender
  • FileAppender
  • JDBCAppender
  • 등등...
  • 구체적인 사용 방법은 링크

여기서 가장 핵심이라고 생각하는 RollingFileAppender 만 따로 설명하자면,

<RollingFile name="Rolling-${sd:type}" fileName="${filename}" 
	filePattern="target/rolling1/test1-${sd:type}.%i.log.gz">
       
       <PatternLayout>
       		<pattern>%d %p %c{1.} [%t] %m%n</pattern>
       </PatternLayout>
       <Policies>
       	<TimeBasedTriggeringPolicy interval="1" modulate="true" />
       	<SizeBasedTriggeringPolicy size="500" />
       </Policies>
       <DefaultRolloverStrategy max="10" fileIndex="min"/>
</RollingFile>

로그 파일에 문제가 생기면 로그가 전부 유실될 수 있기 때문에 RollingFileAppender에서 설정을 해줌으로서 미연에 방지할 수 있다. RollingFileAppender 는 파일에 로그를 기록하고, 특정 기준에 따라 압축하여 저장하는 방식의 Appender 이다.

<Logger> Root패키지의 <Logger>는 필수이고, 여러개를 적용할 때에는 <Loggers> 내에 복수개의 <Logger>로 설정할 수 있다.

<Loggers>
	<!-- Additivity값은 중복된 로그를 남길 지에 대한 속성 -->
    <Logger name="EventLogger" level="INFO" additivity="false">
      <AppenderRef ref="Routing"/>
    </Logger>
 
    <Root level="error">
      <AppenderRef ref="STDOUT"/>
    </Root>
</Loggers>

해당 로거는 name="EventLogger" 패키지에 해당하는 파일들에 대해서 INFO 이상 레벨의 로그를 콘솔에 남기는 로거이다.

새로운 버전의 jar 파일 추가

코드 변경 사항

// 변경 전
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

//변경 후
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

---------------------------------------------------------------------

//변경 전
//변수이름과 (“??”)안의 클래스명은 기존 코드에 맞게 알아서 수정
protected static final Log log = LogFactory.getLog(??)

//변경 후
protected static final Logger log = LoggerFactory.getLogger(??)





참고로 자바8 버전 이상부터 지원하는 2.17.0 버전도 시도해 봤는데 동일하게 이슈없이 작동하는걸 확인했다.

참조

https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution

profile
If the wind will not serve, take to the oars

0개의 댓글