> For the complete documentation index, see [llms.txt](https://tech.x2bee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tech.x2bee.com/dev-guide/dev-start/integrations/undefined.md).

# 로깅 설정

이 문서는 로깅 설정에 대해 다룹니다.

로깅은 정보를 제공하는 일련 기록인 로그(Log)를 생성하도록 시스템을 작성하는 것을 말합니다.

아래에서는 쿼리로깅을 설정하는 파일 구조와 로깅 라이브러리인 logback 관련 설정 방법에 대해 설명합니다.

***

## 로깅 관련 프로퍼티 설정

* 로깅 파일 저장 위치 설정
* log4jdbc 설정 작성
* logback 설정 작성
* 시스템 콘솔에 찍히는 로그 설정

## 쿼리로깅 파일 구조

프로젝트의 리소스 폴더 하위에 다음과 같은 파일을 배치합니다:

* src/main/resources/log4jdbc.log4j2.properties — 쿼리로깅 log4jdbc 설정파일
* src/main/resources/loback-spring.xml — logback 관련 설정파일

예시 트리:

```
/src/main/resources
├─ log4jdbc.log4j2.properties
└─ loback-spring.xml
```

## 쿼리로깅 log4jdbc 설정 파일 (properties)

resource 폴더 하위에 아래 파일을 추가합니다.

파일 내용 예시:

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

## logback 관련 설정

* 파일 위치: src/main/resources/{ } 폴더 하위에 loback-spring.xml 파일 생성 및 설정
* consoleAppender: 시스템 콘솔에 출력되는 로그 정보 설정

아래는 loback-spring.xml 파일의 전체 예시 내용입니다.

{% code title="loback-spring.xml" %}

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

    <springProperty scope="context" name="myappName" source="spring.application.name"/>

    <property name="MSG_FORMAT"
              value="%d{yyyy-MM-dd HH:mm:ss} [${myappName}] [%-5p] [%t] [%X{traceId},%X{spanId}] [%F::%M\(%L\)] [%X{requestURL}] : %m%n"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${MSG_FORMAT}</pattern>
        </layout>
    </appender>

    <property name="COLOR_MSG_FORMAT"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss}){faint} %clr([%-5p]) [%X{requestURL}] %clr([%X{traceId},%X{spanId}]){magenta} %clr([%30.-30F::%-20.20M\(%4L\)]){cyan} %clr(:){faint} %m%n"/>

    <appender name="COLOR_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${COLOR_MSG_FORMAT}</pattern>
        </layout>
    </appender>

    <springProfile name="local, default">
        <!-- log4jdbc 옵션 설정 -->
        <logger name="jdbc" level="OFF"/>
        <!-- 커넥션 open close 이벤트 로그로 남김 -->
        <logger name="jdbc.connection" level="OFF"/>
        <!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여짐 -->
        <logger name="jdbc.sqlonly" level="OFF"/>
        <!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함 -->
        <logger name="jdbc.sqltiming" level="DEBUG"/>
        <!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남김. 방대한 양의 로그 생성 -->
        <logger name="jdbc.audit" level="OFF"/>
        <!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남김 -->
        <logger name="jdbc.resultset" level="OFF"/>
        <!-- SQL 결과 조회된 데이터의 table을 로그로 남김 -->
        <logger name="jdbc.resultsettable" level="DEBUG"/>

        <logger name="com.amazonaws" level="error"/>

        <logger name="org.springframework.jdbc.datasource.DataSourceTransactionManager" additivity="false" level="off">
            <appender-ref ref="COLOR_STDOUT" />
        </logger>

        <logger name="com.x2bee.common" additivity="false" level="debug">
            <appender-ref ref="COLOR_STDOUT" />
        </logger>

        <logger name="com.x2bee.api" additivity="false" level="debug">
            <appender-ref ref="COLOR_STDOUT" />
        </logger>

        <root level="info">
            <appender-ref ref="COLOR_STDOUT" />
        </root>
    </springProfile>

    <springProfile name="dev, stg, qa, prd">
        <appender name="logbackTcp" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>fluentd-svc.thm-mgmt:24220</destination>
            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <providers>
                    <timestamp/>
                    <mdc />
                    <pattern>
                        <pattern> { "project": "${myappName}" } </pattern>
                    </pattern>
                    <logLevel/>
                    <context />
                    <threadName/>
                    <loggerName/>
                    <callerData/>
                    <message/>
                    <stackTrace/>
                </providers>
            </encoder>
        </appender>
    </springProfile>

    <springProfile name="dev, stg, qa">
        <logger name="com.x2bee.common" additivity="false" level="debug">
            <appender-ref ref="logbackTcp" />
        </logger>

        <logger name="com.x2bee.api" additivity="false" level="debug">
            <appender-ref ref="logbackTcp" />
        </logger>

        <root level="info">
            <appender-ref ref="logbackTcp" />
        </root>
    </springProfile>

    <springProfile name="prd">
        <logger name="com.x2bee.common" additivity="false" level="warn">
            <appender-ref ref="logbackTcp" />
        </logger>

        <logger name="com.x2bee.api" additivity="false" level="warn">
            <appender-ref ref="logbackTcp" />
        </logger>

        <root level="info">
            <appender-ref ref="logbackTcp" />
        </root>
    </springProfile>
</configuration>
```

{% endcode %}
