Spring Boot์ ๋ก๊น (Logging) ์๋ฒฝ ๊ฐ์ด๋: Logback, Log4j2 ์ค์ ๋ฐ ๋ก๊ทธ ๊ด๋ฆฌ ์ ๋ต
๋ก๊น (Logging) ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. Spring Boot ๋ ๋ค์ํ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋ง ํ๊ณ ๋ฌธ์ ํด๊ฒฐ ์ ๋์์ ์ค๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ Logback๊ณผ Log4j2์ ์ค์ ๋ฐฉ๋ฒ , ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ ์ ๋ต , ๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ ํํฐ๋ง๊ณผ ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ชฉ์ฐจ
- Spring Boot์ ๋ก๊น ๊ฐ์
- Logback vs. Log4j2: ์ด๋ค ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ ํํ ๊น?
- ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ ์ ๋ต๊ณผ ์ค์ ๋ฐฉ๋ฒ
- ๋ก๊ทธ ํํฐ๋ง ๋ฐ ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ
- ๋ก๊น ์ ์ค์์ฑ๊ณผ ์ต์ ํธ๋ ๋
1. Spring Boot์ ๋ก๊น ๊ฐ์
Spring Boot๋ ๊ธฐ๋ณธ์ ์ผ๋ก Logback์ ๋ด์ฅ ํ๊ณ ์์ด, ๋ณ๋์ ์ค์ ์์ด๋ ๊ฐ๋จํ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ํ์ง๋ง, ํ๋ก์ ํธ ํน์ฑ์ ๋ฐ๋ผ Log4j2 ์ ๊ฐ์ ๋ค๋ฅธ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ก๊น ์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ชจ๋ํฐ๋ง : ์ค๋ฅ ๋ฐ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฌธ์ ํด๊ฒฐ ์ง์ : ๋ก๊ทธ๋ฅผ ํตํด ๋ฌธ์ ๋ฐ์ ์์ ๊ณผ ์์ธ์ ์ถ์ ํ ์ ์์ต๋๋ค.
- ๋ณด์ ๋ฐ ๊ฐ์ฌ : ์ค์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ์ฌ ๋๊ฐ ๋ฌด์์ ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
2. Logback vs. Log4j2: ์ด๋ค ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ ํํ ๊น?
Spring Boot๋ Logback ์ ๊ธฐ๋ณธ ๋ก๊น ํ๋ ์์ํฌ๋ก ์ฌ์ฉํ์ง๋ง, Log4j2 ์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ง์ํฉ๋๋ค. ๋ ํ๋ ์์ํฌ์ ์ฐจ์ด๋ฅผ ์๋ ํ๋ก ์ ๋ฆฌํ์ต๋๋ค.
๊ธฐ๋ฅ | Logback | Log4j2 |
---|---|---|
์ฑ๋ฅ | ๋น ๋ฅธ ์๋์ ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ | ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์ ๊ฐ์ |
Spring Boot ์ง์ | ๊ธฐ๋ณธ ์ง์ | ๋ณ๋ ์์กด์ฑ ์ถ๊ฐ ํ์ |
์ค์ ํ์ผ ํ์ | XML | XML, JSON, YAML ์ง์ |
๊ธฐ๋ฅ ํ์ฅ์ฑ | ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์ถฉ๋ถํจ | ๊ณ ๊ธ ํํฐ๋ง๊ณผ ์ปค์คํฐ๋ง์ด์ง์ ๊ฐํจ |
Logback ์ฌ์ฉ์ด ์ถ์ฒ๋๋ ๊ฒฝ์ฐ
- Spring Boot์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ ํ์ฉํ๊ณ ์ถ์ ๋
- ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น ๋ฅธ ๋ก๊น ์ด ํ์ํ ๋
Log4j2 ์ฌ์ฉ์ด ์ถ์ฒ๋๋ ๊ฒฝ์ฐ
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ ์์ ๋์ ์ฑ๋ฅ์ด ์๊ตฌ๋ ๋
- ๊ณ ๊ธ ๋ก๊ทธ ํํฐ๋ง ๊ณผ ๋ค์ํ ์ค์ ํ์ผ ํ์์ด ํ์ํ ๋
3. ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ ์ ๋ต๊ณผ ์ค์ ๋ฐฉ๋ฒ
Spring Boot์์๋ ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ๊ฐ ์์ด๋ ๋ฐฉ์์ ์ ์ดํ ์ ์์ต๋๋ค. ๋ก๊ทธ๊ฐ ๋ง์์ง๋ฉด ๋์คํฌ ์ฉ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
Logback ์ค์ ์์ : logback-spring.xml
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/application-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
์ฝ๋ ์ค๋ช
- RollingFileAppender : ๋ก๊ทธ ํ์ผ์ ๋ ์ง๋ณ๋ก ๋ถ๋ฆฌํด ์ ์ฅํฉ๋๋ค.
- maxHistory : ์ต๋ 30์ผ ๋์์ ๋ก๊ทธ ํ์ผ์ ๋ณด๊ดํฉ๋๋ค.
- fileNamePattern :
application-๋ ์ง.log
ํ์์ผ๋ก ๋ก๊ทธ ํ์ผ์ด ์ ์ฅ๋ฉ๋๋ค.
4. ๋ก๊ทธ ํํฐ๋ง ๋ฐ ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ
๋ก๊ทธ ํํฐ๋ง ์ ํตํด ๋ก๊ทธ ์์ค๋ณ๋ก ์ํ๋ ๋ก๊ทธ๋ง ์ถ๋ ฅํ ์ ์์ต๋๋ค. Spring Boot๋ TRACE, DEBUG, INFO, WARN, ERROR ๋ฑ์ ๋ก๊ทธ ๋ ๋ฒจ์ ์ง์ํฉ๋๋ค.
application.properties๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ ์์ค ์ค์
logging.level.com.example.demo=DEBUG
logging.file.name=logs/app.log
logging.file.max-size=10MB
logging.file.total-size-cap=100MB
์ฝ๋ ์ค๋ช
-
logging.level
: ํน์ ํจํค์ง์ ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํฉ๋๋ค. -
logging.file.max-size
: ํ๋์ ๋ก๊ทธ ํ์ผ ์ต๋ ํฌ๊ธฐ๋ฅผ 10MB๋ก ์ ํํฉ๋๋ค. -
logging.file.total-size-cap
: ์ ์ฒด ๋ก๊ทธ ํ์ผ ์ฉ๋์ 100MB๋ก ์ ํํฉ๋๋ค.
ELK ์คํ์ ์ฌ์ฉํ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง
- Elasticsearch : ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์๋ ์ ์ฅ์
- Logstash : ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๋ณํ
- Kibana : ์๊ฐํ ๋๊ตฌ๋ก ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ํฐ๋ง
ELK ์คํ์ ์ฌ์ฉํ๋ฉด ์ค์๊ฐ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง๊ณผ ๋ถ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
5. ๋ก๊น ์ ์ค์์ฑ๊ณผ ์ต์ ํธ๋ ๋
- ํด๋ผ์ฐ๋ ํ๊ฒฝ ์์๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์งํด ๋ชจ๋ํฐ๋ง๊ณผ ๋ฌธ์ ํด๊ฒฐ ์ ํ์ฉํฉ๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ์์๋ ๊ฐ ์๋น์ค์ ๋ก๊ทธ๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
- ELK ์คํ ๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ์ ๋์ ํ๋ ๊ธฐ์ ์ด ๋์ด๋๊ณ ์์ต๋๋ค.
- ๋ก๊ทธ ์์ค ์กฐ์ ์ ํตํด ๊ฐ๋ฐ ๋จ๊ณ์์๋ DEBUG ๋ ๋ฒจ์ ์ฌ์ฉํ๊ณ , ์ด์ ํ๊ฒฝ์์๋ INFO ์ด์๋ง ์ถ๋ ฅํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
๊ด๋ จ ๋งํฌ
Spring Boot ๋ก๊น ๊ฐ์ด๋๐
Kibana๋ก ๋ก๊ทธ ๋ชจ๋ํฐ๋งํ๊ธฐ๐
FAQ
1. Logback๊ณผ Log4j2 ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํด์ผ ํ ๊น์?
- ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ Logback์ด ์ ํฉํ๋ฉฐ, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ ์ด๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด ํ์ํ๋ค๋ฉด Log4j2๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
2. ๋ก๊ทธ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ ํํ ์ ์๋์?
- Logback์์๋
max-size
์total-size-cap
์ค์ ์ ํตํด ๋ก๊ทธ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
3. ๋ก๊ทธ ํ์ผ์ ์ผ๋ณ๋ก ๊ด๋ฆฌํ ์ ์๋์?
- Logback์ TimeBasedRollingPolicy ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ง๋ณ๋ก ๋ก๊ทธ ํ์ผ์ ๋ถ๋ฆฌ ํด ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
4. ๋ก๊ทธ ๋ชจ๋ํฐ๋ง์ ์ํด ์ด๋ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋์?
- ELK ์คํ (Elasticsearch, Logstash, Kibana)์ด ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค์๊ฐ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง ์ด ๊ฐ๋ฅํฉ๋๋ค.
5. ๋ก๊ทธ ๋ ๋ฒจ์ ์ด๋ป๊ฒ ์ค์ ํ๋์?
- application.properties ์์
logging.level
ํค๋ฅผ ์ฌ์ฉํด ํน์ ํจํค์ง์ ๋ก๊ทธ ๋ ๋ฒจ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํฌ์คํ ์์๋ Spring Boot์ ๋ก๊น ์ค์ ๊ณผ ๊ด๋ฆฌ ๋ฐฉ๋ฒ ์ ๋ค๋ค์ต๋๋ค. Logback๊ณผ Log4j2์ ์ฐจ์ด์ ์ ์ดํดํ๊ณ , ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ ์ ๋ต๊ณผ ๋ก๊ทธ ํํฐ๋ง ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
๋ก๊ทธ ๊ด๋ฆฌ๋ ๋จ์ํ ์ถ๋ ฅ ์ด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ชจ๋ํฐ๋ง๊ณผ ๋ฌธ์ ํด๊ฒฐ์ ํต์ฌ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค. ์ด์ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ํจ์จ์ ์ธ ๋ก๊น ์์คํ ์ ๋์ ํด๋ณด์ธ์! ๐
๋๊ธ