๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ฐ ๋กœ๊ทธ ์ž‘์„ฑ ๊ธฐ์ค€ ๋ณธ๋ฌธ

Study/Back-End

๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ฐ ๋กœ๊ทธ ์ž‘์„ฑ ๊ธฐ์ค€

Shinjio 2024. 11. 11. 21:02
๋ฐ˜์‘ํ˜•

์šด์˜์ค‘์ธ ์†”๋ฃจ์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด ์›์ธ์„ ํŒŒ์•…ํ•˜๋ ค๋Š”๋ฐ, ์—๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ debug๋‚˜ info ๋กœ๊ทธ๊ฐ€ ํ•˜๋‚˜๋„ ์ฐํžˆ์ง€ ์•Š์•„ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์— ๋กœ๊ทธ ์ฐ๋Š” ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ํŒจ์น˜๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด์•ผ ์šด์˜ํ•  ๋•Œ ์ƒํƒœ๋ฅผ ์ž˜ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฒˆ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


๐Ÿ“– ๋กœ๊ทธ(Log)์˜ ๋ชฉ์ 

๋กœ๊ทธ๋Š” ์‹œ์Šคํ…œ์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ก์œผ๋กœ, ๊ฐœ๋ฐœ์ž์™€ ์šด์˜ ํŒ€์ด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ์„œ๋น„์Šค ๋™์ž‘ ์ƒํƒœ ํŒŒ์•…
  • ์žฅ์•  ํŒŒ์•… ๋ฐ ์•Œ๋ฆผ
  • ๋กœ๊ทธ ๋ถ„์„์„ ํ†ตํ•œ ์„œ๋น„์Šค ์ง€ํ‘œ์˜ ํ™•์ธ, ํŠธ๋žœ์žญ์…˜, ์„ฑ๋Šฅ ํŒŒ์•…

ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋งค์ผ ์ˆ˜์‹ญ GB์— ๋‹ฌํ•˜๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์–ด ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋†“์น˜๊ฑฐ๋‚˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ๊ผญ ํ•„์š”ํ•œ ๋กœ๊ทธ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ์‹œ์Šคํ…œ ์ƒํƒœ ํŒŒ์•…์„ ์œ„ํ•ด ๋†“์น˜๋Š” ๋ถ€๋ถ„์€ ์—†๋Š”์ง€ ์ƒ๊ฐํ•ด๊ฐ€๋ฉฐ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“– ๋กœ๊ทธ ๋ ˆ๋ฒจ(Log Level)

๋กœ๊ทธ ๋ ˆ๋ฒจ์€ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ์ค‘์š”๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜์ค€์œผ๋กœ ALL์—์„œ OFF๋ฅผ ํฌํ•จํ•˜์—ฌ 8๊ฐœ์˜ ๋ ˆ๋ฒจ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณดํ†ต์€ ALL, OFF๋ฅผ ์ œ์™ธํ•œ 6๋‹จ๊ณ„๋ฅผ ์ด์•ผ๊ธฐ ํ•œ๋‹ค.

  • TRACE
    • ๊ฐ€์žฅ ์ƒ์„ธํ•œ ๋กœ๊ทธ ๋ ˆ๋ฒจ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰ ํ๋ฆ„๊ณผ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ƒ์„ธํžˆ ๊ธฐ๋กํ•œ๋‹ค. ์ฃผ๋กœ ๋””๋ฒ„๊น… ์‹œ ์‚ฌ์šฉํ•œ๋‹ค.
  • DEBUG
    • ๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.
  • INFO
    • ์ •๋ณด์„ฑ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ์ด๋ฒคํŠธ๋‚˜ ์‹คํ–‰ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • WARN
    • ๊ฒฝ๊ณ ์„ฑ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    • ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋‚˜ ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ์•Œ๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€์ด๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ์•Œ๋ ค์ค€๋‹ค.
  • ERROR
    • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    • ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ ๋˜๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •์ƒ์ ์ธ ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์•Œ๋ฆฐ๋‹ค.
  • FETAL
    • ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋Š” ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๋งค์šฐ ์–ด๋ ค์šด ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค.

 

๐Ÿ”Ž MVC ํŒจํ„ด์—์„œ์˜ ๋กœ๊ทธ ์ ์šฉ

์œ„์—์„œ ๊ฐ ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋Š”๋ฐ, ์‹ค์ œ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์™€๋‹ฟ์ง€ ์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์šด์˜ ์„œ๋ฒ„์— ์ ์šฉ๋œ ๋””์ž์ธ ํŒจํ„ด์ธ MVC ํŒจํ„ด์—์„œ ๊ฐ ๊ณ„์ธต๋ณ„๋กœ ์–ด๋–ป๊ฒŒ ๋กœ๊ทธ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„์ง€ ์•Œ์•„๋ณด์•˜๋‹ค.

 

1. Controller ๊ณ„์ธต

  • INFO: ๊ฐ ์š”์ฒญ์˜ ์‹œ์ž‘๊ณผ ๋์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•จ
  • WARN: ์ž…๋ ฅ ๊ฐ’์ด ์˜ˆ์ƒ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ ํ˜น์€ ๊ถŒํ•œ์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ
  • ERROR: ์‹ค์ œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
public class UserController {
    private static final Logger logger = LogManager.getLogger(UserController.class);
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        logger.info("User request received for ID: {}", id);
        try {
            User user = userService.getUserById(id);
            logger.info("User retrieved successfully for ID: {}", id);
            return ResponseEntity.ok(user);
        } catch (UserNotFoundException e) {
            logger.warn("User not found for ID: {}", id);
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        } catch (Exception e) {
            logger.error("An error occurred while retrieving user for ID: {}. Error: {}", id, e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
        }
    }
}

 

2. Service ๊ณ„์ธต

  • DEBUG: ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ–ˆ์„ ๋•Œ ๋ถ„๊ธฐ๋˜๋Š” ๋กœ์ง์ด๋‚˜ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ๊ธฐ๋ก
  • INFO: ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ์™„๋ฃŒ์‹œ(ex. ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ, ์ฃผ๋ฌธ ์ƒ์„ฑ ์™„๋ฃŒ ๋“ฑ)
  • WARN: ์ž ์žฌ์  ๋ฌธ์ œ ์ƒํ™ฉ
  • ERROR: ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private static final Logger logger = LogManager.getLogger(UserService.class);
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) throws UserNotFoundException {
        logger.debug("Looking up user with ID: {}", id);
        User user = userRepository.findById(id).orElseThrow(() -> {
            logger.warn("User with ID {} not found in the database.", id);
            return new UserNotFoundException("User not found");
        });
        logger.info("User found: {}", user.getUsername());
        return user;
    }
}

 

3. Repository ๊ณ„์ธต

  • TRACE: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ƒ์„ธ ์ •๋ณด ๊ธฐ๋กํ•  ๋•Œ
  • DEBUG: ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ ํ˜น์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๊ธฐ๋ก
  • ERROR: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์—์„œ ์‹ค์ œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

public class UserRepositoryImpl {
    private static final Logger logger = LogManager.getLogger(UserRepositoryImpl.class);

    public User findUserById(Long id) {
        try {
            logger.trace("Executing SQL query to find user with ID: {}", id);
            User user = findById(id); // Assume findById is implemented to get User from DB
            logger.debug("User data retrieved from database: {}", user);
            return user;
        } catch (Exception e) {
            logger.error("Database error while fetching user with ID: {}. Error: {}", id, e.getMessage());
            throw e;
        }
    }
}

 

๐Ÿ“– ์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@ykh9759/%EB%A1%9C%EA%B7%B8-%EB%A0%88%EB%B2%A8Logging-Level

 

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

๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.๋กœ๊น… ๋ ˆ๋ฒจ์€ ALL๊ณผ OFF๋ฅผ ํฌํ•จํ•˜๋ฉด 8๊ฐœ ์ด์ง€๋งŒ ๋ณดํ†ต ALL๊ณผ OFF๋ฅผ ์ œ์™ธํ•œ 6๋‹จ๊ณ„๋ฅผ ์ด์•ผ๊ธฐํ•œ๋‹ค.ALL > TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFFALL: ๊ฐ€์žฅ ์ƒ์„ธ

velog.io

https://developsd.tistory.com/132

 

Log ๋กœ๊ทธ๋Š” ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€? ๋กœ๊ทธ ๋ ˆ๋ฒจ ์ •๋ฆฌ

Log ๋กœ๊ทธ๋Š” ์™œ ์ ๋Š” ๊ฒƒ์ธ๊ฐ€? ๋กœ๊ทธ๋ฅผ ์ ๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ ์ž‘์„ฑ ๋ชฉ์ ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํŒŒ์•…์ด ์šฐ์„  ํ•„์š”ํ•˜๋‹ค. ์†Œ์Šค ์ฝ”๋“œ์— ๋กœ๊ทธ๋ฅผ ๋งŽ์ด ์ ๊ฒŒ ๋˜๋ฉด ์˜คํžˆ๋ ค ์šด์˜ํ•˜๋ฉด์„œ ๋งŽ์€ ๋กœ๊ทธ๋กœ ์ธํ•ด ๋””๋ฒ„๊น…์ด ๋” ๋ถˆ

developsd.tistory.com

https://chatgpt.com/

 

๋ฐ˜์‘ํ˜•