메뉴얼들/개발 환경

Log4j2.xml 에서 소스코드들의 의미

Dr.Mlem 2024. 10. 12. 19:02

Q1.
log4j2.xml 파일의 소스코드를 분석해줄 수 있겠어? 잘 이해가 안되어서...

 

 


A1.
물론입니다. log4j2.xml 파일은 Log4j 2 설정 파일로, 로그 출력을 어떻게 처리할지 정의합니다. 이 파일의 주요 구성 요소를 설명드리겠습니다.

 


전체 구조

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="INFO">
    <Appenders>
        <!-- Appender 정의 -->
    </Appenders>
    <Loggers>
        <!-- Logger 정의 -->
    </Loggers>
</Configuration>

 

Configuration: 설정의 루트 요소입니다. status 속성은 Log4j 자체의 로그 레벨을 설정합니다.

 


Appenders
로그를 출력할 위치와 형식을 정의합니다.

<Appenders>
    <RollingFile name="RollingFile"
        fileName="log/log.log" filePattern="log/log-%d{yyyy-MM-dd}.log" append="false">
        <PatternLayout charset="UTF-8" pattern="%d %5p [%c] %m%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%-5level] %logger - %msg%n" />
    </Console>
</Appenders>

RollingFile: 파일에 로그를 기록하며, 일정한 주기로 파일을 롤링합니다.
     1. fileName: 로그 파일의 이름입니다.
     2. filePattern: 롤링된 파일의 이름 패턴입니다.
     3. PatternLayout: 로그 메시지의 형식을 정의합니다.
     4. Policies: 롤링 정책을 정의합니다.
             TimeBasedTriggeringPolicy: 시간 기반 롤링 정책입니다.


Console: 콘솔에 로그를 출력합니다.
     1. target: 출력 대상입니다 (SYSTEM_OUT).

 


Loggers
로그 레벨과 Appender를 정의합니다.

 

<Loggers>
    <Root level="DEBUG" additivity="false">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingFile" />
    </Root>
    <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingFile" />
    </logger>
</Loggers>

 

Root: 기본 로거로, 모든 로그 이벤트를 처리합니다.
     1. level: 로그 레벨입니다 (DEBUG).
     2. AppenderRef: 사용할 Appender를 참조합니다.
logger: 특정 패키지나 클래스에 대한 로거를 정의합니다.
     1. name: 로거의 이름입니다 (org.apache.ibatis).
     2. level: 로그 레벨입니다 (DEBUG).
     3. AppenderRef: 사용할 Appender를 참조합니다.

이 설정 파일은 로그를 콘솔과 파일에 출력하며, 파일은 매일 롤링됩니다. org.apache.ibatis 패키지의 로그는 DEBUG 레벨로 출력됩니다.



Q2.

<RollingFile name="RollingFile" fileName="log/log.log" filePattern="log/log-%d{yyyy-MM-dd}.log" append="false"> 
여기서 append false 는 뭐를 뜻해?




A2.
append="false"는 로그 파일에 새로운 로그를 추가할 때 기존 파일을 덮어쓰도록 설정하는 것입니다. 즉, append="false"로 설정하면 로그 파일이 새로 생성될 때마다 기존 로그 파일의 내용이 지워지고 새로운 로그가 기록됩니다.

반대로 append="true"로 설정하면 기존 로그 파일의 내용이 유지되고 새로운 로그가 파일 끝에 추가됩니다.

 

 

 

Q3.

<TimeBasedTriggeringPolicy interval="1" modulate="true" /> 
이건 뭐를 뜻하는거야?

 

 

 

A3.
<TimeBasedTriggeringPolicy interval="1" modulate="true" />는 로그 파일의 롤링 정책을 시간 기반으로 설정하는 요소입니다. 각 속성의 의미는 다음과 같습니다:

interval="1": 로그 파일이 롤링되는 주기를 설정합니다. 여기서는 1을 설정하여 매일 로그 파일을 롤링합니다.
modulate="true": 롤링 시간을 조정합니다. true로 설정하면 로그 파일이 정확히 자정에 롤링됩니다. false로 설정하면 애플리케이션이 시작된 시점부터 interval에 따라 롤링됩니다.


이 설정은 로그 파일이 매일 자정에 롤링되도록 합니다.

 

 

 

Q4.

interval은 날 단위야?

 

 

 

A4.

interval="1"은 기본적으로 시간 단위를 의미합니다. interval="1"은 1시간마다 롤링을 의미합니다. 하지만 modulate="true"로 설정하면 로그 파일이 매일 자정에 롤링됩니다.

만약 일 단위로 롤링을 설정하고 싶다면, interval="1"과 modulate="true"를 함께 사용하여 매일 자정에 로그 파일이 롤링되도록 할 수 있습니다.

 

 

 

Q5.

Console: 콘솔에 로그를 출력합니다. target: 출력 대상입니다 (SYSTEM_OUT). 
이게 Java의 SYSTEM_OUT을 통해서 로그를 출력한다는거야?

 

 

 

A5.

네, 맞습니다. target="SYSTEM_OUT"은 로그를 Java의 System.out을 통해 출력한다는 의미입니다. 이는 콘솔에 로그 메시지를 출력하는 것을 의미합니다.

 


예를 들어, 다음과 같은 설정은 로그 메시지를 콘솔에 출력합니다:

 

<Console name="Console" target="SYSTEM_OUT">
    <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%-5level] %logger - %msg%n" />
</Console>

 

이 설정은 로그 메시지를 표준 출력 스트림(System.out)으로 보내어 콘솔에 표시합니다.

 

 

 

Q6.

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%-5level] %logger - %msg%n" /> 
이건 SYSTEM_OUT 으로 출력할 서식이고?

 

 

 

A6.
네, 맞습니다. <PatternLayout> 요소는 로그 메시지의 출력 형식을 정의합니다.

 

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%-5level] %logger - %msg%n" />

이 설정은 로그 메시지를 다음과 같은 형식으로 출력합니다:

%d{yyy-MM-dd HH:mm:ss}: 로그가 기록된 날짜와 시간 (예: 2023-10-05 14:30:00)
[%-5level]: 로그 레벨 (예: [INFO], [DEBUG])
%logger: 로거 이름 (예: com.example.MyClass)
%msg: 로그 메시지
%n: 줄 바꿈 문자


따라서, 이 패턴은 로그 메시지를 SYSTEM_OUT (표준 출력 스트림)으로 출력할 때 적용되는 서식을 정의합니다. 예를 들어, 로그 메시지가 다음과 같이 출력될 수 있습니다:

 

2023-10-05 14:30:00 [INFO ] com.example.MyClass - This is a log message

 

 

Q7.

Root level="DEBUG" additivity="false"> 여기의 additivity는 뭐야?

 

 

 

A7.
additivity="false"는 상위 로거로 로그 이벤트를 전파할지 여부를 결정하는 속성입니다.

additivity="true": 현재 로거의 로그 이벤트가 상위 로거로 전파됩니다. 즉, 현재 로거와 상위 로거 모두 로그 이벤트를 처리합니다.
additivity="false": 현재 로거의 로그 이벤트가 상위 로거로 전파되지 않습니다. 즉, 현재 로거만 로그 이벤트를 처리합니다.


예를 들어, 다음과 같은 설정이 있을 때:

 

<Loggers>
    <Root level="DEBUG" additivity="false">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingFile" />
    </Root>
</Loggers>

 

additivity="false"로 설정하면 Root 로거의 로그 이벤트는 상위 로거로 전파되지 않고, Root 로거에만 정의된 Appender들(Console과 RollingFile)에 의해 처리됩니다.

 

 

 

Q8.

상위 로거와 하위 로거는 무슨 말이야?

 

 

 

A8.

상위 로거와 하위 로거는 로거 계층 구조에서의 관계를 의미합니다. 로거는 패키지 구조를 기반으로 계층 구조를 형성합니다. 예를 들어, com.example 패키지의 로거는 com 패키지의 로거의 하위 로거가 됩니다.

 


예시

 

<Loggers>
    <Root level="DEBUG" additivity="false">
        <AppenderRef ref="Console" />
    </Root>
    <Logger name="com.example" level="INFO" additivity="true">
        <AppenderRef ref="File" />
    </Logger>
</Loggers>

 

Root 로거는 모든 로거의 상위 로거입니다.
com.example 로거는 Root 로거의 하위 로거입니다.

 


additivity 속성


additivity="true": com.example 로거의 로그 이벤트는 File Appender뿐만 아니라 상위 로거인 Root 로거의 Console Appender에도 전달됩니다.
additivity="false": com.example 로거의 로그 이벤트는 File Appender에만 전달되고, 상위 로거인 Root 로거로 전달되지 않습니다.

 


예시 설명

 

<Logger name="com.example" level="INFO" additivity="true">
    <AppenderRef ref="File" />
</Logger>

 

com.example 로거는 INFO 레벨로 설정되어 있으며, File Appender를 사용합니다.
additivity="true"로 설정되어 있으므로, com.example 로거의 로그 이벤트는 Root 로거의 Console Appender에도 전달됩니다.

<Root level="DEBUG" additivity="false">
    <AppenderRef ref="Console" />
</Root>

Root 로거는 DEBUG 레벨로 설정되어 있으며, Console Appender를 사용합니다.
additivity="false"로 설정되어 있으므로, Root 로거의 로그 이벤트는 상위 로거로 전달되지 않습니다 (사실 Root 로거는 최상위 로거이므로 상위 로거가 없습니다).


이와 같이, additivity 속성은 로그 이벤트가 상위 로거로 전파되는지 여부를 제어합니다.


 

Q9.
<Root level="DEBUG" additivity="false"> <AppenderRef ref="Console" /> <AppenderRef ref="RollingFile" /> </Root> <logger name="org.apache.ibatis" level="DEBUG" additivity="false"> <AppenderRef ref="Console" /> <AppenderRef ref="RollingFile" /> </logger> 
여기서는 root 로거와 org.apache.ibatis 로거 둘 다 상위 로거로 전파하지 않는거야?

 

 

 

A9.

네, 맞습니다. additivity="false"로 설정된 경우, 해당 로거의 로그 이벤트는 상위 로거로 전파되지 않습니다. 따라서, Root 로거와 org.apache.ibatis 로거 모두 상위 로거로 로그 이벤트를 전파하지 않습니다.

 


설정 요약

 

<Root level="DEBUG" additivity="false">
    <AppenderRef ref="Console" />
    <AppenderRef ref="RollingFile" />
</Root>
<logger name="org.apache.ibatis" level="DEBUG" additivity="false">
    <AppenderRef ref="Console" />
    <AppenderRef ref="RollingFile" />
</logger>

 

Root 로거:
     1. 로그 레벨: DEBUG

     2. Appender: Console, RollingFile
     3. additivity="false": 상위 로거로 로그 이벤트를 전파하지 않음 (최상위 로거이므로 상위 로거가 없음)


org.apache.ibatis 로거:
     1. 로그 레벨: DEBUG
     2. Appender: Console, RollingFile
     3. additivity="false": 상위 로거로 로그 이벤트를 전파하지 않음 (Root 로거로 전파되지 않음)


이 설정에서는 org.apache.ibatis 로거의 로그 이벤트가 Root 로거로 전파되지 않으며, 각각의 로거는 자신에게 정의된 Appender를 통해서만 로그를 처리합니다.

 

 

 

Q10.

<logger name="org.apache.ibatis" level="DEBUG" additivity="false"> <AppenderRef ref="Console" /> <AppenderRef ref="RollingFile" /> </logger>

여기에서의 Console과 RollingFile는, 

    <Appenders>
    <RollingFile name="RollingFile"
        fileName="log/log.log" filePattern="log/log-%d{yyyy-MM-dd}.log" append="false">
        <PatternLayout charset="UTF-8" pattern="%d %5p [%c] %m%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%-5level] %logger - %msg%n" />
    </Console>
</Appenders>


여기에서 작성한 RollingFile 이라는 appender 와 Console 이라는 appender 인거야?

 

 

 

A10.
네, 맞습니다. <logger> 요소에서 참조하는 Console과 RollingFile은 <Appenders> 섹션에서 정의한 Appender들입니다.

 

 

설정 요약

 

<Appenders>
    <RollingFile name="RollingFile"
        fileName="log/log.log" filePattern="log/log-%d{yyyy-MM-dd}.log" append="false">
        <PatternLayout charset="UTF-8" pattern="%d %5p [%c] %m%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss} [%-5level] %logger - %msg%n" />
    </Console>
</Appenders>

<logger name="org.apache.ibatis" level="DEBUG" additivity="false">
    <AppenderRef ref="Console" />
    <AppenderRef ref="RollingFile" />
</logger>

 

설명


<Appenders> 섹션에서 RollingFile과 Console이라는 이름의 Appender를 정의했습니다.
<logger name="org.apache.ibatis" level="DEBUG" additivity="false">에서 <AppenderRef ref="Console" />와 <AppenderRef ref="RollingFile" />는 각각 <Appenders> 섹션에서 정의한 Console과 RollingFile Appender를 참조합니다.


따라서, org.apache.ibatis 로거는 로그 메시지를 Console과 RollingFile Appender를 통해 출력합니다.