log4j2 를 이용한 logging 콘솔 및 로그파일 구현하기

hyewon jeong·2024년 7월 1일
0

Spring

목록 보기
64/65
post-thumbnail

log관리를 하기 위해 log4j2/logback/slf4j등 어떤것을 이용할까 생각하다가 21년 보안이슈가 되었지만 다시 개선 된 log4j2 를 사용하기로 했습니다.

🎈 1.pom.xml 라이브러리 추가

        <!--        log4j2 및 jdbc 설정-->
        <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
            <version>1.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.18.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.18.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.18.0</version>
        </dependency>

🎈 2.src\main\resources폴더 아래에 log4jdbc.log4j2.properties 파일 생성후 아래 코드 추가하기

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

🎈 3 root- context.xml or context-datasource.xml 의 빈 객체 생성에 driverClassName, url 만 변경해준다.


	<bean id= "dataSource-postgreSql" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${Globals.DriverClassName}"/>
		<property name="url" value="${Globals.Url}"/>
		<property name="username" value="${Globals.UserName}"/>
		<property name="password" value="${Globals.Password}"/>
	</bean>
    
DriverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
Url=jdbc:log4jdbc:postgresql://tspdj.iptime.org:18432/ojt

클래스이름은 그대로 복사붙여넣기 하고, url 은 jdbc와 디비이름 사이에 log4jdbc 를 입력해주면 완료

🎈 4. src\main\resources폴더 아래에 log4j2.xml 폴더 생성 후 작성하기

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <properties>
        <property name="name">app</property>
        <property name="pattern">%d{yyyy-MM-dd HH:mm:ss}| %-5.5p|%-30.30C::%-30.30M:%-5.5L| %msg%n</property>
    </properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n" />
        </Console>
        <RollingFile name="RollingFileAppender"  fileName="./log/${name}.log"
                     filePattern="./log/$${date:yyyy}/$${date:MM}/$${date:dd}/${name}_%d{yyyyMMddHH}.log">
            <PatternLayout>
                <!-- 날짜, 로그 레벨, 로거 이름, 라인 번호, 메시지 등의 정보를 포함합니다. -->
                <Pattern>${pattern}</Pattern>
            </PatternLayout>
            <Policies>
                <!-- interval=1 (매일), modulate=true (정각) -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="10000"/>
        </RollingFile>
    </Appenders>





    <Loggers>
        <Logger name="kr.or.woniProject" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <Logger name="jdbc.sql" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <!--        <Logger name="jdbc.sqlonly" level="INFO" additivity="false">-->
        <!--            <AppenderRef ref="console" />-->
        <!--            <AppenderRef ref="RollingFileAppender"/>-->
        <!--        </Logger>-->
        <Logger name="egovframework" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <!-- log SQL with timing information, post execution -->
        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <Logger name="org.springframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <!--  SQL 결과 조회된 데이터의 table을 로그로 남긴다.(빼도됨) -->

        <Logger name="jdbc.resultsettable" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
        <!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.-->
        <!--        <Logger name="jdbc.audit" additivity="false">-->
        <!--            <level value="WARN"/>-->
        <!--            <appender-ref ref="console"/>-->
        <!--        </Logger>-->
<!--                <Root level="INFO">-->
<!--                    <AppenderRef ref="console" />-->
<!--                    <AppenderRef ref="RollingFileAppender"/>-->
<!--                </Root>-->
    </Loggers>
</Configuration>

🎈 5 결과

5-1. console창 로그 출력


해당쿼리와

해당 결과값을 테이블형식으로 보여지는 것을 볼 수 있습니다.

5-1. 로그파일 생성 및 로그 저장

톰캣이 구동되는 위치파일에 보면 위에서 설정한 .log/app._날짜.log 이 생성됨을 날짜별로 볼 수 있습니다.

⭐ filePattern="./log/date:yyyy/{date:yyyy}/{date:MM}/$date:dd/{date:dd}/{name}_%d{yyyyMMddHH}.log" 에

마지막.log에 .gz 를 붙이면 압축파일로 저장이 됩니다.

filePattern="./log/$${date:yyyy}/$${date:MM}/$${date:dd}/${name}_%d{yyyyMMddHH}.log.gz" 

Java 로깅 logger, log4j, logback, slf4j 비교

출처: https://0soo.tistory.com/241 [Lifealong:티스토리]

Log4j 2 환경설정

profile
개발자꿈나무

0개의 댓글