๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SpringBoot

[SpringBoot] ๋กœ๊ทธ(Log) @Slf4j

by ๊ฐœ๋ฐœLOG 2025. 11. 9.
๋ฐ˜์‘ํ˜•

๋กœ๊ทธ (Log) 

๋กœ๊ทธ(Log)๋ž€ ์‹œ์Šคํ…œ์ด ๋™์ž‘ํ•  ๋•Œ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ ๋ฐ ๋™์ž‘ ์ •๋ณด๋ฅผ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ

 

๋กœ๊ทธ ๋ ˆ๋ฒจ (Log Level)

๋กœ๊ทธ๋Š” ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ์ถœ๋ ฅ๋ ์ง€ ๋„˜์–ด๊ฐˆ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ฅธ ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Trace > Debug > Info > Warn > Error > Fatal
๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค๋ช… ์˜ˆ์‹œ
TRACE ๊ฐ€์žฅ ์ƒ์„ธํ•œ ์ •๋ณด(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋‹จ์œ„) ๋ฉ”์„œ๋“œ ์ง„์ž…/๋ฐ˜ํ™˜ ์‹œ์  ๋“ฑ
DEBUG ๋””๋ฒ„๊น…์šฉ ์ƒ์„ธ ์ •๋ณด ๋ณ€์ˆ˜ ๊ฐ’, ๋กœ์ง ํ๋ฆ„ ์ถ”์ 
INFO ์ผ๋ฐ˜์ ์ธ ์ •๋ณด ์„œ๋น„์Šค ์‹œ์ž‘, ์š”์ฒญ ์ฒ˜๋ฆฌ ์™„๋ฃŒ
WARN ๊ฒฝ๊ณ  ์ƒํ™ฉ(์—๋Ÿฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ฃผ์˜ ํ•„์š”) ์„ฑ๋Šฅ ์ €ํ•˜, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž…๋ ฅ
ERROR ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์˜ˆ์™ธ, ์‹œ์Šคํ…œ ์žฅ์• 

 ๐Ÿ’ก  API๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ DEBUG๋กœ ์„ค์ •, ๋ฐฐํฌ์‹œ์—๋Š” INFO๋‚˜ Warn ๋ ˆ๋ฒจ๋กœ ์„ค์ •ํ•˜๊ธฐ.

 

๋กœ๊ทธ ์„ค์ • (application.yml) ์˜ˆ์‹œ

์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” application.yml ๋˜๋Š” application.properties์—์„œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

logging:
  level:
    root: INFO
    com.example.myapp: DEBUG
  file:
    name: logs/myapp.log

 

  • ๊ธฐ๋ณธ(root) ๋กœ๊ทธ ๋ ˆ๋ฒจ์€ INFO
  • ํŠน์ • ํŒจํ‚ค์ง€(com.example.myapp)๋Š” DEBUG
  • ๋กœ๊ทธ ํŒŒ์ผ์€ logs/myapp.log์— ๊ธฐ๋ก๋จ
@Slf4j
@RestController
public class LogExampleController {

    @GetMapping("/log-test")
    public String logTest() {
        String name = "userA";

        log.trace("Trace log = {}", name);
        log.debug("Debug log = {}", name);
        log.info("Info log = {}", name);
        log.warn("Warn log = {}", name);
        log.error("Error log = {}", name);

        return "OK";
    }
}

์‹คํ–‰๊ฒฐ๊ณผ:

INFO   c.e.demo.LogExampleController - Info log = userA
WARN   c.e.demo.LogExampleController - Warn log = userA
ERROR  c.e.demo.LogExampleController - Error log = userA

๋กœ๊ทธ๋ ˆ๋ฒจ์„ INFO๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— INFO ์ดํ•˜๋งŒ ์ถœ๋ ฅํ•œ๋‹ค. trace, debug๋Š” ์ƒ๋žต๋จ.

๋กœ๊ทธ ์ถœ๋ ฅ ์‹œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์ฃผ์˜

  • slf4j์˜ {}์˜ ๋ฌธ์ž์—ด ๋ฐ”์ธ๋”ฉ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•ด๋‹น ์œ„์น˜์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•œ ๊ฐœ ํ˜น์€ ๋‘ ๊ฐœ ๋งŒ์„ ์‚ฌ์šฉํ•˜์ž (3๊ฐœ ์ด์ƒ ์‚ฌ์šฉ ์‹œ, Object[] ์„ ์ƒ์„ฑํ•œ๋‹ค)
log.debug("์œ ์ € ์ •๋ณด: {}", user.getName());

 

 

 

@Slf4j๋ž€?

@Slf4j๋Š” Lombok์˜ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ,
ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ log๋ผ๋Š” ์ด๋ฆ„์˜ ๋กœ๊น… ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ค€๋‹ค.

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyService {
    public void doSomething() {
        log.info("์„œ๋น„์Šค ๋กœ์ง์ด ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        log.debug("๋””๋ฒ„๊ทธ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค: {}", "๋””๋ฒ„๊ทธ ์ •๋ณด");
        log.error("์—๋Ÿฌ ๋ฐœ์ƒ!", new RuntimeException("์˜ˆ์‹œ ์˜ˆ์™ธ"));
    }
}

์œ„ ์ฝ”๋“œ๋Š” Lombok์ด ์ž๋™์œผ๋กœ Log๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

์•„๋ž˜์ฝ”๋“œ๋ฅผ ๋Œ€์‹ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๐Ÿ‘‡

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MyService.class);

์ฆ‰, log ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์„ ์–ธํ•  ํ•„์š” ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•