4-09. ๋ก๊น
4-09. ๋ก๊น ๊ด๋ จ
์คํ๋ง๋ถํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก logback์ด๋ผ๋ ๋ก๊น
ํด์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค. STS์ ์ฝ์์ ์ถ๋ ฅ๋๋ ๋ฌธ์์ด๊ณผ ์๋ฒ์์ sbb.log
ํ์ผ์ ์ถ๋ ฅ๋๋ ๋ฌธ์์ด์ด ๋ชจ๋ logback์ ์ํด ์ถ๋ ฅ๋๋ ๋ก๊ทธ์ด๋ค.
์๋ฒ ๋ก๊ทธ์ ๋ฌธ์ ์
ํ์ง๋ง ํ์ฌ ์๋ฒ์ ์์ฑ๋๋ ๋ก๊ทธ ํ์ผ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
- SBB ์๋น์ค๋ฅผ ์ฌ ์คํํ ๊ฒฝ์ฐ ์ด์ ๋ก๊ทธ๊ฐ ์ญ์ ๋๋ค. (
stop.sh
์ ํ๊ณstart.sh
์ ์คํํ ๊ฒฝ์ฐ) - ๋ก๊ทธ ํ์ผ์ด ์์ผ์๋ก ๋ก๊ทธํ์ผ์ ์ฌ์ด์ฆ๊ฐ ์ปค์ง๋ฉฐ ๋ฌดํ๋๋ก ์ฆ๊ฐํ ์ ์๋ค.
- ๋ก๊ทธ์ ์๊ฐ์ด ์์คํ ์๊ฐ์ด ์๋ UTC์๊ฐ์ผ๋ก ์ถ๋ ฅ๋๋ค.
์๋ฒ ๋ก๊ทธ ๋ถ๋ฆฌ
์์์ ๋งํ ์๋ฒ ๋ก๊ทธ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด application-prod.properties
ํ์ผ์ ์์ ํด์ผ ํ๋ค.
ํ์ผ๋ช :
/sbb/src/main/resources/
application-prod.properties
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.h2.console.settings.web-allow-others=true
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=1234
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
# logging
logging.logback.rollingpolicy.max-history=30
logging.logback.rollingpolicy.max-file-size=100MB
logging.file.name=logs/sbb.log
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}-%i.log
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS,Asia/Seoul
.application-prod.properties
ํ์ผ์ ์์ ๊ฐ์ด logging ์ค์ ์ ์ถ๊ฐํ๋ค. ๊ฐ๊ฐ์ ํญ๋ชฉ์ ๋ํด์ ์์๋ณด์.
logging.logback.rollingpolicy.max-history
: ๋ก๊ทธ ํ์ผ์ ์ ์งํ ๊ธฐ๊ฐ(์ผ์)์ ์ค์ ํ๋ค. (30์ผ๊ฐ์ ๋ก๊ทธ๋ง ์ ์งํ๋๋ก ํ๋ค.)logging.logback.rollingpolicy.max-file-size
: ๋ก๊ทธ ํ์ผ์ ํ ๊ฐ์ ์ต๋ ์ฌ์ด์ฆ๋ฅผ ์ค์ ํ๋ค. (100MB๋ก ์ค์ ํ๋ค.)logging.file.name
: ๋ก๊ทธ ํ์ผ์ ์ด๋ฆ์ ์ค์ ํ๋ค.logs/
sbb.log
๋ logs ๋๋ ํฐ๋ฆฌ์ ํ์์sbb.log
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ก๊ทธํ์ผ์ ์์ฑํ๋ผ๋ ์๋ฏธ์ด๋ค.logging.logback.rollingpolicy.file-name-pattern
: ๋ก๊ทธ ํ์ผ์ ์ฌ์ด์ฆ๊ฐ ์ค์ ํ ์ฉ๋์ ์ด๊ณผํ๊ฑฐ๋ ๋ ์ง๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ช ๋ช ํ ๋ก๊ทธํ์ผ์ ์ด๋ฆ์ ๋ํ ์ค์ ์ด๋ค.logging.pattern.dateformat
: ๋ก๊ทธ ์ถ๋ ฅ์ ์ถ๋ ฅํ๋ ๋ ์ง์ ์๊ฐ์ ๋ํ ํฌ๋งท๊ณผ ํ์์กด(timezone)์ ์ค์ ํ๋ค. ํ์์กด์ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ UTC ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ถ๋ ฅํ๋ค. ์ด์ ๊ฐ์ด ์์ ํ๊ณ ๋ฐฐํฌ ํ์ผ(sbb-0.0.3.jar
)์ ์๋ก ์์ฑํ์ฌ ์๋ฒ์ ์ ๋ก๋ํ์.
start.sh
๋ณ๊ฒฝ
์๋ฒ์ ๋ก๊น
์ค์ ์ ๋ณ๊ฒฝํ์ผ๋ฏ๋ก ์๋ฒ์ start.sh
ํ์ผ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์.
ํ์ผ๋ช :
/home/ubuntu/sbb/
start.sh
#!/bin/bash
JAR=sbb-0.0.3.jar
LOG=/dev/null
export spring_profiles_active=prod
nohup java -jar $JAR > $LOG 2>&1 &
.start.sh
์คํ์ ์์ฑ๋๋ ๋ก๊ทธ ํ์ผ์ sbb.log
์์ /dev/null
๋ก ๋ณ๊ฒฝํ๋ค. ์๋ํ๋ฉด ๋ก๊น
์ค์ ์ ํตํด logs
๋๋ ํฐ๋ฆฌ ํ์์ ๋ก๊ทธํ์ผ์ด ์์ฑ๋๋๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฐ ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ์ /dev/null
๋ก ์ง์ ํ๋ฉด ์ฝ์ ์ถ๋ ฅ์ด ๋ฌด์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์ ๋ก๊ทธ๋ ๋์ด์ ํ์ํ์ง ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ญ์ ํ์.
rm sbb.log
๊ทธ๋ฆฌ๊ณ SBB ์๋น์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์์ํ์.
stop.sh
start.sh
๊ทธ๋ฌ๋ฉด ๋ค์์ฒ๋ผ logs
๋๋ ํฐ๋ฆฌ๊ฐ ์์ฑ๋๊ณ logs
๋๋ ํฐ๋ฆฌ ๋ฐ์ sbb.log
ํ์ผ์ด ์์ฑ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ls
#
# sbb.log
์ด์ ๊ธฐ์กด ๋ก๊ทธ๋ ์ฌ๋ผ์ง์ง ์๊ณ 30 ์ผ๊ฐ์ ๋ก๊ทธ๊ฐ ๋ ์ง๋ณ(์ฌ์ด์ฆ๋ณ)๋ก ์ ์ง๋๋ฉฐ ์ถ๋ ฅ๋๋ ์๊ฐ๋ ํ๊ตญ์๊ฐ ๊ธฐ์ค์ผ๋ก ์ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์ฌ์ฉ์ ๋ก๊ทธ
์ง๊ธ๊น์ง๋ ์คํ๋ง๋ถํธ ํ๋ ์์ํฌ๊ฐ ์ถ๋ ฅํ๋ ๋ก๊ทธ๋ค์ ๋ํด์ ์์๋ณด์๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ง์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์๋ ์๋ค. ๊ทธ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์.
๋ค์์ ์ง๋ฌธ ๋ชฉ๋ก ์กฐํ์ GET์ผ๋ก ์์ฒญ๋๋ page, kw ํ๋ผ๋ฏธํฐ์ ์ ๋ ฅ๊ฐ์ ๋ก๊ทธ๋ก ์ถ๋ ฅํ๋ ์์ ์ด๋ค.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/question/
QuestionController.java
package com.mysite.sbb.question;
// (... ์๋ต ...)
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequiredArgsConstructor
@Controller
@RequestMapping("/question")
public class QuestionController {
// (... ์๋ต ...)
@GetMapping("/list")
public String list(Model model, @RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "kw", defaultValue = "") String kw) {
log.info("page:{}, kw:{}", page, kw);
Page<Question> paging = this.questionService.getList(page, kw);
model.addAttribute("paging", paging);
model.addAttribute("kw", kw);
return "question_list";
}
// (... ์๋ต ...)
}
๋กฌ๋ณต์ด ์ ๊ณตํ๋ @Slf4
์ ๋ํ
์ด์
์ ์ฌ์ฉํ๋ฉด log
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. log
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ debug, error ๋ฑ์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค. ๋ก๊ทธ ๋ ๋ฒจ์ ๋ค์๊ณผ ๊ฐ์ด 6๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค. ๊ฐ ๋จ๊ณ์ ๋ก๊ทธ๋ log.trace
, log.debug
, log.info
, log.warn
, log.error
, log.fatal
๋ก ์ถ๋ ฅํ ์ ์๋ค.
trace
(1๋จ๊ณ) - debug ๋ณด๋ค ํจ์ฌ ์์ธํ ์ ๋ณด๋ฅผ ๋ํ๋ผ ๊ฒฝ์ฐ์ ์ฌ์ฉdebug
(2๋จ๊ณ) - ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์ฌ์ฉinfo
(3๋จ๊ณ) - ์ผ๋ฐ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉwarn
(4๋จ๊ณ) - ๊ฒฝ๊ณ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ๋ชฉ์ ์ผ๋ก(์์ ๋ฌธ์ ) ์ฌ์ฉerror
(5๋จ๊ณ) - ์ค๋ฅ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ๋ชฉ์ ์ผ๋ก(ํฐ ๋ฌธ์ ) ์ฌ์ฉfatal
(6๋จ๊ณ) - ์์ฃผ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ถ๋ ฅํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
์ค๋ช ์์ ์ง์ํ ์ ์๋ฏ์ด ๋ก๊ทธ ๋ ๋ฒจ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
๋ก๊ทธ๋ ์ค์ ํ ๋ ๋ฒจ ์ด์์ ๋ก๊ทธ๋ง ์ถ๋ ฅ๋๋ค. ์๋ฅผ ๋ค์ด application.properties
ํ์ผ์ logging.level.root=info
๋ก ์ค์ ํ๋ฉด TRACE, DEBUG ๋ก๊ทธ๋ ์ถ๋ ฅ๋์ง ์๊ณ INFO ์ด์์ ๋ก๊ทธ๋ง ์ถ๋ ฅ๋๋ค. ์ฆ, log.trace
๋๋ log.debug
๋ก ์ถ๋ ฅํ๋ ๋ก๊ทธ๋ ์ถ๋ ฅ๋์ง ์๊ณ logging.info
, logging.warn
, logging.error
, logging.fatal
๋ก ์ถ๋ ฅํ ๋ก๊ทธ๋ง ์ถ๋ ฅ๋๋ค๋ ๋ง์ด๋ค. ๋ง์ฝ ๋ก๊ทธ ๋ ๋ฒจ์ logging.level.root=error
๋ก ์ค์ ํ๋ค๋ฉด logging.error
, logging.fatal
๋ก ์ถ๋ ฅํ ๋ก๊ทธ๋ง ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
logging.level.root
์ ๋ํดํธ ๊ฐ์ info์ด๋ค. ํน๋ณํ ์ค์ ํ์ง ์์ผ๋ฉด info๋ก ์ค์ ๋๋ค.