๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ/Java & Spring

Spring Boot ๋กœ๊ทธ ํŒŒ์ผ ๋‚จ๊ธฐ๊ธฐ (with Log4j2)

by hossii 2024. 2. 8.

Spring Boot๋ฅผ ์ด์šฉํ•ด ๊ฐœ๋ฐœํ•˜๋ฉด @Slf4j ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ๋กœ๊ทธ์„ ๋‚จ๊ธฐ๊ณ  Console์— ์ฐํžˆ๋Š” ๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋Š” ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” Console์— ์ถœ๋ ฅํ•ด๋ณด๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ํŒŒ์ผ๋กœ ๋‚จ๊ธธ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

๋กœ๊น…์ด ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ํฌ์ŠคํŒ…์ด ์ž˜ ์ •๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

 

๋กœ๊น…์„ System.out.println() ๋กœ ํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ 

ํ•™์Šต ๋ฐฐ๊ฒฝ ์šฐํ…Œ์ฝ” ๋ ˆ๋ฒจ3 ํŒ€ํ”„๋กœ์ ํŠธ 3์ฐจ ๋ฐ๋ชจ๋ฐ์ด ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ‘๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ํŒŒ์ผ ์ถœ๋ ฅ’ ์ด๋‹ค. ์ด์ „๊นŒ์ง€๋Š” ๋กœ๊น…์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์Šฌ์Šฌ ๋กœ๊น…์—๋„ ์‹ ๊ฒฝ์จ

hudi.blog

 

Slf4j vs Log4j

๋จผ์ € ๊ฐ๊ฐ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” `Slf4j`์™€ `๋‚˜๋จธ์ง€`๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. Slf4j๋Š” Sl4fj๋Š” Simple Logging Facade for Java์˜ ์•ฝ์ž๋กœ ๋กœ๊น…์„ ์œ„ํ•œ Java API์ด๋‹ค. ๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋ณ„๋„์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•˜๊ณ  Log4j์™€ Logback์ด ๊ตฌํ˜„์ฒด์˜ ์—ญํ• ์„ ํ•œ๋‹ค. Spring Boot๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด spring-boot-starter-logging ๋‚ด์— Slf4j์™€ Logback์ด ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

๋กœ๊น…์„ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ด๋ฏ€๋กœ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋А๋ƒ๊ฐ€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ๊ธฐ์ค€์€ `์„ฑ๋Šฅ`๊ณผ `๊ธฐ๋Šฅ`์˜ ๊ด€์ ์—์„œ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ธ๋ฐ, ์„ฑ๋Šฅ ๊ด€์ ์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ์•„๋ณด์ž.

 

์ผ์ •์‹œ๊ฐ„๋™์•ˆ ์ถœ๋ ฅ๋˜๋Š” ๋ฉ”์„ธ์ง€์˜ ์ด๋Ÿ‰์ธ `Throughput`๊ณผ ๋ฉ”์„ธ์ง€๋ฅผ ํ•œ๋ฒˆ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ธ `Response Time`๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์ด์ƒ์ ์ธ ์ƒํ™ฉ์€ ๋†’์€ Throughput, ๋‚ฎ์€ Response Time์„ ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋‹ค.

 

๋น„๋™๊ธฐ ๋กœ๊น…์—์„œ Throughput๊ณผ Response Time์„ ๊ฒฐ์ •์ง“๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ๋Š” ๋Œ€๊ธฐ ์ž‘์—…์„ ์ €์žฅํ•˜๋Š” Queue๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. Queue์˜ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ๋ฒ„ํผ๋ง์„ ํ†ตํ•ด ๋งŽ์€ ๋กœ๊น… ์ด๋ฒคํŠธ๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋†’์€ Throughput์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Queue์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ๋ฒ„ํผ๋ง๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ด๊ณ  Response Time๋„ ํ•จ๊ป˜ ๋†’์•„์งˆ ๊ฒƒ์ด๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๋„ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์— ๋Œ€ํ—ˆ ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๊น… ์ž‘์—…์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๊ฒฝํ•ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. Race Condition์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. 

Log4j2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

- Logger: ๋กœ๊ทธ ์ด๋ฒคํŠธ ์ƒ์„ฑ๊ธฐ
- Appender: ๋กœ๊ทธ ์ถœ๋ ฅ๊ธฐ

 

์œ„๋Š” Log4j, Log4j2, Logback์˜ Thread ์ˆ˜์— ๋Œ€ํ•œ ๋กœ๊น… ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋น„๊ตํ•œ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ArrayBlockingQueue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Async Appender๋ฅผ ์‚ฌ์šฉํ•œ ์„ฑ๋Šฅ์€ ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ, Log4j2์—์„œ ์ง€์›๋˜๋Š” Lock-free ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Thread ์ˆ˜์— ๋น„๋ก€ํ•ด Peak Throughput์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Lock-free ๊ตฌ์กฐ๋ž€
CAS(Compare And Swap)๊ณผ ๊ฐ™์€ ์›์ž์  ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด ๋ณ„๋„์˜ ๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด์™€ ๊ฐ™์€ Lock ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์—†์ด๋„ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. Lock์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๋ฉฐ ๊ต์ฐฉ์ƒํƒœ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ๊ทธ๋ž˜ํ”„๋Š” ์ดˆ๋‹น 64,000๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ 4๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋กœ๊น…ํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ํฐ ์‘๋‹ต์‹œ๊ฐ„ ์ง€์—ฐ์˜ ์›์ธ์€ Minor GC์ธ๋ฐ, Log4j2์—์„œ ์ง€์›๋˜๋Š” Garbage-free Logger๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‘๋‹ต์‹œ๊ฐ„ ์ง€์—ฐ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Log4j2 ์‚ฌ์šฉ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

๋ฌผ๋ก  ์–ด๋–ค Appender๋ฅผ ์“ฐ๋А๋ƒ, ์–ด๋–ค Logger๋ฅผ ์“ฐ๋А๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ ์ธ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋‚˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ๋” ๋А๋ฆฐ ๊ฒฝ์šฐ๋„ ์กด์žฌํ•œ๋‹ค. ํŠนํžˆ Async Logger๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊น… ์Šค๋ ˆ๋“œ์™€ ์ž‘์—… ์Šค๋ ˆ๋“œ์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊น… ์ž‘์—… ์ค‘์— ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” ์†Œ์‹ค๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Log4j2๊ฐ€ ๋ฌด์กฐ๊ฑด ์ข‹๋‹ค๋Š” ๋ฏฟ์Œ์„ ๊ฐ–๊ธฐ ๋ณด๋‹ค ์˜ฌ๋ฐ”๋ฅธ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค. 

 

Log4j2 + Yaml ์ด์šฉํ•ด ๋กœ๊ทธ ํŒŒ์ผ ๋‚จ๊ธฐ๊ธฐ

1. ์˜์กด์„ฑ ์„ค์ •

`build.gradle`

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    configureEach {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

dependencies {
    // Logging
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
    implementation 'com.lmax:disruptor:3.4.4'
}

 

๋จผ์ € log4j ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ธฐ์กด์˜ spring boot ๋กœ๊น… ๋ชจ๋“ˆ์„ ๋ฐฐ์ œํ•ด์ค˜์•ผ ํ•œ๋‹ค. yaml์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” dataformat ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๊ณ , AsyncLogger๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” disruptor ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๋‹ค.

 

๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ์ด์Šˆ

์—ฌ๊ธฐ์„œ ์œ ์˜ํ•  ์ ์€ disruptor์™€ log4j์˜ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์ด๋‹ค. ํ˜„์žฌ(2024.02.08) ๊ธฐ์ค€์œผ๋กœ `log4j-core 3.0.0-beta`๊ณผ `disruptor 4.0.0`์ด ์ตœ์‹  ๋ฒ„์ „์ด, `spring-boot-starter-log4j2`๋Š” ๋‹ค์Œ ๋ฒ„์ „์˜ log4j๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๋งŒ์•ฝ `log4j-core:2.x`๊ณผ `disruptor 4.0.0`์„ ์กฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. `log4j-core:2.x`๋ฒ„์ „์˜ ๊ฒฝ์šฐ, `disruptor-3.x` ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ ์ด ์  ์œ ์˜ํ•ด์„œ ์„ค์ •ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

 

Support for com.lmax:disruptor:4 · Issue #1829 · apache/logging-log4j2

Description When I run with async logger and com.lmax:disruptor:4, I get the following error: Exception in thread "main" java.lang.NoClassDefFoundError: com/lmax/disruptor/SequenceReportingEventHan...

github.com

(๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ log4j2 ๊นƒํ—ˆ๋ธŒ ํŽ˜์ด์ง€์— ๋“ฑ๋ก๋œ ์ด์Šˆ ์ฐธ๊ณ )

 

2. ๋กœ๊น… ์„ค์ •

 

`application.yml`

logging:
  config: classpath:log4j2/log4j2.yml

 

 

log4j2- Properties

Configutation:
  name: Anchor

  Properties:
    Property:
      - name: "log-path"
        value: "./logs"
      - name: "charset-UTF-8"
        value: "UTF-8"
      - name: "console-layout-pattern"
        value: "%style{%d}{White} %highlight{%-5level} [%style{%t}{bright,blue}-%c{1}] %style{%C}{bright,yellow}: %msg%n%throwable"
      - name: "file-layout-pattern"
        value: "%d %-5level [%t :: %c] %C: %msg%n%throwable"

 

Properties๋Š” ํŒŒ์ผ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋“ค์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋†“์€ ๊ฒƒ์ด๋‹ค. ๋ˆˆ ์—ฌ๊ฒจ๋ณผ ๊ฒƒ์€ layout-patter์œผ๋กœ ๊ฐ ๋ฌธ์ž๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- %d: ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ๊ฐ„
- %c: ๋กœ๊ทธ ๋ฐœ์ƒ ๋กœ๊ฑฐ๋ช…
- %C: ๋กœ๊ทธ ๋ฐœ์ƒ ํด๋ž˜์Šค๋ช…
- %t: ๋กœ๊ทธ ๋ฐœ์ƒ ์Šค๋ ˆ๋“œ๋ช…
- %msg: ๋กœ๊ทธ ๋ฉ”์„ธ์ง€
- %throwable: ์˜ˆ์™ธ ๋กœ๊ทธ ๋‚ด์šฉ
- %style{pattern}{ANSI style}: ANSI๋ฅผ ์ด์šฉํ•œ ์Šคํƒ€์ผ๋ง

 

log4j2- Appenders

  Appenders:
    Console:
      - name: console-appender
        target: SYSTEM_OUT
        PatternLayout:
          pattern: ${console-layout-pattern}

    RollingFile:
      name: rolling-file-appender
      fileName: ${log-path}/rolling-file.log
      filePattern: "${log-path}/archive/rollingFile.log.%d{yyyy-MM-dd_hh:mm}_%i.gz"
      immediateFlush: "false"
      PatternLayout:
        charset: ${charset-UTF-8}
        pattern: ${file-layout-pattern}
      Policies:
        SizeBasedTriggeringPolicy:
          size: "1MB"
        TimeBasedTriggeringPolicy:
          interval: "1"
      DefaultRollOverStrategy:
        max: "10"
        fileIndex: "max"

 

์ถœ๋ ฅํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” Appenders๋ฅผ ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค. ๋จผ์ € Console์€ ์ž‘์„ฑํ•œ ๋ ˆ์ด์•„์›ƒ ํŒจํ„ด์œผ๋กœ System.out ๋ฐฉ์‹์„ ํ†ตํ•ด ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. (Target ์˜ต์…˜์€ ์•„๋ž˜ ์‚ฌ์ง„์„ ์ฐธ๊ณ .)

 

๋‹ค์Œ์œผ๋กœ RollingFile์€ fileName์œผ๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ํŒŒ์ผ์ด 200KB๋ฅผ ๋„˜๊ธฐ๊ฑฐ๋‚˜ 1์ผ์„ ๋„˜๊ธฐ๋ฉด filePattern์œผ๋กœ ํŒŒ์ผ์„ ์••์ถ• ์ €์žฅํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์••์ถ• ํŒŒ์ผ์€ ์ตœ๋Œ€ 30๊ฐœ๊นŒ์ง€ ์œ ์ง€๋˜๋‹ค๊ฐ€ 30๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์‚ญ์ œ๋œ๋‹ค.

 

log4j2- Loggers

  Loggers:
    Root:
      level: INFO
      AppenderRef:
        - ref: console-appender

    Logger:
      - name: com.anchor
        additivity: "false"
        level: DEBUG
        AppenderRef:
          - ref: console-appender

    AsyncLogger:
      - name: p6spy
        level: INFO
        AppenderRef:
          - ref: rolling-file-appender

      - name: com
        level: INFO
        AppenderRef:
          - ref: rolling-file-appender

      - name: org
        level: INFO
        AppenderRef:
          - ref: rolling-file-appender

 

 

Root๋Š” ๋ชจ๋“  ๋กœ๊ทธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์„ค์ •์ด๋‹ค. console-appender๋ฅผ ์ด์šฉํ•ด INFO ๋ ˆ๋ฒจ ๋กœ๊ทธ๋งŒ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค. Logger๋Š” Root์™€ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•˜๋Š” ์„ค์ •์ด๋‹ค. com.anchor ํŒจํ‚ค์ง€์—์„œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋กœ๊ทธ๋Š” ์˜ˆ์™ธ์ ์œผ๋กœ DEBUG ๋ ˆ๋ฒจ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก Logger๋ฅผ ํ•˜๋‚˜ ๋” ํ• ๋‹นํ–ˆ๋‹ค.

 

AsyncLogger๋Š” ๋กœ๊น…์„ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์„ค์ •์ด๋‹ค. `p6spy`, `com.*`, `org.*`ํŒจํ‚ค์ง€์—์„œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋กœ๊ทธ๋Š” rolling-file-appender๋ฅผ ์ด์šฉํ•ด INFO ๋ ˆ๋ฒจ ๋กœ๊ทธ๋ฅผ ๋ฐฉ์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ์ง€์ •ํ–ˆ๋‹ค.

 

์ฐธ๊ณ  ์‚ฌํ•ญ

โœ… `name` ํ•„๋“œ๋Š” `%c (๋กœ๊ทธ ๋ฐœ์ƒ ๋กœ๊ฑฐ๋ช…)`์™€ ๋งคํ•‘๋œ๋‹ค. โžก ์ฒ˜์Œ์—๋Š” ๋กœ๊ฑฐ๋ช…์„ Console์— ์ถœ๋ ฅํ•ด๋ณด๊ณ  ์„ค์ •ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
โœ… DEBUG ๋ ˆ๋ฒจ์˜ ๋กœ๊ทธ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•œ๋‹ค. โžก ์ •๋ง ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ถˆํ•„์š”ํ•œ ์ž์›์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

 


 

 

Log4j – Log4j 2 Asynchronous Loggers for Low-Latency Logging - Apache Log4j 2

Asynchronous Loggers for Low-Latency Logging Asynchronous logging can improve your application's performance by executing the I/O operations in a separate thread. Log4j 2 makes a number of improvements in this area. Asynchronous Loggers are a new addition

logging.apache.org

 

Log4j – Performance

Performance Apart from functional requirements, an important reason for selecting a logging library is often how well it fulfills non-functional requirements like reliability and performance. This page compares the performance of a number of logging framew

logging.apache.org

 

Difference between AsyncLogger and AsyncAppender in Log4j2

I have understanding that AsyncAppender do the appending job in a separate thread. They use ArrayBlockingQueue for this purpose. AND AsyncLogger uses LMAX disruptor library to move logging event fr...

stackoverflow.com

 

[springboot] Spring Boot project ์‹œ์ž‘ํ•˜๊ธฐ, log4j2 + yml

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Spring Boot Project ์— log4j2 ๋ฅผ ์„ค์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด์ „ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ตฌํ˜„ ํ™˜๊ฒฝ ์ข…๋ฅ˜ ๋ฒ„์ „ OS M1 Mac(Monterey 12.4) IDE Intellij(2022.1.2) J

olkkani.github.io

 

[Java] Spring Boot Log4j2 ์ดํ•ดํ•˜๊ธฐ -2 : ๋น„๋™๊ธฐ ๋กœ๊น…(Asynchronous Loggers)

ํ•ด๋‹น ๊ธ€์—์„œ๋Š” Spring Boot ํ™˜๊ฒฝ์—์„œ Log4j2๋ฅผ ์ด์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋กœ๊น…์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ๐Ÿ’ก [์ฐธ๊ณ ] Log4j2์— ๋Œ€ํ•ด ์ƒ์„ธํ•˜๊ฒŒ ๊ถ๊ธˆํ•˜์‹œ๊ฑฐ๋‚˜ ๋™๊ธฐ์‹ ๋กœ๊น…์„ ์›ํ•˜์‹œ๋ฉด ์•„

adjh54.tistory.com