๐Ÿš€ Logback: ๋กœ๊น…์˜ ๋ํŒ์™•, ์ด๊ฑฐ ํ•˜๋‚˜๋ฉด ๋‹ค ๋œ๋‹ค! ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Logback: ๋กœ๊น…์˜ ๋ํŒ์™•, ์ด๊ฑฐ ํ•˜๋‚˜๋ฉด ๋‹ค ๋œ๋‹ค! ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ Java ๊ฐœ๋ฐœ์ž๋“ค์˜ ํ•„์ˆ˜ ์นœ๊ตฌ, Logback์— ๋Œ€ํ•ด ๊นŠ~์ˆ™ํžˆ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ๋กœ๊น…์ด ๋ญ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜๋ƒ๊ณ ์š”? ใ…‹ใ…‹ใ…‹ ์—์ด~ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋กœ๊ทธ ์—†์ด ์–ด๋–ป๊ฒŒ ์‚ด์•„์š”! ๋กœ๊ทธ๋Š” ์šฐ๋ฆฌ์˜ ๋ˆˆ๊ณผ ๊ท€์˜ˆ์š”. ์•ฑ์ด ๋ญ˜ ํ•˜๋Š”์ง€, ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋Š”์ง€ ๋‹ค ์•Œ๋ ค์ฃผ๋Š” ๋“ ๋“ ํ•œ ์กฐ๋ ฅ์ž๋ผ๊ณ ์š”! ๐Ÿ˜Ž

๊ทธ๋Ÿฐ๋ฐ ๋ง์ž…๋‹ˆ๋‹ค, ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์—์„œ๋„ Logback์ด ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”? ์™œ ์ด๋ ‡๊ฒŒ ์ธ๊ธฐ๊ฐ€ ๋งŽ์„๊นŒ์š”? ์ž, ์ด์ œ๋ถ€ํ„ฐ Logback์˜ ์„ธ๊ณ„๋กœ ํ’~๋ฉ ๋น ์ ธ๋ด…์‹œ๋‹ค! ๐ŸŠโ€โ™‚๏ธ

๐Ÿ’ก TMI: Logback์€ Log4j์˜ ํ›„์†์ž‘์ด์—์š”. Log4j๋ฅผ ๋งŒ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ "๋” ์ข‹์€ ๊ฑธ ๋งŒ๋“ค์–ด๋ณด์ž!"ํ•˜๊ณ  ๋งŒ๋“  ๊ฑฐ์ฃ . ๊ทธ๋ž˜์„œ Log4j์˜ ์žฅ์ ์€ ๋‹ค ๊ฐ€์ ธ์˜ค๊ณ , ๋‹จ์ ์€ ๋ณด์™„ํ–ˆ๋‹ต๋‹ˆ๋‹ค. ์ง„ํ™”์˜ ๊ฒฐ์ •์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ !

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Logback์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ…๋ฐ์š”. ์—ฌ๋Ÿฌ๋ถ„, ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋กœ๊น…์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋ด…์‹œ๋‹ค! ๐Ÿš€

๐ŸŒŸ Logback์ด ๋ญ๊ธธ๋ž˜? ๐ŸŒŸ

Logback์€ Java ์ง„์˜์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์˜ˆ์š”. ๊ทธ๋ƒฅ ์ธ๊ธฐ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ดˆ์ดˆ์ดˆ์ธ๊ธฐ๋ž๋‹ˆ๋‹ค! ์™œ ๊ทธ๋Ÿฐ์ง€ ํ•จ๊ป˜ ์•Œ์•„๋ณผ๊นŒ์š”?

  • ๐Ÿš€ ๋น ๋ฅธ ์†๋„: Logback์€ ๋‹ค๋ฅธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋Œ€์š”. ๋กœ๊ทธ ์“ฐ๋Š” ์†๋„๊ฐ€ ๊ด‘์†์ด๋ผ๋‹ˆ๊นŒ์š”?
  • ๐Ÿ”ง ์œ ์—ฐํ•œ ์„ค์ •: XML, Groovy, Java ์ฝ”๋“œ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ทจํ–ฅ๊ป ๊ณจ๋ผ ์“ฐ์„ธ์š”!
  • ๐ŸŽจ ๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ์˜ต์…˜: ์ฝ˜์†”, ํŒŒ์ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ์–ด๋””๋“  ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์–ด์š”.
  • ๐Ÿ”„ ์ž๋™ ๋ฆฌ๋กœ๋“œ: ์„ค์ • ํŒŒ์ผ์ด ๋ฐ”๋€Œ๋ฉด ์•Œ์•„์„œ ๋‹ค์‹œ ๋กœ๋“œํ•ด์š”. ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„, ์ด์ œ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘์€ ์•ˆ๋…•~

์ด๋ ‡๊ฒŒ ์ข‹์€ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์œผ๋‹ˆ, Java ๊ฐœ๋ฐœ์ž๋“ค์ด Logback์„ ์‚ฌ๋ž‘ํ•  ์ˆ˜๋ฐ–์— ์—†๊ฒ ์ฃ ? ๐Ÿ˜

๐ŸŽ“ ๊ฐœ๋ฐœ์ž TMI: Logback์€ SLF4J(Simple Logging Facade for Java)์™€ ์ฐฐ๋–ก๊ถํ•ฉ์ด์—์š”. SLF4J๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต์ธ๋ฐ, Logback๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด ์ง„์งœ ์™„๋ฒฝํ•ด์š”!

์ž, ์ด์ œ Logback์ด ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ์•„์ง ์‹œ์ž‘์— ๋ถˆ๊ณผํ•ด์š”! ์ด์ œ๋ถ€ํ„ฐ๊ฐ€ ์ง„์งœ์˜ˆ์š”. Logback์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊นŒ~์•… ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ์”ฝ! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐Ÿงฉ Logback์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ๐Ÿงฉ

Logback์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์š”. ์ด ์„ธ ๊ฐ€์ง€๋งŒ ์ œ๋Œ€๋กœ ์•Œ๋ฉด Logback ๋งˆ์Šคํ„ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ์ž, ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณผ๊นŒ์š”?

1. Logger (๋กœ๊ฑฐ) ๐Ÿ“

Logger๋Š” ๋กœ๊น…์˜ ์ฃผ์ธ๊ณต์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋…€์„์ด์ฃ . ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ๋งˆ๋‹ค Logger๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด์š”.


Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.info("์ด๊ฒƒ์€ ์ •๋ณด ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.");
logger.error("์ด๋Ÿฐ! ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด์š”!");

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ง„์งœ ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹

2. Appender (์–ดํŽœ๋”) ๐Ÿ“ค

Appender๋Š” ๋กœ๊ทธ๋ฅผ ์–ด๋””์— ์ถœ๋ ฅํ• ์ง€ ๊ฒฐ์ •ํ•ด์š”. ์ฝ˜์†”์— ๋„์šธ ์ˆ˜๋„ ์žˆ๊ณ , ํŒŒ์ผ์— ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์–ด์š”! ์™€์šฐ~

  • ConsoleAppender: ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ด์š”.
  • FileAppender: ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•ด์š”.
  • RollingFileAppender: ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ, ํŒŒ์ผ ํฌ๊ธฐ๋‚˜ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ƒˆ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์š”.
  • DBAppender: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•ด์š”.
  • SMTPAppender: ์ด๋ฉ”์ผ๋กœ ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ด์š”. (๊ธด๊ธ‰ ์ƒํ™ฉ์— ์œ ์šฉํ•˜๊ฒ ์ฃ ?)

3. Layout (๋ ˆ์ด์•„์›ƒ) ๐ŸŽจ

Layout์€ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ํ˜•์‹์„ ๊ฒฐ์ •ํ•ด์š”. ๋กœ๊ทธ๋ฅผ ์–ด๋–ค ๋ชจ์–‘์œผ๋กœ ์ถœ๋ ฅํ• ์ง€ ์ •ํ•˜๋Š” ๊ฑฐ์ฃ .


<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>

์ด๋Ÿฐ ์‹์œผ๋กœ ํŒจํ„ด์„ ์ •์˜ํ•˜๋ฉด, ๋กœ๊ทธ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋ผ์š”:


15:04:05.123 [main] INFO  com.example.MyClass - ์•ˆ๋…•ํ•˜์„ธ์š”, Logback!

๐Ÿ’ก ๊ฟ€ํŒ: PatternLayout์„ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์–ด์š”. ์‹œ๊ฐ„, ์Šค๋ ˆ๋“œ, ๋กœ๊ทธ ๋ ˆ๋ฒจ, ํด๋ž˜์Šค ์ด๋ฆ„ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

์ด ์„ธ ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด์šฐ๋Ÿฌ์ ธ์„œ Logback์˜ ๋งˆ๋ฒ•์ด ํƒ„์ƒํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. Logger๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ณ , Appender๊ฐ€ ์–ด๋””์— ์ถœ๋ ฅํ• ์ง€ ์ •ํ•˜๊ณ , Layout์ด ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฑฐ์ฃ . ์™„๋ฒฝํ•œ ํŒ€์›Œํฌ ์•„๋‹ˆ๊ฒ ์–ด์š”? ๐Ÿ‘

์ž, ์ด์ œ Logback์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์•Œ์•˜์œผ๋‹ˆ, ๋‹ค์Œ์€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๊ณ ๊ณ ์”ฝ! ๐Ÿš€

๐Ÿ› ๏ธ Logback ์„ค์ •ํ•˜๊ธฐ: ์ดˆ๋ณด์ž๋„ ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ› ๏ธ

์ž, ์ด์ œ Logback์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์•„์š”! ใ…‹ใ…‹ใ…‹

1. ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ ๐Ÿ“ฆ

๋จผ์ €, ํ”„๋กœ์ ํŠธ์— Logback ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด์š”. Maven์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด pom.xml์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:


<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.6</version>
    </dependency>
</dependencies>

Gradle์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด build.gradle์— ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•˜์„ธ์š”:


dependencies {
    implementation 'ch.qos.logback:logback-classic:1.2.6'
}

2. logback.xml ๋งŒ๋“ค๊ธฐ ๐Ÿ“„

์ด์ œ src/main/resources ๋””๋ ‰ํ† ๋ฆฌ์— logback.xml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์š”. ์ด ํŒŒ์ผ์ด Logback์˜ ์„ค์ • ํŒŒ์ผ์ด ๋  ๊ฑฐ์˜ˆ์š”.


<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

์ด ์„ค์ •์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์ด์—์š”. ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์„ค์ •ํ–ˆ์ฃ .

3. ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿ’ป

์ด์ œ Java ์ฝ”๋“œ์—์„œ Logback์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
    private static final Logger logger = LoggerFactory.getLogger(MyApp.class);

    public static void main(String[] args) {
        logger.info("์•ˆ๋…•ํ•˜์„ธ์š”, Logback!");
        logger.warn("์ด๊ฑด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์˜ˆ์š”.");
        logger.error("์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด์š”!");
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ˜์†”์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋  ๊ฑฐ์˜ˆ์š”:


10:15:30.123 [main] INFO  com.example.MyApp - ์•ˆ๋…•ํ•˜์„ธ์š”, Logback!
10:15:30.125 [main] WARN  com.example.MyApp - ์ด๊ฑด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์˜ˆ์š”.
10:15:30.126 [main] ERROR com.example.MyApp - ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์–ด์š”!

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉ๊ธˆ Logback์„ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์–ด์š”! ์ด์ œ ๋กœ๊น…์˜ ์„ธ๊ณ„์— ์ฒซ ๋ฐœ์„ ๋‚ด๋”›์€ ๊ฑฐ์˜ˆ์š”. ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ Logback์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ์—์š”. Logback์€ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ข€ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ์”ฝ! ๐Ÿš€

๐Ÿ”ฅ Logback ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ: ์ด์ œ ํ”„๋กœ๊ฐ€ ๋˜์–ด๋ณผ๊นŒ์š”? ๐Ÿ”ฅ

์ž, ์ด์ œ Logback์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์œผ๋‹ˆ ์ข€ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์„ ์•Œ์•„๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ์ด ๊ธฐ๋Šฅ๋“ค์„ ์•Œ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ์ง„์ •ํ•œ Logback ํ”„๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜Ž

1. ๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค์ •ํ•˜๊ธฐ ๐Ÿ“Š

Logback์€ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ œ๊ณตํ•ด์š”. ๊ฐ€์žฅ ๋‚ฎ์€ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ ๋†’์€ ๋ ˆ๋ฒจ ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•˜๋ฉด ์ด๋ ‡๋‹ต๋‹ˆ๋‹ค:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR

logback.xml์—์„œ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”:


<root level="INFO">
    <appender-ref ref="CONSOLE" />
</root>

<logger name="com.example.myapp" level="DEBUG" />

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ „์ฒด์ ์œผ๋กœ๋Š” INFO ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋งŒ ์ถœ๋ ฅํ•˜์ง€๋งŒ, com.example.myapp ํŒจํ‚ค์ง€์—์„œ๋Š” DEBUG ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋ผ์š”.

2. ํŒŒ์ผ์— ๋กœ๊ทธ ์ €์žฅํ•˜๊ธฐ ๐Ÿ’พ

์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ, ํŒŒ์ผ์— ์ €์žฅํ•˜๋ฉด ๋‚˜์ค‘์— ๋ถ„์„ํ•˜๊ธฐ ์ข‹๊ฒ ์ฃ ? RollingFileAppender๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ํฌ๊ธฐ๋‚˜ ๋‚ ์งœ์— ๋”ฐ๋ผ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.


<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/myapp.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<root level="INFO">
    <appender-ref ref="FILE" />
</root>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋งค์ผ ์ƒˆ๋กœ์šด ๋กœ๊ทธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ , 30์ผ์น˜์˜ ๋กœ๊ทธ๋งŒ ๋ณด๊ด€ํ•˜๊ฒŒ ๋ผ์š”.

3. ์กฐ๊ฑด๋ถ€ ์ฒ˜๋ฆฌ ๐Ÿ”€

Logback์€ ์กฐ๊ฑด๋ถ€ ์ฒ˜๋ฆฌ๋„ ์ง€์›ํ•ด์š”. ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ฃ .


<if condition='property("ENV").equals("PRODUCTION")'>
    <then>
        <root level="WARN">
            <appender-ref ref="FILE" />
        </root>
    </then>
    <else>
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
        </root>
    </else>
</if>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” WARN ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ , ๊ทธ ์™ธ์˜ ํ™˜๊ฒฝ์—์„œ๋Š” DEBUG ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ฒŒ ๋ผ์š”.

4. MDC (Mapped Diagnostic Context) ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿ—บ๏ธ

MDC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊ทธ์— ์ถ”๊ฐ€์ ์ธ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ID๋‚˜ ์„ธ์…˜ ID ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋ชจ๋“  ๋กœ๊ทธ์— ์ž๋™์œผ๋กœ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ฃ .


import org.slf4j.MDC;

// ์ฝ”๋“œ ์–ด๋”˜๊ฐ€์—์„œ
MDC.put("userId", "12345");

// ๋กœ๊ทธ ํŒจํ„ด์— MDC ์ •๋ณด ์ถ”๊ฐ€
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %X{userId} - %msg%n</pattern>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ์‚ฌ์šฉ์ž ID๊ฐ€ ํฌํ•จ๋ผ์š”.

5. ๋น„๋™๊ธฐ ๋กœ๊น… โšก

๋กœ๊น…์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฑธ ๊ฑฑ์ •ํ•˜์‹œ๋‚˜์š”? ๋น„๋™๊ธฐ ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”!


<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
</appender>

<root level="INFO">
    <appender-ref ref="ASYNC" />
</root>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ๊ทธ ์ž‘์„ฑ์ด ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ผ์š”. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰ ์†๋„์— ์˜ํ–ฅ์„ ๋œ ๋ฏธ์น˜๊ฒ ์ฃ ?

๐Ÿ† ํ”„๋กœ ํŒ: ๋กœ๊น…์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” DEBUG ๋ ˆ๋ฒจ์˜ ๋กœ๊ทธ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋น„๋™๊ธฐ ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. ๊ทธ๋ฆฌ๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜์„ธ์š”!

์™€์šฐ! ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Logback์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค๋„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”. ์ด ์ •๋„๋ฉด Logback ํ”„๋กœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ใ…‹ใ…‹ใ…‹ ๐Ÿ‘จโ€๐ŸŽ“๐Ÿ‘ฉโ€๐ŸŽ“

ํ•˜์ง€๋งŒ ์•„์ง ๋์ด ์•„๋‹ˆ์—์š”! Logback์—๋Š” ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋‹ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Logback์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์‹ค์šฉ์ ์ธ ํŒ๋“ค์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ์”ฝ! ๐Ÿš€

๐Ÿ› ๏ธ Logback ์‹ค์ „ ํ™œ์šฉ: ์ด์ œ ์ง„์งœ ํ”„๋กœ์ฒ˜๋Ÿผ ์จ๋ณผ๊นŒ์š”? ๐Ÿ› ๏ธ

์ž, ์ด์ œ Logback์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊นŒ์ง€ ๋‹ค ๋ฐฐ์› ์–ด์š”. ๊ทผ๋ฐ ์ด๊ฑธ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ง€๊ธˆ๋ถ€ํ„ฐ Logback์„ ์‹ค์ „์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”. ๐Ÿ˜Ž

1. ๋กœ๊ทธ ๋ ˆ๋ฒจ ์ „๋žต ์„ธ์šฐ๊ธฐ ๐Ÿ“Š

๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์ค‘์š”ํ•ด์š”. ๊ฐ ๋ ˆ๋ฒจ์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ •ํ•ด๋ณด์„ธ์š”.

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

if (userNotFound) {
    logger.warn("์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. userId: {}", userId);
} else if (serverError) {
    logger.error("์„œ๋ฒ„ ์—๋Ÿฌ ๋ฐœ์ƒ. ์ƒ์„ธ ์ •๋ณด: {}", errorDetails);
} else {
    logger.info("์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์„ฑ๊ณต. userId: {}", userId);
}

2. ๋กœ๊ทธ ํฌ๋งท ์ตœ์ ํ™”ํ•˜๊ธฐ ๐ŸŽจ

๋กœ๊ทธ ํฌ๋งท์„ ์ž˜ ์„ค์ •ํ•˜๋ฉด ๋‚˜์ค‘์— ๋กœ๊ทธ ๋ถ„์„ํ•  ๋•Œ ์ •๋ง ํŽธํ•ด์š”. ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ํฌํ•จ์‹œํ‚ค๋˜, ๋„ˆ๋ฌด ๋ณต์žกํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ์„ธ์š”.


<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %X{userId} - %msg%n</pattern>

์ด ํŒจํ„ด์€ ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์š”:

  • ๋‚ ์งœ์™€ ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ๊นŒ์ง€)
  • ์Šค๋ ˆ๋“œ ์ด๋ฆ„
  • ๋กœ๊ทธ ๋ ˆ๋ฒจ
  • ๋กœ๊ฑฐ ์ด๋ฆ„ (์ตœ๋Œ€ 36์ž)
  • MDC์—์„œ userId
  • ์‹ค์ œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€

3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋กœ๊น… ๐Ÿšจ

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์€ ์ •๋ง ์ค‘์š”ํ•ด์š”. ๋‹จ, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ถ”์ถœํ•ด์„œ ๋กœ๊น…ํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”.


try {
    // ๋ญ”๊ฐ€ ์œ„ํ—˜ํ•œ ์ž‘์—…
} catch (Exception e) {
    logger.error("์ž‘์—… ์ฒ˜๋ฆฌ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ. ๋ฉ”์‹œ์ง€: {}, ์›์ธ: {}", e.getMessage(), e.getCause());
}

4. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง์— ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ“ˆ

Logback์„ ์‚ฌ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ฃผ์š” ์ž‘์—…์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋กœ๊น…ํ•ด๋ณด์„ธ์š”.


long start = System.currentTimeMillis();
// ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…
long end = System.currentTimeMillis();
logger.info("์ž‘์—… ์™„๋ฃŒ. ์†Œ์š” ์‹œ๊ฐ„: {}ms", (end - start));

5. ๋กœ๊ทธ ํŒŒ์ผ ๊ด€๋ฆฌ ์ „๋žต ๐Ÿ’พ

๋กœ๊ทธ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“ค์–ด์ ธ์š”. RollingFileAppender๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜์„ธ์š”.


<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/myapp.log</file>
    <  rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>logs/archived/myapp.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
        <maxFileSize>10MB</maxFileSize>
        <maxHistory>30</maxHistory>
        <totalSizeCap>1GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

์ด ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์š”:

  • ๋กœ๊ทธ ํŒŒ์ผ์ด 10MB๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ์ƒˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์š”.
  • ๋งค์ผ ์ƒˆ๋กœ์šด ๋กœ๊ทธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์š”.
  • 30์ผ์น˜์˜ ๋กœ๊ทธ๋งŒ ๋ณด๊ด€ํ•ด์š”.
  • ์ „์ฒด ๋กœ๊ทธ ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ 1GB๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ํ•ด์š”.
  • ์˜ค๋ž˜๋œ ๋กœ๊ทธ ํŒŒ์ผ์€ gzip์œผ๋กœ ์••์ถ•ํ•ด์š”.

6. ๋ฏผ๊ฐํ•œ ์ •๋ณด ๋ณดํ˜ธํ•˜๊ธฐ ๐Ÿ”’

๋กœ๊ทธ์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ด์š”. ํŒจ์Šค์›Œ๋“œ๋‚˜ ๊ฐœ์ธ์ •๋ณด๋Š” ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์„ธ์š”.


public class MaskingPatternLayout extends PatternLayout {
    private Pattern multilinePattern;
    private List<String> maskPatterns = new ArrayList<>();

    public void addMaskPattern(String maskPattern) {
        maskPatterns.add(maskPattern);
        multilinePattern = Pattern.compile(String.join("|", maskPatterns), Pattern.MULTILINE);
    }

    @Override
    public String doLayout(ILoggingEvent event) {
        String message = super.doLayout(event);
        if (multilinePattern != null) {
            Matcher matcher = multilinePattern.matcher(message);
            if (matcher.find()) {
                return matcher.replaceAll("****");
            }
        }
        return message;
    }
}

์ด๋ ‡๊ฒŒ ๋งŒ๋“  MaskingPatternLayout์„ logback.xml์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์š”:


<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="com.example.MaskingPatternLayout">
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </layout>
    <maskPattern>(\w+@\w+\.\w+)</maskPattern> <!-- ์ด๋ฉ”์ผ ์ฃผ์†Œ ๋งˆ์Šคํ‚น -->
    <maskPattern>(\d{4}-\d{4}-\d{4}-\d{4})</maskPattern> <!-- ์นด๋“œ๋ฒˆํ˜ธ ๋งˆ์Šคํ‚น -->
</appender>

7. ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ”

๋กœ๊ทธ๋ฅผ ์ž˜ ๋‚จ๊ธฐ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๊ทธ ๋กœ๊ทธ๋ฅผ ์ž˜ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด์š”. ELK ์Šคํƒ(Elasticsearch, Logstash, Kibana)์ด๋‚˜ Splunk ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.

๐Ÿ’ก ํ”„๋กœ ํŒ: JSON ํ˜•์‹์œผ๋กœ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋ฉด ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ์—์„œ ๋” ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์š”. Logback JSON encoder๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”!

8. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๋กœ๊น… ํ™œ์šฉํ•˜๊ธฐ ๐Ÿงช

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋„ ๋กœ๊น…์„ ํ™œ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์‹คํŒจ ์›์ธ์„ ๋” ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์š”.


@Test
public void testSomething() {
    logger.info("ํ…Œ์ŠคํŠธ ์‹œ์ž‘: testSomething");
    // ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
    logger.info("ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ: testSomething");
}

9. ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋™์  ๋ณ€๊ฒฝ ๐Ÿ”„

JMX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ค‘์—๋„ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ฌธ์ œ ์ƒํ™ฉ์—์„œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ผ์‹œ์ ์œผ๋กœ ๋” ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์ฃ .


<configuration>
    <jmxConfigurator />
    // ๋‹ค๋ฅธ ์„ค์ •๋“ค...
</configuration>

10. ๋กœ๊ทธ ๊ฐ€์ด๋“œ๋ผ์ธ ๋งŒ๋“ค๊ธฐ ๐Ÿ“š

ํŒ€ ์ „์ฒด๊ฐ€ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๋กœ๊น…์„ ํ•˜๋„๋ก ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋ ˆ๋ฒจ์˜ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ์ง€, ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋Š” ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ• ์ง€ ๋“ฑ์„ ์ •ํ•ด๋‘๋ฉด ์ข‹์•„์š”.

๐ŸŽ“ ๋งˆ์ง€๋ง‰ ์กฐ์–ธ: ๋กœ๊น…์€ ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜ ์š”์†Œ์˜ˆ์š”. ํ•˜์ง€๋งŒ ๊ณผ๋„ํ•œ ๋กœ๊น…์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ํ•ญ์ƒ ๊ท ํ˜•์„ ์žก์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์„ธ์š”. ๋กœ๊ทธ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ดํ•ดํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋‹ˆ๊นŒ์š”!

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Logback์˜ ์ง„์ •ํ•œ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์—ˆ์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘ ์ด ์ง€์‹์„ ํ™œ์šฉํ•ด์„œ ๋” ๋‚˜์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ๋กœ๊น…์˜ ํž˜์„ ๋ฏฟ์œผ์„ธ์š”! ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„

๐Ÿ ๋งˆ๋ฌด๋ฆฌ: Logback, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋“ ๋“ ํ•œ ํŒŒํŠธ๋„ˆ! ๐Ÿ

์™€์šฐ! ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ฃ ? Logback์˜ A๋ถ€ํ„ฐ Z๊นŒ์ง€, ์šฐ๋ฆฌ๋Š” ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Logback ์ „๋ฌธ๊ฐ€๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ ๊ฑฐ์˜ˆ์š”. ๐Ÿ‘จโ€๐ŸŽ“๐Ÿ‘ฉโ€๐ŸŽ“

์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

  • Logback์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ
  • ๋กœ๊ทธ ๋ ˆ๋ฒจ๊ณผ ๊ทธ ํ™œ์šฉ๋ฒ•
  • ๋‹ค์–‘ํ•œ Appender ์„ค์ • ๋ฐฉ๋ฒ•
  • ๋กœ๊ทธ ํฌ๋งท ์ตœ์ ํ™” ์ „๋žต
  • ํŒŒ์ผ ๋กœ๊น…๊ณผ ๋กœ๊ทธ ํŒŒ์ผ ๊ด€๋ฆฌ
  • ๋น„๋™๊ธฐ ๋กœ๊น…์œผ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ
  • ๋ฏผ๊ฐํ•œ ์ •๋ณด ๋ณดํ˜ธํ•˜๊ธฐ
  • ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ ํ™œ์šฉํ•˜๊ธฐ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ์˜ ๋กœ๊น…
  • ๋™์  ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ

์ด ๋ชจ๋“  ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋„ ์™„๋ฒฝํ•œ ๋กœ๊น… ์ „๋žต์„ ์„ธ์šธ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋กœ๊ทธ๋Š” ๋‹จ์ˆœํžˆ ์—๋Ÿฌ๋ฅผ ์ฐพ๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ผ๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ์„ธ์š”.

๐ŸŒŸ ๊ธฐ์–ตํ•˜์„ธ์š”: ์ข‹์€ ๋กœ๊ทธ๋Š” ๊ฐœ๋ฐœ์ž์˜ ๊ฐ€์žฅ ๋“ ๋“ ํ•œ ํŒŒํŠธ๋„ˆ์˜ˆ์š”. ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์—ฌ๋Ÿฌ๋ถ„์„ ๊ตฌํ•ด์ค„ ์˜์›…์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. Logback์„ ์ž˜ ํ™œ์šฉํ•ด์„œ ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”!

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Logback ๋งˆ์Šคํ„ฐ์˜ˆ์š”. ์ด ์ง€์‹์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์„ธ์š”. ์ฒ˜์Œ์—๋Š” ์กฐ๊ธˆ ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋กœ๊น…์˜ ์ง„์ •ํ•œ ๊ฐ€์น˜๋ฅผ ๋Š๋ผ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.

๋กœ๊น…์˜ ์„ธ๊ณ„์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจํ—˜์€ ์ด์ œ ๋ง‰ ์‹œ์ž‘๋์–ด์š”. ๊ณ„์†ํ•ด์„œ ํ•™์Šตํ•˜๊ณ , ๊ฒฝํ—˜์„ ์Œ“๊ณ , ๋” ๋‚˜์€ ๋กœ๊น… ์ „๋žต์„ ๋งŒ๋“ค์–ด๊ฐ€์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์— Logback์˜ ๋งˆ๋ฒ•์„ ๋ถˆ์–ด๋„ฃ์–ด๋ณด์„ธ์š”! ๐ŸŽฉโœจ

๊ทธ๋Ÿผ, ํ•ดํ”ผ ๋กœ๊น…! ๋‹ค์Œ์— ๋˜ ๋งŒ๋‚˜์š”~ ๐Ÿ‘‹๐Ÿ˜„