spring boot logging ์ œ๋Œ€๋กœ ์•Œ๊ธฐ

spring boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋นผ๋†“์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ logging ์ด๋‹ค. spring boot logging ์„ค์ • ๋ฐฉ๋ฒ•๊ณผ ํ”„๋กœํŒŒ์ผ๋ณ„ logging์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ฑ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

Spring Boot์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Spring ํ”„๋ ˆ์ž„์›Œํฌ์˜ spring-jcl ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” Commons Logging API๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ํ•„์ˆ˜ ๋กœ๊น… ์ข…์†์„ฑ์ด ์—†๋‹ค. Logback์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋ž˜์Šค ๊ฒฝ๋กœ์— Logback๊ณผ spring-jcl์„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด์„œ spring-boot-sterter-logging ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ spring-boot-starter-web์ด spring-boot-starter-logging ์ข…์†์„ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— spring-boot-starter-web ์ข…์†์„ฑ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด Logback์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

spring boot logging
spring-boot-starter-logging ์˜์กด์„ฑ

์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด spring-boot-starter-logging ์˜์กด์„ฑ์€ spring-boot-starter ์˜์กด์„ฑ์— ํฌํ•จ๋˜์–ด ์žˆ๊ณ 
spring-boot-starter-web ์˜์กด์„ฑ์ด spring-boot-starter ์˜์กด์„ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
Spring Boot์—๋Š” ํด๋ž˜์Šค ๊ฒฝ๋กœ์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๊น…์„ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” LoggingSystem ์ถ”์ƒํ™”๊ฐ€ ์žˆ๋‹ค.
Logback์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Logback์ด ์ฒซ ๋ฒˆ์งธ๋กœ ์„ ํƒ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ Spring Boot๋Š” ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ์œ„์น˜์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ตฌ์„ฑ์„ ์„ ํƒํ•˜์ง€๋งŒ(Logback์˜ ๊ฒฝ์šฐ classpath:logback.xml), logging.config ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

spring boot logging ํŒŒ์ผ ์ถœ๋ ฅ

๊ธฐ๋ณธ์ ์œผ๋กœ Spring Boot๋Š” ์ฝ˜์†”์—๋งŒ ๋กœ๊น…ํ•˜๊ณ  ๋กœ๊ทธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฝ˜์†” ์ถœ๋ ฅ ์ด์™ธ์— ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ธฐ๋กํ•˜๋ ค๋ฉด logging.file.name ๋˜๋Š” logging.file.path ์†์„ฑ์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
๋””ํดํŠธ๋กœ ๋กœ๊ทธ ํŒŒ์ผ์˜ rotate ์‚ฌ์ด์ฆˆ๋Š” 10MB์ด๋ฉฐ ๋กœ๊ทธ ๋ ˆ๋ฒจ์€ ERROR, WARN, INFO ๋ ˆ๋ฒจ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค.

logging.file.name ์†์„ฑ

์ง€์ •๋œ ๋กœ๊ทธ ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ์„ค์ •์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ํ˜น์€ ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

logging:
  file:
    name: log/application.log
YAML

ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ log/application.log ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

logging.file.path ์†์„ฑ

์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— spring.log ํŒŒ์ผ์„ ๊ธฐ๋กํ•œ๋‹ค. ์„ค์ •์€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ํ˜น์€ ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

logging:
  file:
    path: log
YAML

ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ log/spring.log ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

logging.* ์†์„ฑ์€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋กœ๊น… ์ธํ”„๋ผ์™€๋Š” ๋…๋ฆฝ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ๊ตฌ์„ฑ ํ‚ค
(์˜ˆ: ๋กœ๊ทธ๋ฐฑ์„ ์œ„ํ•œ logback.configurationFile)๋Š” Spring Boot์—์„œ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

spring boot logging ํŒŒ์ผ Rotation

Logback์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ application.properties ํ˜น์€ application.yml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ lotation ์„ค์ •์„ ์ƒ์„ธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์™ธ ๋‹ค๋ฅธ ๋ชจ๋“  ๋กœ๊น… ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ์ง์ ‘ rotation ์„ค์ •์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
(ex. Log4j2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ log4j2.xml ๋˜๋Š” log4j2-spring.xml ํŒŒ์ผ์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.)
์ง€์›๋˜๋Š” rotation ์ •์ฑ… ์„ค์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

logging.logback.rollingpolicy.file-name-patternThe filename pattern used to create log archives.
logging.logback.rollingpolicy.clean-history-on-startIf log archive cleanup should occur when the application starts.
logging.logback.rollingpolicy.max-file-sizeThe maximum size of log file before it is archived.
logging.logback.rollingpolicy.total-size-capThe maximum amount of size log archives can take before being deleted.
logging.logback.rollingpolicy.max-historyThe maximum number of archive log files to keep (defaults to 7).

์ถœ์ฒ˜: https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging.file-rotation

spring boot logging ๋กœ๊ทธ ๋ ˆ๋ฒจ

์ง€์›๋˜๋Š” ๋ชจ๋“  ๋กœ๊น… ์‹œ์Šคํ…œ์€ logging.level.<logger>=<๋กœ๊ทธ๋ ˆ๋ฒจ>์„ ์‚ฌ์šฉํ•˜์—ฌ application.yml ํ˜น์€ application.properties ์—์„œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋กœ๊ทธ ๋ ˆ๋ฒจ์€ TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF ๊ฐ€ ์ง€์›๋˜๋ฉฐ root ๋กœ๊ฑฐ๋Š” logging.level.root๋กœ ์„ค์ •ํ•œ๋‹ค.

logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"
YAML

๋กœ๊ทธ ๋ ˆ๋ฒจ์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ๋„ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG๋Š” logging.level.org.springframework.web=DEBUG์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ๋กœ๊น… ์„ค์ •์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค. ๋ฆด๋ž™์Šค ๋ฐ”์ธ๋”ฉ์€ ํ•ญ์ƒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ณ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋กœ๊น…์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

spring boot logging ๋กœ๊ทธ ๊ทธ๋ฃน

์—ฌ๋Ÿฌ ๋กœ๊น… ๋Œ€์ƒ ํŒจํ‚ค์ง€๋ฅผ ํ•˜๋‚˜์˜ ๋กœ๊ทธ ๊ทธ๋ฃน์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

logging:
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"
  level:
    tomcat: "trace"
YAML

Spring Boot์—์„œ๋Š” ์‚ฌ์ „์— ์ •์˜๋œ ๋กœ๊น… ๊ทธ๋ฃน์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

weborg.springframework.core.codec
org.springframework.http
org.springframework.web
org.springframework.boot.actuate.endpoint.web org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.core
org.hibernate.SQL org.jooq.tools.LoggerListener

์ถœ์ฒ˜ https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging.log-groups

spring boot logging Custom Log Configuration

application.yml ์—์„œ ์ง€์›ํ•˜๋Š” ๋กœ๊น… ๊ด€๋ จ ์„ค์ • ์™ธ์— Logback์— ์‚ฌ์šฉ์ž ์ง€์ • ์„ค์ •์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์ค€ Logback ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. Logback์ด ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก classpath root์— logback.xml ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
Spring Boot Logback ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ logback-spring.xml์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
org.springframework.boot.logging.LoggingSystem ์‹œ์Šคํ…œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Spring Boot์—์„œ ํŠน์ • ๋กœ๊น… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’์€ LoggingSystem ๊ตฌํ˜„์˜ ์ •๊ทœํ™”๋œ ํด๋ž˜์Šค ์ด๋ฆ„์ด์–ด์•ผ ํ•œ๋‹ค. ๊ฐ’์„ none์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ Spring Boot์˜ ๋กœ๊น… ๊ตฌ์„ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
Log4J2LoggingSystem์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜ ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.

<!--
log4j2 ๋กœ๊น… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
spring-boot-starter-logging ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด
class org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
๊ทธ๋ƒฅ Spring Boot์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ ์šฉ๋˜๋Š” Logback ๋กœ๊น… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์ œ์ผ
์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
XML
Log4J2LoggingSystem์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
-Dorg.springframework.boot.logging.LoggingSystem=org.springframework.boot.logging.log4j2.Log4J2LoggingSystem

LogbackLoggingSystem์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ • (default)
-Dorg.springframework.boot.logging.LoggingSystem=org.springframework.boot.logging.logback.LogbackLoggingSystem

JavaLoggingSystem์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
-Dorg.springframework.boot.logging.LoggingSystem=org.springframework.boot.logging.java.JavaLoggingSystem
Plaintext

์‹œ์Šคํ…œ ์†์„ฑ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” org.springframework.boot.context.logging.LoggingApplicationListener ํด๋ž˜์Šค์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.
๊ฐ ๋กœ๊น… ์‹œ์Šคํ…œ์€ ์•„๋ž˜ ํ‘œ์™€ ๊ฐ™์ด ํŒŒ์ผ์„ ๋กœ๋”ฉํ•œ๋‹ค.

Logging SystemCustomization
Logback (LogbackLoggingSystem)logback-spring.xml, logback-spring.groovy, logback.xml ํ˜น์€ logback.groovy
Log4j2 (Log4J2LoggingSystem)log4j2-spring.xml ํ˜น์€ log4j2.xml
Java (JavaLoggingSystem)logging.properties

ํ‘œ์ค€ ๊ตฌ์„ฑ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Spring์ด ๋กœ๊ทธ ์ดˆ๊ธฐํ™”๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋ฉด ๋กœ๊น… ๊ตฌ์„ฑ์— -spring suffix๊ฐ€ ๋ถ™์€ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์‹คํ–‰ ๊ฐ€๋Šฅํ•œ jar์—์„œ ์‹คํ–‰ํ•  ๋•Œ Java Util Logging ํด๋ž˜์Šค ๋กœ๋”ฉ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ€๊ธ‰์  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ jar์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ด๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ •์„ ์œ„ํ•ด์„œ ์ผ๋ถ€ ์„ค์ •ํ•ญ๋ชฉ์€ Spring ํ™˜๊ฒฝ์—์„œ system property๋กœ ์ „์†ก๋œ๋‹ค. system property๋กœ ์ „์†ก๋˜๋Š” property๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๊น… ์„ค์ •์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด application.yml ์—์„œ logging.file.path ์„ค์ •์€ LOG_PATH system property๋กœ ์ „์†ก๋˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ •์—์„œ๋Š” ${LOG_PATH} (=logging.file.path)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ logging.file.path๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ LOGGING_FILE_PATH์™€ ๋งตํ•‘๋˜๋ฏ€๋กœ LOGGING_FILE_PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์—ญ์‹œ LOG_PATH system property๋กœ ์ „์†ก๋˜์–ด ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ๊น… ์„ค์ •์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
system property๋กœ ์ „์†ก๋˜๋Š” ์†์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Spring EnvironmentSystem PropertyComments
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORDThe conversion word used when logging exceptions.
logging.file.nameLOG_FILEIf defined, it is used in the default log configuration.
logging.file.pathLOG_PATHIf defined, it is used in the default log configuration.
logging.pattern.consoleCONSOLE_LOG_PATTERNThe log pattern to use on the console (stdout).
logging.pattern.dateformatLOG_DATEFORMAT_PATTERNAppender pattern for log date format.
logging.charset.consoleCONSOLE_LOG_CHARSETThe charset to use for console logging.
logging.threshold.consoleCONSOLE_LOG_THRESHOLDThe log level threshold to use for console logging.
logging.pattern.fileFILE_LOG_PATTERNThe log pattern to use in a file (if LOG_FILE is enabled).
logging.charset.fileFILE_LOG_CHARSETThe charset to use for file logging (if LOG_FILE is enabled).
logging.threshold.fileFILE_LOG_THRESHOLDThe log level threshold to use for file logging.
logging.pattern.levelLOG_LEVEL_PATTERNThe format to use when rendering the log level (default %5p).
PIDPIDThe current process ID (discovered if possible and when not already defined as an OS environment variable).

Logback์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋ž˜ ์†์„ฑ๋“ค๋„ system property๋กœ ์ „์†ก๋œ๋‹ค.

Spring EnvironmentSystem PropertyComments
logging.logback.rollingpolicy.file-name-patternLOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERNPattern for rolled-over log file names (default ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz).
logging.logback.rollingpolicy.clean-history-on-startLOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_STARTWhether to clean the archive log files on startup.
logging.logback.rollingpolicy.max-file-sizeLOGBACK_ROLLINGPOLICY_MAX_FILE_SIZEMaximum log file size.
logging.logback.rollingpolicy.total-size-capLOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAPTotal size of log backups to be kept.
logging.logback.rollingpolicy.max-historyLOGBACK_ROLLINGPOLICY_MAX_HISTORYMaximum number of archive log files to keep.

์ถœ์ฒ˜ https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging.custom-log-configuration

Logback์„ ์œ„ํ•œ Logging ์„ค์ •

Spring Boot์—๋Š” ๊ณ ๊ธ‰ ๊ตฌ์„ฑ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” Logback์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ™•์žฅ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. logback-spring.xml ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ‘œ์ค€ logback.xml ๊ตฌ์„ฑ ํŒŒ์ผ์€ ๋„ˆ๋ฌด ์ผ์ฐ ๋กœ๋“œ๋˜๋ฏ€๋กœ ์ด ํŒŒ์ผ์—์„œ ํ™•์žฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. logback-spring.xml ํŒŒ์ผ์— ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ logging.config ์†์„ฑ์— ํ™•์žฅ ์„ค์ • ํŒŒ์ผ์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

Profile ์ง€์ • ์„ค์ •

<springProfile> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™œ์„ฑ Spring ํ”„๋กœํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ ์„น์…˜์„ ์„ ํƒ์ ์œผ๋กœ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํŒŒ์ผ ์„น์…˜์€ <configuration> ์š”์†Œ ๋‚ด ์–ด๋””์—์„œ๋‚˜ ์ง€์›๋œ๋‹ค. name ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์„ ์ˆ˜๋ฝํ•˜๋Š” ํ”„๋กœํŒŒ์ผ์„ ์ง€์ •ํ•œ๋‹ค.
<springProfile> ํƒœ๊ทธ์—๋Š” ํ”„๋กœํŒŒ์ผ ์ด๋ฆ„ ๋˜๋Š” ํ”„๋กœํŒŒ์ผ ํ‘œํ˜„์‹์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœํŒŒ์ผ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ๋ณต์žกํ•œ ํ”„๋กœํŒŒ์ผ ๋กœ์ง์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev | staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
XML

Environment ์†์„ฑ

<springProperty> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Spring ํ™˜๊ฒฝ์˜ ์†์„ฑ์„ logback ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ํƒœ๊ทธ๋Š” logback ๊ตฌ์„ฑ์—์„œ application.properties ํ˜น์€ application.yml์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
์ด ํƒœ๊ทธ๋Š” logback ํ‘œ์ค€ <property> ํƒœ๊ทธ์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ ‘ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ ์— Spring property์˜ source ํ™˜๊ฒฝ์„ ์ง€์ •ํ•œ๋‹ค.
Spring property๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ defaultValue ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ default ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
        defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
    <remoteHost>${fluentHost}</remoteHost>
    ...
</appender>
XML

source ์†์„ฑ์€ kebab case(ex. property-name)๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

Configure Logback for Logging

Spring Boot๋Š” ์ž์ฒด ๊ตฌ์„ฑ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ logback ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์€ ํŠน์ • ์ผ๋ฐ˜์ ์ธ Spring Boot ๊ทœ์น™์„ ๋‹ค์‹œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.
org.springframework.boot:spring-boot ์ข…์†์„ฑ์— ํฌํ•จ๋œ org/springframework/boot/logging/logback/ ๊ฒฝ๋กœ์— ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • defaults.xml – ๋ณ€ํ™˜ ๊ทœ์น™, ํŒจํ„ด ์†์„ฑ ๋ฐ ์ผ๋ฐ˜์ ์ธ ๋กœ๊ฑฐ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
  • console-appender.xml – ์ฝ˜์†” ๋กœ๊ทธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ConsoleAppender๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • file-appender.xml – FILE_LOG_PATTERN ๋ฐ ROLLING_FILE_NAME_PATTERN system ์†์„ฑ๊ณผ ํ•จ๊ป˜ RollingFileAppender๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • base.xml – ์ด์ „ ๋ฒ„์ „์˜ Spring Boot์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ œ๊ณต๋œ๋‹ค.

logback-spring.xml ํŒŒ์ผ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Spring Boot์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ์„ include ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<?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" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>
XML

Configure Logback for File-only Output

console ๋กœ๊น…์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ถœ๋ ฅ์„ ํŒŒ์ผ์—๋งŒ ์“ฐ๋ ค๋ฉด ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด console-appender.xml์ด ์•„๋‹Œ file-appender.xml์„ ๊ฐ€์ ธ์˜ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ logback-spring.xml ์ด ํ•„์š”ํ•˜๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>
XML

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ${LOG_FILE} system property๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— logging.file.name ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
{LOG_FILE}์ด ์—†๋Š” ๊ฒฝ์šฐ {LOG_PATH}๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์—†์œผ๋ฉด ${LOG_TEMP}๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹์ด๋‹ค.

logging:
  file:
    name: "myapplication.log"
YAML

์ง€๊ธˆ๊นŒ์ง€ Spring Boot์˜ ๊ธฐ๋ณธ ๋กœ๊น…์— ๋Œ€ํ•œ ์ •๋ฆฌ์™€ Logback ํ™•์žฅ ์„ค์ •์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์•˜๋‹ค.


ํ•จ๊ป˜ ๋ณด๋ฉด ์ข‹์€ ๊ธ€

Spring Boot Logback(๋กœ๊ทธ๋ฐฑ) ์„ค์ •, ์ด ๊ธ€ ํ•˜๋‚˜๋กœ ๋๋‚ด์„ธ์š”!!

์ฐธ๊ณ ๋งํฌ

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.logging
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging