Home > Backend > Spring > ๐Ÿƒ[Spring] slf4j์™€ logback.

๐Ÿƒ[Spring] slf4j์™€ logback.
Spring Framework

๐Ÿƒ[Spring] slf4j์™€ logback.

1๏ธโƒฃ slf4j

  • 'SLF4J(Simple Logging Facade for Java)' ๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ ๊ธฐ๋ก์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋กœ๊น… ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
  • 'SLF4J' ๋Š” ๋‹ค์–‘ํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ(e.g, Log4j, Logback, java.util.logging ๋“ฑ)์— ๋Œ€ํ•ด ๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋กœ๊ทธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ slf4j์˜ ์ฃผ์š” ๊ธฐ๋Šฅ.

    1. ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ์ถ”์ƒํ™”
      • slf4j๋Š” ์—ฌ๋Ÿฌ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ”๋“œ์—์„œ slf4j ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜์ค‘์— ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ๋กœ๊น… ์„ฑ๋Šฅ ์ตœ์ ํ™”
      • slf4j๋Š” ๋ฌธ์ž์—ด ๋ณ‘ํ•ฉ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, slf4j๋Š” ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ์„ ์ง€์—ฐ์‹œ์ผœ, ๋กœ๊ทธ๊ฐ€ ์‹ค์ œ๋กœ ๊ธฐ๋ก๋  ๋•Œ๋งŒ ๊ฒฐํ•ฉ์ด ๋ฐœ์ƒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    1. API ์ผ๊ด€์„ฑ
      • slf4j๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊น…์„ ์œ„ํ•œ ์ผ๊ด€๋œ API๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊น…์„ ํ‘œ์ค€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•.

  • slf4j๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์šฐ์„  slf4j ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: Logback)๋ฅผ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      ```java
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;

public class MyClass {
// Logger ์ƒ์„ฑ
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

public void doSomthing() {
    // ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ก
    logger.info("This is an info message");
    logger.debug("This is a debug message");
} } ``` - ์ด ์ฝ”๋“œ๋Š” **`'slf4j'`** ๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์˜ˆ๋กœ, ๋กœ๊น… ๋ฉ”์‹œ์ง€๋Š” ์„ค์ •๋œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

โœ๏ธ ์š”์•ฝ.

  • slf4j๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์˜ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ํŠน์ • ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•œ ๋กœ๊น… ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

2๏ธโƒฃ logback

  • 'logback' ์€ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์„ฑ๋Šฅ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, slf4j์˜ ๊ถŒ์žฅ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  • 'logback' ์€ slf4j๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ๊ณผ ์œ ์—ฐํ•œ ์„ค์ •, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.

1๏ธโƒฃ logback์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ.

    1. Logback Classic
      • slf4j์™€ ์ง์ ‘ ํ†ตํ•ฉ๋˜๋Š” logback์˜ ํ•ต์‹ฌ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
      • 'Logback Classic' ์€ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ๋ ˆ๋ฒจ(INFO, DEBUG, WARN, ERROR ๋“ฑ)์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    1. Logback Core
      • Logback Classic๊ณผ Logback Access(์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • 'Logback Core' ๋Š” Appender, Layout, Filter ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
    1. Logback Access
      • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋กœ๊น…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
      • ์ฃผ๋กœ Java Servlet ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ logback์˜ ํŠน์ง•.

    1. ๋†’์€ ์„ฑ๋Šฅ
      • 'logback' ์€ ๋น ๋ฅธ ๋กœ๊น… ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
    1. ์œ ์—ฐํ•œ ๊ตฌ์„ฑ
      • 'logback' ์€ XML ๋˜๋Š” Groovy ์Šคํฌ๋ฆฝํŠธ๋กœ ๋กœ๊น… ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋กœ๊น… ๋™์ž‘์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ์กฐ๊ฑด๋ถ€ ๋กœ๊น…
      • 'logback' ์€ ํŠน์ • ์กฐ๊ฑด์—์„œ๋งŒ ๋กœ๊น…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด, ๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ ๊ธฐ๋ก์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ์ด์ „ ๋กœ๊ทธ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ํ˜ธํ™˜์„ฑ
      • 'logback' ์€ ๊ธฐ์กด์˜ 'Log4j' ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๊ธฐ์กด 'Log4j' ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ 'logback' ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
    1. ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ํ˜•์‹
      • 'logback' ์€ ์ฝ˜์†”, ํŒŒ์ผ, ์›๊ฒฉ ์„œ๋ฒ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ๋Œ€์ƒ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ถœ๋ ฅ ํ˜•์‹์„ ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ logback ์‚ฌ์šฉ ์˜ˆ์ œ.

<configuration>
    <!-- ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” Appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” Appender -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>mylog.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- ๋ฃจํŠธ ๋กœ๊ฑฐ ์„ค์ • -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-red red="FILE" />
    </root>
</configuration>
  • ์ด ์˜ˆ์‹œ๋Š” ์ฝ˜์†”๊ณผ ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
    • logback์€ ์ด์™ธ์—๋„ ๋ณต์žกํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โœ๏ธ ์š”์•ฝ.

  • logback์€ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์„ฑ๋Šฅ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, slf4j์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • logback์€ ์œ ์—ฐํ•œ ์„ค์ •๊ณผ ๋†’์€ ์„ฑ๋Šฅ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.