Docs Menu
Docs Home
/ / /
Kotlin ์ฝ”๋ฃจํ‹ด
/

๋กœ๊น…

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ๊ฐœ์š”
  • ๋กœ๊ฑฐ(Logger) ์„ค์ •
  • ๋ฐฐ๊ฒฝ
  • ์˜ˆ์‹œ - ์„ค์ •
  • ๋กœ๊ฑฐ ๊ตฌ์„ฑ
  • ์˜ˆ์‹œ - ๊ตฌ์„ฑ
  • ๋กœ๊ฑฐ(Logger) ์ด๋ฆ„
  • ์˜ˆ์‹œ - ์ด๋ฆ„

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” MongoDB ์ฝ”ํ‹€๋ฆฐ(Kotlin) ๋“œ๋ผ์ด๋ฒ„์—์„œ ๋กœ๊ฑฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค:

  • SLF4J(Simple Logging Facade For Java)๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ฑฐ ์„ค์ •

  • ๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€ ๊ตฌ์„ฑ

์ด ๊ฐ€์ด๋“œ ์—์„œ๋Š” ์šด์ „์ž ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์šด์ „์ž ์˜ ํ™œ๋™์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šต ๋ณด๋ ค๋ฉด๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ€์ด๋“œ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

์ด ์„น์…˜์—์„œ๋Š” ๋กœ๊ฑฐ๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ์ข…์†์„ฑ์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋กœ๊ฑฐ ์„ค์ • ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

MongoDB ์ฝ”ํ‹€๋ฆฐ (Kotlin) ์šด์ „์ž SLF4J(Simple Logging Facade For Java )๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. SLF4J๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐํฌ์„œ๋ฒ„ ์‹œ ์›ํ•˜๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SLF4J, ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ SLF4J ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋กœ๊ฑฐ ์„ค์ •์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด MongoDB Kotlin ๋“œ๋ผ์ด๋ฒ„๋Š” ํด๋ž˜์Šค ๊ฒฝ๋กœ์—์„œ slf4j-api ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๊ฐ€ slf4j-api ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋“œ๋ผ์ด๋ฒ„๋Š” java.util.logging ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ชจ๋“  ์ถ”๊ฐ€ ๋กœ๊น…์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

WARNING: SLF4J not found on the classpath. Logging is disabled for the 'org.mongodb.driver' component

๋กœ๊ฑฐ๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์— ๋‹ค์Œ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • slf4j-api ์•„ํ‹ฐํŒฉํŠธ

  • ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ

  • ๋ฐ”์ธ๋”ฉ

์ฐธ๊ณ 

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ฒฝ์šฐ slf4j-api์™€ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ๋‚˜์—ดํ•˜๋Š” ๋‹จ์ผ ๋ฐ”์ธ๋”ฉ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ข…์†์„ฑ ๋ชฉ๋ก์— ํ•˜๋‚˜์˜ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ๊ฑฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐํ•ฉ์€ slf4j-api ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์Šค๋‹ˆํŽซ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์ธ Log4j2์™€ Logback์— slf4j-api ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

๋ณธ ์˜ˆ์‹œ๋Š” ๋กœ๊ฑฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•ด๋‹นํ•˜๋Š” ํƒญ์„ ํด๋ฆญํ•˜์„ธ์š”.

ํŒ

์ข…์†์„ฑ ๋ฒ„์ „

๋‚˜์—ด๋œ ๋‹ค์Œ ๋ฒ„์ „์€ ๊ณต์‹์ ์ธ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„ค๋ช…์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํ•œ ์ตœ์‹  ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด SLF4J ๋ฐ ์„ ํƒํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

pom.xml ํŒŒ์ผ์— ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

build.gradle.kts ํŒŒ์ผ ์— ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

dependencies {
implementation("ch.qos.logback:logback-classic:1.2.11")
}

์•ž์˜ ์ข…์†์„ฑ์„ ํฌํ•จํ–ˆ์œผ๋ฉด MongoDB ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

val mongoClient = MongoClient.create("<connection string>");
val database = mongoClient.getDatabase(DB_NAME_PLACEHOLDER);
val collection = database.getCollection<Document>(COLLECTION_NAME_PLACEHOLDER);
collection.find().firstOrNull()
...
12:14:55.853 [main] DEBUG org.mongodb.driver.connection - Opened connection [connectionId{localValue:3, serverValue:3}] to <MongoDB hostname>
12:14:55.861 [main] DEBUG org.mongodb.driver.protocol.command - Command "find" started on database <database> using a connection with driver-generated ID 3 and server-generated ID 3 to <MongoDB hostname>. The request ID is 5. Command: {"find": "<collection>", "filter": {}, "limit": 1, "singleBatch": true, "$db": "<database>", "lsid": {"id": {"$binary": {"base64": "<_id>", "subType": "04"}}}, "$readPreference": {"mode": "primaryPreferred"}}
12:14:55.864 [main] DEBUG org.mongodb.driver.protocol.command - Command "find" succeeded in 4.34 ms using a connection with driver-generated ID 3 and server-generated ID 3 to <MongoDB hostname. The request ID is 5. Command reply: {"cursor": {"id": 0, "ns": "<database>.<collection>", "firstBatch": []}, "ok": 1.0, "$clusterTime": {"clusterTime": {"$timestamp": {"t": 1673778535, "i": 1}}, "signature": {"hash": {"$binary": {"base64": "<_id>", "subType": "00"}}, "keyId": 0}}, "operationTime": {"$timestamp": {"t": 1673778535, "i": 1}}}

์ฐธ๊ณ 

๊ธฐ๋ณธ๊ฐ’ ๋กœ๊ทธ ์ˆ˜์ค€

Logback์˜ ๊ธฐ๋ณธ๊ฐ’ ๋กœ๊ทธ ์ˆ˜์ค€์€ DEBUG์ž…๋‹ˆ๋‹ค. Logback ๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šต ๋ณด๋ ค๋ฉด ์ด ํŽ˜์ด์ง€์˜ ๋กœ๊ฑฐ ๊ตฌ์„ฑ ์„น์…˜์— ์žˆ๋Š” ์˜ˆ์‹œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Logback์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Logback ๋งค๋‰ด์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

pom.xml ํŒŒ์ผ์— ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.1</version>
</dependency>
</dependencies>

build.gradle.kts ํŒŒ์ผ์— ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

dependencies {
implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.17.1")
}

์•ž์˜ ์ข…์†์„ฑ์„ ํฌํ•จํ–ˆ์œผ๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋กœ๊ทธ ํ•ฉ๋‹ˆ๋‹ค.

val loggerParent = LoggerFactory.getLogger("parent")
val loggerChild = LoggerFactory.getLogger("parent.child")
val loggerParent = LoggerFactory.getLogger("parent")
val loggerChild = LoggerFactory.getLogger("parent.child")
12:35:00.438 [main] ERROR <my package path> - Logging an Error

์ฐธ๊ณ 

๊ธฐ๋ณธ๊ฐ’ ๋กœ๊ทธ ์ˆ˜์ค€

๋กœ๊ทธ4J2 ์˜ ๊ธฐ๋ณธ๊ฐ’ ๋กœ๊ทธ ์ˆ˜์ค€์€ ERROR์ž…๋‹ˆ๋‹ค. ์ฆ‰, MongoDB ์ฝ”ํ‹€๋ฆฐ (Kotlin) ์šด์ „์ž ์—์„œ ํ‘œ์ค€ ์ž‘์—…์„ ์‹คํ–‰ ํ•˜๋ฉด ๊ตฌ์„ฑ ์—†์ด ๋กœ๊ทธ4J2 ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Log4J2 ๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šต ๋ณด๋ ค๋ฉด ์ด ํŽ˜์ด์ง€์˜ ๋กœ๊ฑฐ ๊ตฌ์„ฑ ์„น์…˜์— ์žˆ๋Š” ์˜ˆ์‹œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋กœ๊ทธ4j ์— ๋Œ€ํ•œ2 ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊ทธ4j2 ๋งค๋‰ด์–ผ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋กœ๊ฑฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด SLF4J์— ๋ฐ”์ธ๋”ฉ๋œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€์€ ๋กœ๊ฑฐ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์‹œ์ง€์˜ ๊ธด๊ธ‰์„ฑ ์ •๋„์˜ ํ•˜ํ•œ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€์„ INFO๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•ด๋‹นํ•˜๋Š” ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

logback.xml(์ด)๋ผ๋Š” ํŒŒ์ผ์— Logback ๊ตฌ์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. logback.xml ํŒŒ์ผ์€ ํŠน์ • ์œ„์น˜์— ์žˆ์„ ํ•„์š”๋Š” ์—†์ง€๋งŒ ํด๋ž˜์Šค ๊ฒฝ๋กœ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Logback ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ์ˆ˜์ค€์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ€์žฅ ๊ธด๊ธ‰ํ•œ ๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋œ ๊ธด๊ธ‰ํ•œ ๊ฒƒ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋‚˜์—ดํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ์˜ค๋ฅ˜

  • ๊ฒฝ๊ณ 

  • ์ •๋ณด

  • DEBUG

  • ํŠธ๋ ˆ์ด์Šค

logback.xml ํŒŒ์ผ์„ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>

๋กœ๊ฑฐ ๊ตฌ์„ฑ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

val mongoClient = MongoClient.create("<connection string>");
val database = mongoClient.getDatabase(DB_NAME_PLACEHOLDER);
val collection = database.getCollection<Document>(COLLECTION_NAME_PLACEHOLDER);
collection.find().firstOrNull()
...
1317 [cluster-ClusterId{value='<your cluster id>', description='null'}-<your connection uri>] INFO org.mongodb.driver.cluster - Discovered replica set primary <your connection uri>
1568 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<server value>}] to <your connection uri>

Logback ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ ์€ Logback ๋งค๋‰ด์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

log4j2.xml ํŒŒ์ผ ์— ๋กœ๊ทธ4j2 ๊ตฌ์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. log4j2.xml ํŒŒ์ผ ์ด ํŠน์ • ์œ„์น˜ ์— ์žˆ์„ ํ•„์š”๋Š” ์—†์ง€๋งŒ ํด๋ž˜์Šค ๊ฒฝ๋กœ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Log4J2 ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ์ˆ˜์ค€์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ€์žฅ ๊ธด๊ธ‰ํ•œ ๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋œ ๊ธด๊ธ‰ํ•œ ๊ฒƒ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋‚˜์—ดํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์น˜๋ช…์ 

  • ์˜ค๋ฅ˜

  • ๊ฒฝ๊ณ 

  • ์ •๋ณด

  • DEBUG

  • ํŠธ๋ ˆ์ด์Šค

  • ALL

log4j2.xml ํŒŒ์ผ์„ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

๋กœ๊ฑฐ ๊ตฌ์„ฑ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

val mongoClient = MongoClient.create("<connection string>");
val database = mongoClient.getDatabase(DB_NAME_PLACEHOLDER);
val collection = database.getCollection<Document>(COLLECTION_NAME_PLACEHOLDER);
collection.find().firstOrNull()
...
10:14:57.633 [cluster-ClusterId{value=<your cluster id>, description='null'}-<your connection uri>] INFO org.mongodb.driver.cluster - Discovered replica set primary <your connection uri>
10:14:57.790 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>

๋กœ๊ทธ4j ๊ตฌ์„ฑ์— ๋Œ€ํ•œ2 ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋กœ๊ทธ4j2 ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋กœ๊ฑฐ๋Š” ๋กœ๊ฑฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋กœ๊น… ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. ๋กœ๊ฑฐ ์ด๋ฆ„์€ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋’ค์˜ "."๊ฐ€ ๋‹ค๋ฅธ ๋กœ๊ฑฐ ์ด๋ฆ„์˜ ์ ‘๋‘์‚ฌ์ธ ๊ฒฝ์šฐ ๋กœ๊ฑฐ๋Š” ๋‹ค๋ฅธ ๋กœ๊ฑฐ์˜ ์กฐ์ƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "grandparent"๋Š” "grandparent.parent.child"์˜ ์กฐ์ƒ์ธ "grandparent.parent"์˜ ์กฐ์ƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ”๋“œ์—์„œ ๋กœ๊ฑฐ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import org.slf4j.LoggerFactory
val loggerParent = LoggerFactory.getLogger("parent")
val loggerChild = LoggerFactory.getLogger("parent.child")

๋กœ๊ฑฐ๋Š” ๊ธฐ์กด ๋กœ๊ฑฐ์˜ ์†์„ฑ์„ ์ƒ์†๋ฐ›์œผ๋ฉฐ ์†์„ฑ์„ ์ž์ฒด์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”ํ‹€๋ฆฐ(Kotlin)์˜ ํด๋ž˜์Šค ์ƒ์†๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

MongoDB ์ฝ”ํ‹€๋ฆฐ(Kotlin) ๋“œ๋ผ์ด๋ฒ„๋Š” ๋“œ๋ผ์ด๋ฒ„์—์„œ ๋‹ค์–‘ํ•œ ๋กœ๊น… ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ฑฐ ์ด๋ฆ„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋“œ๋ผ์ด๋ฒ„์— ์ •์˜๋œ ๋กœ๊ฑฐ ์ด๋ฆ„๊ณผ ํ•ด๋‹นํ•˜๋Š” ๋กœ๊น… ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

  • org.mongodb.driver.authenticator : ์ธ์ฆ

  • org.mongodb.driver.client : MongoClient ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ

  • org.mongodb.driver.cluster : MongoDB ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง

  • org.mongodb.driver.connection : ์—ฐ๊ฒฐ ๋ฐ ์—ฐ๊ฒฐ ํ’€

  • org.mongodb.driver.connection.tls : TLS/SSL

  • org.mongodb.driver.operation : ์ž๋™ ์žฌ์‹œ๋„์™€ ๊ด€๋ จ๋œ ๋กœ๊น…์„ ํฌํ•จํ•œ ์ž‘์—…

  • org.mongodb.driver.protocol : MongoDB Server๋กœ ์ „์†ก๋œ ๋ช…๋ น ๋ฐ MongoDB Server์—์„œ ์ˆ˜์‹ ํ•œ ์‘๋‹ต

  • org.mongodb.driver.uri : ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ ๋ถ„์„

  • org.mongodb.driver.management : JMX(Java Management Extensions)

์ด ์˜ˆ์—์„œ๋Š” ํŠน์ • ๋“œ๋ผ์ด๋ฒ„ ๋กœ๊ฑฐ์˜ ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋กœ๊ฑฐ๋ฅผ OFF๋กœ ์„ค์ •ํ•˜๊ณ  org.mongodb.driver.connection ๋กœ๊ฑฐ๋ฅผ INFO๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด MongoDB ์ธ์Šคํ„ด์Šค ์—ฐ๊ฒฐ๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์‹œ์ง€๋งŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•ด๋‹นํ•˜๋Š” ํƒญ์„ ์„ ํƒํ•˜์„ธ์š”.

logback.xml ํŒŒ์ผ์„ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="org.mongodb.driver.connection" level="INFO" additivity="true"/>
<root level="OFF">
<appender-ref ref="CONSOLE" />
</root>
</configuration>

๋กœ๊ฑฐ ๊ตฌ์„ฑ์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

val mongoClient = MongoClient.create("<connection string>");
val database = mongoClient.getDatabase(DB_NAME_PLACEHOLDER);
val collection = database.getCollection<Document>(COLLECTION_NAME_PLACEHOLDER);
collection.find().firstOrNull()
...
829 [cluster-rtt-ClusterId{value='<some value>', description='null'}-<your connection URI>] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:2, serverValue:<your server value>}] to <your connection uri>
977 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>

Logback ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ Logback ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

log4j2.xml ํŒŒ์ผ์„ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.mongodb.driver.connection" level="INFO"/>
<Root level="OFF">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

๋กœ๊ฑฐ ๊ตฌ์„ฑ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

val mongoClient = MongoClient.create("<connection string>");
val database = mongoClient.getDatabase(DB_NAME_PLACEHOLDER);
val collection = database.getCollection<Document>(COLLECTION_NAME_PLACEHOLDER);
collection.find().firstOrNull()
...
15:40:23.005 [cluster-ClusterId{value='<some value>', description='null'}-<your connection uri>] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:3, serverValue:<your server value>}] to <your connection uri>
15:40:23.159 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>

Log4j ๊ตฌ์„ฑ์— ๋Œ€ํ•œ2 ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ Log4J2 ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋Œ์•„๊ฐ€๊ธฐ

๋ฐ์ดํ„ฐ ์ •๋ ฌ.