โœ๏ธโžก๏ธ๐Ÿ“ก โ€œ์–ด๋–ป๊ฒŒ ์ฐ์„๊นŒโ€์—์„œ โ€œ์–ด๋””๋กœ ๋ณด๋‚ผ๊นŒโ€๋กœ logback-spring.xml ์„ค๊ณ„๊ธฐ

๋‚˜๋‚˜'s Brainยท2025๋…„ 9์›” 9์ผ
0

๊ฐœ๋…Study

๋ชฉ๋ก ๋ณด๊ธฐ
23/25
post-thumbnail

์ง€๋‚œ ๊ธ€์—์„œ Logback์ด ๋ญ”์ง€ ๊ฐ ์žก์•˜๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” ๋“œ๋””์–ด logback-spring.xml์„ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

๋ฌดํ„ฑ๋Œ€๊ณ  xml์„ ์“ฐ๊ธฐ๋ณด๋‹ค ๋ˆ„๊ฐ€ ๋ณผ ๋กœ๊ทธ์ธ์ง€, ์–ด๋””์„œ ์†Œ๋น„ํ• ์ง€, ์–ด๋–ค ํฌ๋งท์ด ๋งž๋Š”์ง€, ๊ณตํ†ต ํ‚ค(MDC)๋ฅผ ๋ฌด์—‡์œผ๋กœ ๊ณ ์ •ํ• ์ง€๋ถ€ํ„ฐ ์ •๋ฆฌํ–ˆ๋‹ค.

๐Ÿšฆ ๋กœ๊ทธ ์„ค๊ณ„ ์ „์— ๋˜์ง„ ์งˆ๋ฌธ๋“ค

๋ˆ„๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋ณผ๊นŒ? โ†’ ๊ฐœ๋ฐœ์ž, ์šด์˜์ž, ELK ์‹œ์Šคํ…œ
์–ด๋””์— ๋‚จ๊ธธ๊นŒ? โ†’ ์ฝ˜์†”, ํ…์ŠคํŠธ, JSON, Kafka
์–ด๋–ค ํฌ๋งท์œผ๋กœ? โ†’ ์ฝ˜์†”์€ ๊ฐ€๋…์„ฑ, ํ…์ŠคํŠธ๋Š” Key=Value, JSON์€ ๊ตฌ์กฐํ™”
MDC ํ‘œ์ค€์€? โ†’ traceId, spanId, userId, uri, method, clientIp

์ด ๋„ค ๊ฐ€์ง€๊ฐ€ ์ •๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด xml ์„ค์ •์€ ๊ฒฐ๊ตญ โ€œ์ฐํžˆ๋Š” ๋Œ€๋กœ ์ฐ๋Š” ๋กœ๊ทธโ€๋กœ ๋๋‚˜๋ฒ„๋ฆฐ๋‹ค.
๋‚˜๋Š” ๊ทธ๋ž˜์„œ ๋จผ์ € โ€œ๋กœ๊ทธ์˜ ๋ชฉ์ โ€์„ ์ •ํ•˜๊ณ , ๊ฑฐ๊ธฐ์— ๋งž์ถฐ Appender๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฑธ ์ถœ๋ฐœ์ ์œผ๋กœ ์‚ผ์•˜๋‹ค.

์ด ์งˆ๋ฌธ์„ ํ’€๊ณ  ๋‚˜๋‹ˆ, ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋„ค ๊ฐˆ๋ž˜ ์ถœ๊ตฌ๊ฐ€ ์ž๋ฆฌ๋ฅผ ์žก์•˜๋‹ค.
๐Ÿ‘‰ CONSOLE ยท TEXT_FILE ยท JSON_FILE ยท KAFKA_JSON

๊ฒฐ๊ตญ ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€์˜€๋‹ค.
MDC ํ‚ค๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๊ฒƒ, ๊ทธ๋ฆฌ๊ณ  Appender๋ฅผ ์šฉ๋„๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ !!!


๐Ÿค” ๋จผ์ €, ์™œ ๊ตณ์ด logback-spring.xml์ธ๊ฐ€ ?

logback.xml๋„ ๋™์ž‘์€ ํ•˜์ง€๋งŒ, Spring Boot๋Š” logback-spring.xml์„ ๊ถŒ์žฅํ•œ๋‹ค.
์จ๋ณด๋‹ˆ ๊ทธ ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ–ˆ๋‹ค.

  • Spring ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ${LOG_PATH}, ${KAFKA_BOOTSTRAP_SERVERS} ๊ฐ™์€ ๊ฐ’์„ application.yml์—์„œ ๊ฐ€์ ธ์™€ ์„ค์ •๊ณผ ํ™˜๊ฒฝ์„ ํ•œ๋ชธ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœํ•„ ๋ถ„๊ธฐ๋ฅผ xml ์•ˆ์—์„œ ์ง์ ‘ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค. <springProfile name="dev|prod">๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ™˜๊ฒฝ๋ณ„ Appenderยท๋ ˆ๋ฒจ ๊ตฌ์„ฑ์„ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถ€ํŠธ ์ดˆ๊ธฐํ™” ํƒ€์ด๋ฐ๊ณผ ๋งž์•„๋–จ์–ด์ง„๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ์•ˆ์ •์ ์œผ๋กœ ๋กœ๊น…์ด ์ดˆ๊ธฐํ™”๋œ๋‹ค.

์š”์•ฝํ•˜๋ฉด, logback.xml์€ ์ˆœ์ˆ˜ Logback ์„ค์ •์ด๊ณ , logback-spring.xml์€ Spring๊ณผ ํ•จ๊ป˜ ์›€์ง์ด๋ฉฐ ํ™˜๊ฒฝ ๋ถ„๊ธฐ๋ฅผ ํ’ˆ์€ ์„ค์ •์ด๋‹ค.
๋‚˜๋Š” ์ด๊ฑธ ์•Œ์•˜์„ ๋•Œ, โ€œ์•„, ๋กœ๊ทธ ์„ค์ •๋„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ™˜๊ฒฝ ๋ถ„๊ธฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•˜๋Š”๊ตฌ๋‚˜โ€๋ผ๋Š” ๊ฑธ ์ œ๋Œ€๋กœ ์ฒด๊ฐํ–ˆ๋‹ค.

logback.xml: Spring ํ”„๋กœํผํ‹ฐ/ํ”„๋กœํ•„ ๋ถˆ๊ฐ€, ์ˆœ์ˆ˜ Logback ๊ตฌ๋ฌธ
logback-spring.xml: ${} ์ง€์›, <springProfile> ์ง€์›, ๋ถ€ํŠธ์™€ ์ž์—ฐ์Šค๋Ÿฌ์šด ์—ฐ๋™


๐Ÿ“ก MDC ํ‚ค ํ‘œ์ค€ํ™” : ๋กœ๊ทธ์˜ ๊ณต์šฉ์–ด ๋งŒ๋“ค๊ธฐ

Appender๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋‘๋”๋ผ๋„, ๊ณต์šฉ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด ๋กœ๊ทธ๋Š” ์ œ๊ฐ๊ฐ์˜ ์–ธ์–ด๋กœ ๋งํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ์„œ๋น„์Šค ๊ณณ๊ณณ์—์„œ ๋‚จ๊ธฐ๋Š” ๋งฅ๋ฝ์„ MDC(Mapped Diagnostic Context)๋กœ ํ†ต์ผํ–ˆ๋‹ค.

  • ์ด๋ฆ„์€ ์งง๊ณ  ์ผ๊ด€๋˜๊ฒŒ ๊ฐ€์ ธ๊ฐ”๋‹ค.
  • ๊ฐ’์ด ์—†์–ด๋„ ํ‚ค๋Š” ํ•ญ์ƒ ์œ ์ง€ํ•œ๋‹ค.
    (๋น„์–ด ์žˆ๋‹ค๊ณ  ํ‚ค ์ž์ฒด๊ฐ€ ๋น ์ง€๋ฉด ๋ถ„์„ ๋‹จ๊ณ„์—์„œ ๊ณค๋ž€ํ•ด์ง„๋‹ค.)

์ตœ์ข…์ ์œผ๋กœ ํ‘œ์ค€ํ™”ํ•œ ํ‚ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • traceId, spanId โ€” ๋ถ„์‚ฐ ์ถ”์ ์˜ ์‹ค๋งˆ๋ฆฌ๋กœ ์‚ผ์•˜๋‹ค.
  • timestamp โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ์ค€ ์‹œ๊ฐ์œผ๋กœ ํ†ต์ผํ–ˆ๋‹ค.
  • userId โ€” ์ธ์ฆ ์ „ ๊ตฌ๊ฐ„์€ anon์œผ๋กœ ๊ณ ์ •ํ–ˆ๋‹ค.
  • uri, method, clientIp, userAgent โ€” ์š”์ฒญ ๋ฉ”ํƒ€๋ฅผ ๊ณตํ†ต ํ‚ค๋กœ ์žก์•˜๋‹ค.

์ด ๊ฐ’๋“ค์€ ํ•„ํ„ฐ/์ธํ„ฐ์…‰ํ„ฐ์—์„œ ์ฃผ์ž…ํ–ˆ๊ณ , ๋น„๋™๊ธฐ ํ๋ฆ„์—๋„ ์ „ํŒŒ๋˜๋„๋ก ๋ณ„๋„ ์œ ํ‹ธ์„ ๋’€๋‹ค.
๋•๋ถ„์— ์ปจํŠธ๋กค๋Ÿฌ๋“  ๋ฐฐ์น˜๋“ , ๊ฐ™์€ ์‚ฌ๊ฑด์€ ์–ธ์ œ๋‚˜ ๊ฐ™์€ ์ด๋ฆ„ํ‘œ๋ฅผ ๋‹ฌ๊ณ  ํ˜๋Ÿฌ๊ฐ”๋‹ค.
๊ทธ๋ฆฌ๊ณ  Kibana์—์„œ๋Š” userId=anon ์กฐ๊ฑด์œผ๋กœ๋„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ณ , Excel์—์„œ๋„ ์ปฌ๋Ÿผ์ด ๊นจ์ง€์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ‘‰ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€(Trace ๊ด€๋ จ)์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.


๐Ÿ—‚๏ธ logback-spring.xml, ์ด๋ ‡๊ฒŒ ๊ตฌ์กฐํ™”ํ–ˆ๋‹ค

ํ•œ ๊ฐ€์ง€ ํฌ๋งท์œผ๋กœ ์ „๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋‹ค ๋ณด๋ฉด ์–ด๋””์„ ๊ฐ€๋Š” ํƒ€ํ˜‘์ด ์ƒ๊ฒผ๋‹ค. ๊ทธ๋ž˜์„œ ์•„์˜ˆ ์ถœ๊ตฌ๋ฅผ ๋„ค ๊ฐˆ๋ž˜๋กœ ๋ฝ‘์•˜๋‹ค.

์ฝ˜์†”์€ ๊ฐœ๋ฐœ์šฉ ๊ฐ€๋…์„ฑ, ํ…์ŠคํŠธ๋Š” ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ธฐ๋ก, JSON์€ ๊ธฐ๊ณ„๊ฐ€ ๋จน๋Š” ๊ตฌ์กฐํ™”, Kafka๋Š” ์ค‘์•™ ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ ์ „์šฉ.

1. CONSOLE โ†’ ๊ฐœ๋ฐœ์ž ๋ˆˆ์œผ๋กœ ํ™•์ธ (๊ฐœ๋ฐœยท๋””๋ฒ„๊น…์šฉ)
2. TEXT_FILE โ†’ RestAPI, Excel ํŒŒ์‹ฑ ๋“ฑ ์‚ฌ๋žŒ์šฉ ๊ธฐ๋ก
3. JSON_FILE โ†’ Kafka ์žฅ์•  ๋Œ€๋น„, Filebeat Fallback์šฉ ๋จธ์‹ ์šฉ ๊ตฌ์กฐํ™” ๋กœ๊ทธ
4. KAFKA_JSON โ†’ ์ค‘์•™ ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ ์ „์†ก (ELK ์Šคํƒ์šฉ)

๊ฐ™์€ ์‚ฌ๊ฑด์ด ๋„ค ๊ฐˆ๋ž˜๋กœ ๋‚˜๋‰˜์–ด๋„, MDC ์Šคํ‚ค๋งˆ๊ฐ€ ๊ฐ™์œผ๋‹ˆ ์„œ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ฝ˜์†”์—์„œ ๋ณธ traceId๋ฅผ Kibana์—์„œ ์ด์–ด์„œ ์ถ”์ ํ•˜๊ณ , ํ…์ŠคํŠธ ํŒŒ์ผ์—์„œ ์ฐพ์€ userId๋กœ Kafka ํ† ํ”ฝ ๋กœ๊ทธ๋ฅผ ์ขํ˜€๋ณด๋Š” ์‹์ด๋‹ค.

์ด์ œ๋Š” โ€œ๋กœ๊ทธ๋ฅผ ๋งŽ์ด ์ฐ์žโ€๊ฐ€ ์•„๋‹ˆ๋ผ, โ€œ๋กœ๊ทธ๋ฅผ ์–ด๋””๋กœ, ์–ด๋–ค ํ‘œ์ •์œผ๋กœ ๋ณด๋‚ผ์ง€โ€๊ฐ€ ์ค‘์š”ํ•œ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋‹ค.

1. CONSOLE โ€” ๊ฐœ๋ฐœ์ž ๋ˆˆ

๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ฑด ์–ธ์ œ๋‚˜ ์ฝ˜์†”์ด๋‹ค.
๋น ๋ฅด๊ฒŒ ์›์ธ์„ ์ฐพ์œผ๋ ค๋ฉด ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ€๋…์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.
๊ทธ๋ž˜์„œ ํŒจํ„ด์—๋Š” traceId, spanId, userId ๊ฐ™์€ ์ถ”์ ์šฉ ํ‚ค๋“ค์„ ์ „๋ถ€ ๋„ฃ์—ˆ๋‹ค.

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <pattern>
      %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}
      [traceId:%X{traceId}] [spanId:%X{spanId}] [userId:%X{userId}]
      [uri:%X{uri}] [method:%X{method}] [ip:%X{clientIp}] - %msg%n
    </pattern>
  </encoder>
</appender>

2. TEXT_FILE โ€” ์šด์˜์ž๊ฐ€ ์ง์ ‘ ๋ณด๋Š” ๊ธฐ๋ก

์šด์˜ ์ค‘์—๋Š” โ€œ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋กœ๊ทธ๋ฅผ ์—ด์–ด๋ณด๋Š” ์ˆœ๊ฐ„โ€์ด ๊ฝค ๋งŽ๋‹ค.
ํŠน์ • ์š”์ฒญ์„ grep์œผ๋กœ ์ถ”์ ํ•˜๊ฑฐ๋‚˜, Excel๋กœ ๋‚ด๋ ค๋ฐ›์•„ ๋ถ„์„ํ•  ๋•Œ๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค.

๊ทธ๋ž˜์„œ TEXT_FILE์€ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์ข‹์€ Key=Value ํ˜•ํƒœ๋กœ ํ‘œ์ค€ํ™”ํ–ˆ๋‹ค.
logs/text/ ํด๋”์— ๋‚ ์งœ๋ณ„๋กœ ๋กค๋ง๋˜๋„๋ก ์„ค๊ณ„ํ•ด, โ€œ์šด์˜์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœโ€๋ฅผ ๋ณด์žฅํ–ˆ๋‹ค.

<appender name="TEXT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${LOG_PATH}/text/client-requests.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH}/text/client-requests.%d{yyyy-MM-dd}.log</fileNamePattern>
    <maxHistory>30</maxHistory>
  </rollingPolicy>
  <encoder>
    <pattern>
      timestamp=%X{timestamp}, traceId=%X{traceId}, spanId=%X{spanId}, userId=%X{userId},
      uri=%X{uri}, method=%X{method}, clientIp=%X{clientIp}, userAgent=%X{userAgent},
      level=%level, logger=%logger{36}, message=%msg%n
    </pattern>
  </encoder>
</appender>

3. JSON_FILE โ€” Filebeat Fallback ์ €์žฅ์†Œ

Kafka๊ฐ€ ์žฅ์• ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋กœ๊ทธ๊ฐ€ ๋Š๊ธธ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿด ๋•Œ ์ตœ์†Œํ•œ์˜ ์•ˆ์ „๋ง์œผ๋กœ JSON ํŒŒ์ผ์„ ๋‘์—ˆ๋‹ค.

์ด Appender๋Š” Filebeat๊ฐ€ ๋ฐ”๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐํ™” ๋กœ๊ทธ๋ฅผ logs/json/์— ์Œ“๋Š”๋‹ค.
Kafka๊ฐ€ ์ž ์‹œ ๋ฉˆ์ถ”๋”๋ผ๋„, ์„œ๋น„์Šค ๊ธฐ๋ก์€ ์—ฌ์ „ํžˆ ๋‚จ์•„์žˆ์–ด โ€œ๋จธ์‹ ์ด ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์›๋ณธ ๋ฐ์ดํ„ฐโ€๊ฐ€ ๋ณด์กด๋œ๋‹ค.

<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${LOG_PATH}/json/app-log.json</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH}/json/app-log.%d{yyyy-MM-dd}.json</fileNamePattern>
    <maxHistory>30</maxHistory>
  </rollingPolicy>
  <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
    <providers>
      <timestamp /><logLevel /><loggerName /><threadName /><message /><mdc />
    </providers>
  </encoder>
</appender>

4. KAFKA_JSON โ€” ์ค‘์•™ ํŒŒ์ดํ”„๋ผ์ธ ์ „์†ก (App-logs ํ† ํ”ฝ)

์šด์˜ ๋กœ๊ทธ์˜ ์ตœ์ข… ๋ชฉ์ ์ง€๋Š” ELK ์Šคํƒ ๊ฐ™์€ ์ค‘์•™ ์ˆ˜์ง‘ ์‹œ์Šคํ…œ์ด๋‹ค.
๊ทธ๋ž˜์„œ KafkaAppender๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ๋ฐ”๋กœ app-logs ํ† ํ”ฝ์œผ๋กœ ๋ณด๋ƒˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” โ€œ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผโ€์ด ํ•ต์‹ฌ์ด๋ผ ํŒŒ์ผ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ† ํ”ฝ์œผ๋กœ ํ˜๋ ค๋ณด๋‚ธ๋‹ค.
์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด AsyncAppender๋กœ ๊ฐ์‹ธ ์•ˆ์ •์„ฑ์„ ๋†’์˜€๊ณ , MDC์™€ ์˜ˆ์™ธ ์ •๋ณด๊นŒ์ง€ JSON์— ๋‹ด์•„ ๋ณด๋ƒˆ๋‹ค.

<appender name="KAFKA_JSON" class="com.github.danielwegener.logback.kafka.KafkaAppender">
  <topic>app-logs</topic>
  <encoder class="com.github.danielwegener.logback.kafka.encoding.LayoutKafkaMessageEncoder">
    <layout class="net.logstash.logback.layout.LogstashLayout">
      <includeMdc>true</includeMdc>
      <includeException>true</includeException>
    </layout>
  </encoder>
  <producerConfig>bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS}</producerConfig>
  <producerConfig>acks=1</producerConfig>
</appender>

<appender name="ASYNC_KAFKA" class="ch.qos.logback.classic.AsyncAppender">
  <appender-ref ref="KAFKA_JSON"/>
  <queueSize>10000</queueSize>
  <neverBlock>true</neverBlock>
</appender>

<logger name="kafkaLogger" level="INFO" additivity="false">
  <appender-ref ref="ASYNC_KAFKA"/>
</logger>

๐Ÿ“‚ ํด๋” ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ

๊ธฐ๋ณธ spring.log๋Š” ์“ฐ์ง€ ์•Š์•˜๋‹ค. ๋‚ด๊ฐ€ ์„ค๊ณ„ํ•œ text / json ๋‘ ๊ฐˆ๋ž˜๋งŒ ์œ ์ง€ํ–ˆ๋‹ค.

logs/
โ”œโ”€ text/
โ”‚  โ””โ”€ client-requests.2025-09-09.log
โ””โ”€ json/
   โ””โ”€ app-log.2025-09-09.json

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฑด <file>(ํ˜„์žฌ ์“ฐ๋Š” ํŒŒ์ผ)๊ณผ <fileNamePattern>(๋กค๋ง ๊ฒฐ๊ณผ)์ด ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

๋‚˜๋Š” ์ด๊ฑธ ์‹ค์ˆ˜๋กœ ํ‹€๋ฆฐ ์ ์ด ์žˆ์—ˆ๊ณ , ์–ด์ œ ๋กœ๊ทธ๊ฐ€ ๋”ด ํด๋”์— ๊ฐ€๋ฒ„๋ ค์„œ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ๊ผฌ์ธ ์ ์ด ์žˆ๋‹ค.
๊ทธ ๋’ค๋กœ๋Š” ๋” ๋‹จํ˜ธํ•˜๊ฒŒ ํด๋”๋ฅผ ์ชผ๊ฐฐ๋‹ค......


๐ŸŒ ํ™˜๊ฒฝ๋ณ„ ๋ถ„๊ธฐ๋Š” xml ์•ˆ์—์„œ ๋๋ƒˆ๋‹ค

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฝ˜์†” ์œ„์ฃผ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํŒŒ์ผ๊ณผ ์นดํ”„์นด๊ฐ€ ์ฃผ๋ ฅ์œผ๋กœ ์‚ผ์•˜๋‹ค.
์ด ์ฐจ์ด๋ฅผ xml ์•ˆ์—์„œ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ logback-spring.xml์„ ์“ธ ์ˆ˜๋ฐ–์— ์—†๋Š” ์ด์œ ์˜€๋‹ค.

<springProfile name="dev">
  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="TEXT_FILE"/>
  </root>
</springProfile>

<springProfile name="prod">
  <root level="INFO">
    <appender-ref ref="TEXT_FILE"/>
    <appender-ref ref="JSON_FILE"/>
  </root>
  <logger name="kafkaLogger" level="INFO" additivity="false">
    <appender-ref ref="ASYNC_KAFKA"/>
  </logger>
</springProfile>

๐Ÿ”ฅ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ •๋ฆฌํ•˜์ž๋ฉด, ๋‚˜๋Š” logback-spring.xml์„ ์„ ํƒํ•œ ์ด์œ ๋ถ€ํ„ฐ MDC ํ‘œ์ค€ํ™” โ†’ ๋ชฉ์ ๋ณ„ Appender ๋ถ„๋ฆฌ โ†’ ๊ฒฝ๋กœยท๋กค๋ง ๋ช…ํ™•ํ™” โ†’ ํ™˜๊ฒฝ ๋ถ„๊ธฐ๊นŒ์ง€, ์šด์˜์„ ์ „์ œ๋กœ ํ•œ ์„ค๊ณ„ ๊ณผ์ •์„ ํ’€์–ด๋ƒˆ๋‹ค.

๋กœ๊ทธ๋ฐฑ ์„ค์ •์€ ๋‹จ์ˆœํžˆ โ€œ์ฐ๋Š” ๋ฒ•โ€์ด ์•„๋‹ˆ์—ˆ๋‹ค.
๐Ÿ‘‰ ๋ˆ„๊ฐ€, ์–ด๋””์„œ, ๋ฌด์—‡์„ ์œ„ํ•ด ๋กœ๊ทธ๋ฅผ ๋ณผ ๊ฒƒ์ธ์ง€๊นŒ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ณผ์ •์ด์—ˆ๋‹ค.

profile
"๋กœ์ปฌ์—์„  ๋ฌธ์ œ์—†์—ˆ๋Š”๋ฐโ€ฆ?"

0๊ฐœ์˜ ๋Œ“๊ธ€