log4j 설정

Heejun Byun·2022년 11월 3일
0

이슈사항정리

목록 보기
1/1
post-thumbnail

최근 회사에서 한창 진행중인 프로젝트에 BackEnd 개발인력으로 중간에 투입되었다.

프로젝트의 큰틀은 안드로이드 앱 (FrontEnd) 과 Java (BackEnd) 를 구분하여 개발하고, FrontEnd에서 API를 호출하여 BackEnd에서 결과값을 json 형태로 return 해주는 방식이였다.
프로젝트 IDE를 설정하고, 소스를 받아서 확인해보니 문제점들이 꽤나 많이 보였다.

그 중 하나가 log 관련 설정이 전혀 되지 않아서 불필요한 로그들이 출력되고
필요한 로그들은 출력이 되지 않는 상태였다.
log4j 관련 설정을 먼저 해야겠다고 생각했다.

# log4j 설정 변경 전 console log

처음 위에 log4j 출력 설정을 보았을 때 로그관련해서는 아무도 신경을 못 썼다는 생각이 들었다.

# pom.xml

pom.xml 의 maven jar파일 주입부터 설정 파일을 수정하기 시작했다.

    <properties>
        ...
        <org.apache.logging.log4j>2.17.1</org.apache.logging.log4j>
        <org.slf4j>1.7.7</org.slf4j>
        ...
    </properties>

    <!-- Log4J -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${org.apache.logging.log4j}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${org.apache.logging.log4j}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${org.apache.logging.log4j}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
        <version>${org.slf4j}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j}</version>
    </dependency>
    
    <!-- log4jdbc -->
    <dependency>
        <groupId>com.googlecode.log4jdbc</groupId>
        <artifactId>log4jdbc</artifactId>
        <version>1.2</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.bgee.log4jdbc-log4j2</groupId>
        <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
        <version>1.16</version>
    </dependency>               

    <!-- Log4j Remix -->
    <dependency>
        <groupId>org.lazyluke</groupId>
        <artifactId>log4jdbc-remix</artifactId>
        <version>0.2.7</version>
    </dependency>

# log4jdbc.log4j2.properties

pom.xml jar 파일 주입 후 log4jdbc.log4j2.properties 파일을 생성하여 아래 properties를 작성한다.
경로 project/src/main/resource

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

# log4j2.xml

경로 project/src/main/resource
log4j2.xml 파일은 어떤 로그 파일들을 어느 레벨에서만 출력을 할 것인지 설정하는 곳이다.
설정 level은 아래와 같다.

DEGUG 디버그를 위한 용도로 일반 정보도 상세하게 출력
INFO 상태 변경과 같이 일반적인 정보를 출력
WRAN 경고성 메시지 (처리가능한 문제 또는 향후 에러의 원인이 될 수 있는 경고성 메시지)
ERROR 일반적인 에러로 처리가 반드시 필요ㄷ
FATAL 시스템적으로 아주 심각한 에러가 발생, 어플리케이션 작동 불가

[변경 전]

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="java.sql" level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="jdbc.resultset" level="ERROR" additivity="false">
            <appender-ref ref="console" />
        </Logger>
        <Logger name="egovframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
          <!-- log SQL with timing information, post execution -->
        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="org.springframework" level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

[변경 후]

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
	<Properties>
		<Property name="name">consultingSvr</Property>
		<property name="log-path">/usr/local/tomcat9/logs/backup</property>
		<Property name="pattern">%d %5p [%c] %m%n</Property>
	</Properties>
	<Appenders>
		<Console name="console" target="org.apache.log4j.ConsoleAppender">
			<PatternLayout pattern="${pattern}" />
		</Console>
		<RollingFile name="RollingFile" fileName="${log-path}/${name}.log"
			filePattern="${log-path}/$${date:yyyy-MM}/${name}_%d{yyyyMMddHH}_%i.log.gz">
			<PatternLayout>
				<Pattern>${pattern}</Pattern>
			</PatternLayout>
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="250 MB" />
			</Policies>
			<DefaultRolloverStrategy max="100">
				<!-- Nested conditions: the inner condition is only evaluated on files
					for which the outer conditions are true. -->
				<Delete basePath="${log-path}" maxDepth="2">
					<IfFileName glob="*/${name}-*.log.gz">
						<IfLastModified age="30d">
							<IfAny>
								<IfAccumulatedFileSize exceeds="100 GB" />
								<IfAccumulatedFileCount exceeds="10" />
							</IfAny>
						</IfLastModified>
					</IfFileName>
				</Delete>
			</DefaultRolloverStrategy>
		</RollingFile>
	</Appenders>
    
    <Loggers>
        <Logger name="java.sql" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
		<Logger name="jdbc.sqlonly" level="WARN" additivity="false">
			<AppenderRef ref="console" />
		</Logger>        
        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="console" />
        </Logger>        
	    <Logger name="jdbc.resultset" level="WARN" additivity="false">
	        <appender-ref ref="console" />
	    </Logger>
		<Logger name="jdbc.resultsettable" level="INFO" additivity="false">
			<AppenderRef ref="console" />
		</Logger>	    
		<logger name="jdbc.audit" level="WARN" additivity="false"> 
			<appender-ref ref="console"/> 
		</logger>
		<Logger name="jdbc.connection" level="INFO" additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="net.sf.log4jdbc" level="DEBUG" additivity="false">
			<AppenderRef ref="console" />
		</Logger>		
		
        <Logger name="egovframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
        </Logger>		
		<Logger name="org.springframework.core" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.web" level="INFO" additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<!-- DEBUG이면 myBatis에서 오류를 찾을수 있음. -->
		<Logger name="org.springframework.beans" level="DEBUG"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.jndi" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.context" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.ui" level="INFO" additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.aop" level="INFO" additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.security" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.transaction" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.springframework.jdbc" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>		
		<Logger name="org.mybatis.spring.mapper" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.mybatis.spring.SqlSessionFactoryBean" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.mybatis.spring.SqlSessionUtils" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>
		<Logger name="org.apache.ibatis.logging.LogFactory" level="INFO"
			additivity="false">
			<AppenderRef ref="console" />
		</Logger>        
        
        <Root level="DEBUG">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFile" />
        </Root>
    </Loggers>
</Configuration>
	

작년 이맘때쯤 log4j 보안 이슈로 인해 많은 국내 개발자들이 log4j 취약점을 해결했던걸로 기억한다. 그만큼 국내 IT기업에서 가장 많이 사용되는 log 라이브러리는 log4j라고 생각된다.
아래링크는 전자정부 표준프레임워크센터에서 안내하는 log4j 보안 이슈 해결법 링크이다.
Log4j 보안 업데이트 공지

profile
반갑습니다. 개발자 변희준입니다.

0개의 댓글