Skip to main content

4-09. ๋กœ๊น…

About 2 minJavaSpringAWScrashcoursejavajdkjdk8streamspringspringframeworkspringbootawsaws-ec2

4-09. ๋กœ๊น… ๊ด€๋ จ


4-09. ๋กœ๊น…

์ ํ”„ ํˆฌ ์Šคํ”„๋ง๋ถ€ํŠธ - WikiDocs

pahkey/sbb3 - 4-09open in new window

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 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๋กœ ์„ค์ •๋œ๋‹ค.


์ด์ฐฌํฌ (MarkiiimarK)
Never Stop Learning.