> 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 %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tech.x2bee.com/dev-guide/dev-start/integrations/undefined.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
