본문 바로가기
Language/JAVA

log4j2 사용법 / 환경설정 / 패턴 layout / system.out 차이점

by 박살낼겨 2021. 12. 29.

Log4j2

 

** pom.xml 의존성 설정 **

 

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.0</version>
</dependency>

 

 


** 환경설정(설정파일을 사용해 설정) **

어디에 xml파일을 만들어야 되나?

 

 

WEB-INF/classes 하위에 넣어주면 된다.

 

 

(내부적으로 설정파일을 읽어준다.)

 

 

*.xml, *.json, *.jsn

파일 형식의 환경 설정만 가능

 

 

해당 포스팅은 *.xml을 다룬다.

 

 

 

** 파일 내 기본적인 소스 **

 

<!-- log 레벨을 INFO로 지정한 것 -->
<Configuration status="INFO" xmlns:log4j="http://jakarta.apache.org/log4j/">
<properties>
    <property name="pattern">%t> 
            [%d{yyyy-MM-dd HH:mm:ss}] [%c{1}] [%L] [%p] %m %n</property>
    <property name="queryLog">debug</property>
</properties>

    <appenders>
        <Console name="console" target="SYSTEM_OUT">
            <!-- 콘솔창에 log가 찍힐 내용의 포맷(?)을 지정  -->
            <PatternLayout pattern=
                "[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%t] 
                [%logger{36}(%L)] - %m %n"
                />
        </Console>
        
        <!-- log 파일을 저장하는 위치와 정책 -->
        <!-- fileName : 파일저장할 위치, filePattern : 파일명 패턴 -->
        <RollingFile name="dailyout" fileName="/jb_log/imsout.log" 
            filePattern="/jb_log/imsout.log_%d{yyyyMMddHH}">
            <PatternLayout>
                <!-- 위의 property의 패턴을 그대로 가져온다 -->
                <pattern>${pattern}</pattern>
            </PatternLayout>
                <Policies>
                    <TimeBasedTriggeringPolicy modulate="true"
                    interval="24" />
                    <!-- Rotated everyday -->
                </Policies>
                <!-- 파일 갯수를 1000개로 유지 -->
                <DefaultRolloverStrategy max="1000" fileIndex="min" />
        </RollingFile>
    </appenders>

    <loggers>
        <!-- name : 사용하는 logger class 혹은 패키지 명 -->
        <!-- level : log레벨 중 1택  -->
        <!-- additivity : flase일 경우 root로그와 중복으로 찍히는 것을 방지 -->
        <logger name="egovframework" level="DEBUG" additivity="false">
        
        <!-- appender-ref : 로그의 출력 방식을 설정
        (위의 appender을 참조하는 것) -->
        <appender-ref ref="dailyout" level="DEBUG" />
        </logger>
    </loggers>
    
    <!-- root는 default log라고 보면된다. *꼭 입력 -->
    <!-- 레벨을 너무 낮게 설정하면 이것저것 너무 다 찍힘 -->
    <!-- 기본적인 log이기 때문에 위에서 additivity를 false로 설정해서 중복을 피한 것 -->
    <!-- appender-ref : 해당 log 레벨로 어느정도까지 일을 수행할지 지정
    (위의 name이 console 인것 수행) -->
    <root level="error">
        <appender-ref ref="console" />
    </root>
    
</Configuration>

 

* name : 밑의 AppenderRef의 ref에 쓰일 이름 

 

* filePattern : Rolling시 저장될 위치와 로그파일 이름

    - yyyy-MM-dd : 일마다 

    - yyyy-MM-dd-hh : 시간마다

    - yyyy-MM-dd-hh-mm : 분마다

 

 

 

** Log layout value 표기법 **

 

 

 

** LOG 레벨 **

 

 

 

 

가장 낮은 TRACE를 시작해 FATAL 레벨까지 구성되어 있다.

 

 

지정한 레벨보다 낮은 레벨의 메시지들은 출력되지 않지만,

 

 

그보다 높은 레벨의 메시지들은 출력됩니다.

 

 

만약 INFO로 설정했다면 DEBUG와 TRACE 관련 메시지는 출력되지 않지만,

 

 

그보다 높은 나머지 3레벨은 INFO와 같이 출력됩니다.

 

 

 

 

** 장점 **

 

 

로그를 찍어 에러혹은 여러 값들을 추적 확인 하기위해

(반드시, 찍어보면서 확인하는 습관을 갖자)

 

 

출력형식이 자유로워 입맛에 맞게 변경가능(융통성 좋음)

 

 

속도에 최적화

 

 

 

** system.out.println과 차이점**

 

 

쓰기편한 syso 있는데 굳이??

 

 

syso의 단점(?)으로 보자면 아래와 같다.

 

 

로그 내용을 가져와 파일이나 DB로 값을 넣을 수 없다.

 

 

에러나 장애의 정보가 없어 추적확인이 어렵다.

 

 

OS의 콘솔을 활성화 시켜 CPU 리소스를 점유한다.

(성능에 영향을 준다)