์๋ก
์ค๋ฌด์์๋ System.out.println()๊ณผ ๊ฐ์ ์์คํ
์ฝ์์ ์ฌ์ฉํด์ ํ์ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ๋๋ฒ๊น
ํ์ง ์๊ณ , ๋ณ๋์ logging ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฒ๊น
์ด๋ ํ์์คํฌํ ๋ฑ ์ ํด์ง ์์์ ๋ง์ถ์ด ํ๋ฉด ์์ด๋ ํ์ผ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ด๋ฒ ๊ฒ์๊ธ์ ๋ชฉ์ฐจ๋ ์๋์ ๊ฐ์ต๋๋ค.
๋ชฉ์ฐจ
1. logging์ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์์๋ณธ๋ค.
2. Spring Boot์์ logging์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณธ๋ค.
3. logging๊ณผ System.out.println()์ ๋น๊ตํด ๋ณธ๋ค.
1. logging์ ์ข ๋ฅ
logging ๊ด๋ จ ํ๋ ์์ํฌ๋ ๋ํ์ ์ผ๋ก log4j, logback, log4j2, ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํตํฉํด์ ์ธํฐํ์ด์ค๋ก ์ ๊ณตํ๋ SLF4J ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. log4j -> logback -> log4j2 ์์๋ก ๋ฑ์ฅํ์์ผ๋ฉฐ, logback๊ณผ log4j๋ ๋ ๋ค log4j๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ ์ด๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์ ์ฌํฉ๋๋ค. log4j๋ 2015๋ 8์ 5์ผ ์ดํ๋ก ์ง์์ด ์ข ๋ฃํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ์ธํ๊ณ ์์๋ณด๊ฒ ์ต๋๋ค.
logback | 1. log4j์ดํ์ ์ถ์๋ ๋ณด๋ค ํฅ์๋๊ณ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์๋ Java logging ํ๋ ์ ์ํฌ ์ค ํ๋์
๋๋ค. 2. slf4j์ ๊ตฌํ์ฒด๋ก์จ ๋์ํ๊ธฐ์ Spring Bootํ๊ฒฝ์์๋ spring-boot-starter-web์์ spring-boot-starter-logging์ logback์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด ์์ด์ ๋ณ๋ค๋ฅธ dependency ์ถ๊ฐ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. |
log4j2 | 1. ๊ฐ์ฅ ์ต์ ์ ๋์จ logging ํ๋ ์์ํฌ๋ก์จ Apache log4j์ ๋ค์ ๋ฒ์ ์
๋๋ค. 2. logback์ฒ๋ผ ํํฐ๋ง ๊ธฐ๋ฅ๊ณผ ์๋ ๋ฆฌ๋ก๋ฉ์ ์ง์ํฉ๋๋ค. 3. logback๊ณผ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ Multi Thread ํ๊ฒฝ์์ ๋น๋๊ธฐ ๋ก๊ฑฐ(Async Logger)์ ๊ฒฝ์ฐ ๋ค๋ฅธ logging ํ๋ ์์ํฌ๋ณด๋ค ์ฒ๋ฆฌ๋์ด ํจ์ฌ ๋ง๊ณ , ๋๊ธฐ์๊ฐ์ด ํจ์ฌ ์งง์ต๋๋ค. 4. Java8๋ถํฐ ๋์ ๋ ๋๋ค์์ ์ง์ํฉ๋๋ค. |
์๋ ์ด๋ฏธ์ง๋ Multi Thread ํ๊ฒฝ์์ logging ํ๋ ์์ํฌ์ ์ฑ๋ฅ์ ๋น๊ตํ ์ฐจํธ์ ๋๋ค.
2. Spring Boot์์์ logging ์ฌ์ฉ ๋ฐฉ๋ฒ
๊ทธ๋ ๋ค๋ฉด ์ฝ๋๋ฅผ ํตํด ์ด๋ป๊ฒ logging์ ์ฌ์ฉํ๊ณ , ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ ธ ์๋์ง ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
package springboot.MVCBasic.basic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@GetMapping("log-test")
public String logTest() {
String name = "Spring";
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";
}
}
๋ณด์๋ ๋ฐ์ ๊ฐ์ด log๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ ์ ์ธ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ log์ ์ข ๋ฅ์๋ trace, debug, info, warn, error์ด ์๋๋ฐ ๊ฐ๊ฐ์ ์๋ฏธ๋ ์๋ ํ์ ๊ฐ์ต๋๋ค. (๋ณดํต ๊ฐ๋ฐ ์๋ฒ๋ debug, ์ด์ ์๋ฒ๋ info๋ก ์ฌ์ฉํฉ๋๋ค.)
Level | Color | Mean |
1. error | Red | ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค ๋ฐ์ํ ๋ฌธ์ |
2. warn | Yellow | ์ฒ๋ฆฌ ๊ฐ๋ฅํ ๋ฌธ์ ์ด์ง๋ง, ํฅํ ์์คํ ์๋ฌ์ ์์ธ์ด ๋ ์ ์๋ ๋ฌธ์ |
3. info | Green | ๋ก๊ทธ์ธ์ด๋ ์ํ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ์ ๋ณด์ฑ ๋ฉ์์ง |
4. debug | Green | ๊ฐ๋ฐ์ ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์ถ๋ ฅํ๋ ๋ฉ์์ง |
5. trace | Green | debug ๋ณด๋ค ์ข ๋ ์์ธํ ๋ฉ์ธ์ง |
ํน์ ๋ก๊ทธ ๋ ๋ฒจ์ ์ง์ ํ๋ฉด ํด๋น ๋ก๊ทธ ๋ ๋ฒจ์ ์์ ์ฐ์ ์์ ๋ก๊ทธ๊ฐ ๋ชจ๋ ์ถ๋ ฅ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ๋ก๊ทธ ๋ ๋ฒจ์ info๋ก ์ง์ ํ๋ฉด info, warn, error ๋ก๊ทธ๊ฐ ์ ๋ถ ์ถ๋ ฅ๋ฉ๋๋ค.
์ฆ ํน์ ๋ก๊ทธ ๋ ๋ฒจ์ด info๋ผ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
2022-03-21 17:38:15.537 INFO 31713 --- [nio-8080-exec-1] LogService
2022-03-21 17:38:15.537 ERROR 31713 --- [nio-8080-exec-1] LogService
2022-03-21 17:38:15.537 WARN 31713 --- [nio-8080-exec-1] LogService
๋ก๊ทธ ๋ ๋ฒจ์ default ๊ฐ์ info์ด๋ฉฐ ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
1. application.yml์์ ์ค์ ํ ๋
# ํจํค์ง์ ๊ทธ ํ์ ๋ก๊ทธ ๋ ๋ฒจ ์ค์ (๋ํดํธ ๊ฐ์ info)
logging:
level:
springboot.MVCBasic: debug #springboot.MVCBasic ํจํค์ง์ ํ์ ๋ ๋ฒจ ์ค์
2. application.properties์์ ์ค์ ํ ๋
#์ ์ฒด ๋ก๊ทธ ๋ ๋ฒจ ์ค์ (๊ธฐ๋ณธ info)
logging.level.root=info
#hello.springmvc ํจํค์ง์ ๊ทธ ํ์ ๋ก๊ทธ ๋ ๋ฒจ ์ค์
logging.level.hello.springmvc=debug
์ฐ๋ฆฌ๋ ์ ์์ ์ฝ๋์์ private final Logger log = LoggerFactory.getLogger(getClass()); ๋ฅผ ์ ์ธํด์ค ๊ฒ์ ๋ ์ฌ๋ฆด ์ ์์ต๋๋ค. ์ฌ์ค lombok์ @slf4j ์ ๋
ธํ
์ด์
๋ง ์ ์ธํด์ค๋ค๋ฉด ์๋์ ๋ณ๋๋ก ์ ์ธํด ์ฃผ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
package springboot.MVCBasic.basic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogTestController {
@GetMapping("log-test")
public String logTest() {
String name = "Spring";
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";
}
}
์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ๋ณด๋ค ๋ณด๋ฉด ๋๊ตฐ๊ฐ๋ log.trace("trace log = {}", name);์ฒ๋ผ ์ฌ์ฉํ์ง ์๊ณ log.trace("trace log" + name); ๋ก ํ๋ฉด ์ ๋๋?๋ผ๊ณ ์๋ฌธ์ด ๋์ค ์๋ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ ๋ํด์๋ ๋จผ์ ๊ฒฐ๋ก ์ ์ผ๋ก ๋ง์๋๋ฆฌ์๋ฉด ํ์์ ๋ฐฉ์์ ์ฑ๋ฅ์ด ์ข์ง ์์ต๋๋ค.
๊ทธ ์ด์ ๋ ํ์์ ๋ฐฉ์์ logging level์ ํฌํจ๋์ด ์์ง ์์์ ์ถ๋ ฅํ ํ์๊ฐ ์์์๋ ์ผ๋จ ๋ฌธ์์ด์ ์๋ก ๋ํ๋ ์ฐ์ฐ์ด ์ํ๋๊ธฐ ๋๋ฌธ์ ๋น์ฉ๋ฉด์์ ์ํด๋ฅผ ๋ณด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ ์ ์์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ถํฉ๋๋ค.
3. System.out.println()์ ์ฌ์ฉํ์ง ์๊ณ logging์ ์ฌ์ฉํ๋ ์ด์
๊ทธ๋ ๋ค๋ฉด ์ ๊ตณ์ด println๋ฌธ์ผ๋ก ์ฐ์ผ๋ฉด ํธํ ๊ฒ์ ๊ตณ์ด logging์ ์ด์ฉํ ๊น์? ๊ทธ ์ด์ ๋ logging์ ์ฌ์ฉํ์ ๋๋ ์๋์ ๊ฐ์ ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
logging์ ์ฌ์ฉํ์ ๋์ ์ฅ์
- ์ค๋ ๋ ์ ๋ณด, ํด๋์ค ์ด๋ฆ ๊ฐ์ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ํจ๊ป ๋ณผ ์ ์๊ณ , ์ถ๋ ฅ ๋ชจ์์ ์กฐ์ ํ ์ ์๋ค.
- ๋ก๊ทธ ๋ ๋ฒจ์ ๋ฐ๋ผ ๊ฐ๋ฐ์๋ฒ์์๋ ๋ชจ๋ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๊ณ , ์ด์์๋ฒ์์๋ ์ถ๋ ฅํ์ง ์๋ ๋ฑ ๋ก๊ทธ๋ฅผ ์ํฉ์ ๋ง๊ฒ ์กฐ์ ํ ์ ์๋ค.
- ์์คํ ์์ ์ฝ์์๋ง ์ถ๋ ฅํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ผ์ด๋ ๋คํธ์ํฌ ๋ฑ, ๋ก๊ทธ๋ฅผ ๋ณ๋์ ์์น์ ๋จ๊ธธ ์ ์๋ค.
- ํนํ ํ์ผ๋ก ๋จ๊ธธ ๋์๋ ์ผ๋ณ, ํน์ ์ฉ๋์ ๋ฐ๋ผ ๋ก๊ทธ๋ฅผ ๋ถํ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- println์ ์ผ์ ๋๋ณด๋ค ๋ด๋ถ ๋ฒํผ๋ง, ๋ฉํฐ ์ค๋ ๋ ๋ฑ์ ํ๊ฒฝ์์ ํจ์ฌ ์ข๋ค
์ฐธ๊ณ
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ๊ฐ์ฒด๋ณต์ฌ BeanUtils.copyProperties (0) | 2022.05.15 |
---|---|
[Spring] properties encoding ํ๊ธฐ(๊ตญ์ ํ ํ๊ธ๊นจ์ง) (0) | 2022.04.27 |
[Spring] DAO์ DTO์ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ VO (0) | 2022.04.14 |
[Spring] @NoArgsConstructor, @RequiredArgsConstructor, @RequiredArgsConstructor (0) | 2022.03.30 |
[Spring] @RequestParam, @RequestBody, @ModelAttribute์ ์ฐจ์ด (1) | 2022.03.28 |
[Spring] JUnit5์์์ Exception ์ฒ๋ฆฌ (0) | 2022.03.19 |
๋๊ธ