로깅
개요
이 가이드에서는 MongoDB Java 드라이버에서 로거(logger)를 설정하고 구성하는 방법에 대해 알아보겠습니다.
다음 항목을 수행하는 방법을 배웁니다:
SLF4J(Simple Logging Facade For Java)를 사용한 로거 설정
로거의 로그 수준 구성
이 가이드 에서는 운전자 에서 이벤트를 기록 하는 방법을 보여 줍니다. 코드에서 운전자 의 활동에 대한 정보를 사용하는 방법을 학습 보려면모니터링 가이드대한 가이드를 읽어보세요.
로거(Logger) 설정
이 섹션에서는 로거를 설정하려면 필요한 종속성에 대한 배경 정보를 제공하고 로거 설정 예시를 제공합니다.
배경
MongoDB Java 드라이버는 SLF4J(Simple Logging Facade For Java)를 사용합니다. SLF4J를 사용하면 배포 시 원하는 로깅 프레임워크를 지정할 수 있습니다. SLF4J에 대한 자세한 내용은 SLF4J 문서를 참조하세요.
로거 설정은 선택 사항입니다. 애플리케이션을 시작하면 MongoDB Java 드라이버는 클래스 경로에서 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
아티팩트를 바인딩하는 방법을 보여 줍니다.
예시 - 설정
본 예시는 로거를 설정하는 방법을 설명합니다. 프로젝트에서 사용하려는 로깅 프레임워크에 해당하는 탭을 클릭하세요.
팁
종속성 버전
프로젝트에서 사용 중인 빌드 도구를 선택합니다.
pom.xml
파일에 다음 종속성을 추가합니다.
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> </dependencies>
build.gradle
파일에 다음 종속성을 추가합니다.
dependencies { implementation 'ch.qos.logback:logback-classic:1.2.11' }
위의 종속성을 포함했으면 MongoDB 인스턴스에 연결하고 다음 코드를 사용하여 문서를 검색합니다.
MongoClient mongoClient = MongoClients.create(<connection uri>); MongoDatabase database = mongoClient.getDatabase(<database>); MongoCollection<Document> collection = database.getCollection(<collection>); collection.find().first();
다음과 같은 내용이 출력되어야 합니다.
... 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
파일에 다음 종속성을 추가합니다.
dependencies { implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1' }
이전 종속성을 포함시킨 후 다음 코드를 사용하여 오류를 기록하세요.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger = LoggerFactory.getLogger("MyApp"); logger.error("Logging an Error");
다음과 같은 내용이 출력되어야 합니다.
12:35:00.438 [main] ERROR <my package path> - Logging an Error
참고
기본값 로그 수준
로그4J2의 기본 로그 수준은 ERROR입니다. 즉, MongoDB Java 드라이버에서 표준 작업을 실행하면 구성 없이 로그4J2 출력이 생성되지 않습니다. 로그4J2 로거의 로그 수준을 변경하는 방법을 알아보려면 이 페이지의 로거 구성 섹션에 있는 예시를 참조하세요.
로그4J 에 대한2 자세한 내용은 Log4J2 매뉴얼을 참조하세요.
로거 구성
로거를 구성하려면 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>
로거 구성이 성공적으로 이루어졌는지 테스트하려면 다음 코드를 실행합니다.
MongoClient mongoClient = MongoClients.create(<connection uri>); MongoDatabase database = mongoClient.getDatabase(<database>); MongoCollection<Document> collection = database.getCollection(<collection>); collection.find().first();
다음과 유사한 출력이 표시됩니다.
... 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
파일을 다음으로 설정합니다.
<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>
로거 구성이 성공적으로 이루어졌는지 테스트하려면 다음 코드를 실행합니다.
MongoClient mongoClient = MongoClients.create(<connection uri>); MongoDatabase database = mongoClient.getDatabase(<database>); MongoCollection<Document> collection = database.getCollection(<collection>); collection.find().first();
다음과 유사한 출력이 표시됩니다.
... 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>
Log4J2 구성에 대한 자세한 내용은 공식 Log4J2 구성 가이드를 참조하세요.
로거(Logger) 이름
로거는 로거 이름을 사용하여 다양한 로깅 이벤트를 구성하는 데 도움을 줍니다. 로거 이름은 계층 구조를 형성하는 문자열입니다. 이름 뒤의 "."
가 다른 로거 이름의 접두사인 경우 로거는 다른 로거의 조상입니다. 예를 들어, "grandparent"
는 "grandparent.parent.child"
의 조상인 "grandparent.parent"
의 조상입니다.
구체적인 예를 들어, 코드에서 로거 계층 구조는 다음과 같습니다.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger_parent = LoggerFactory.getLogger("parent"); Logger logger_child = LoggerFactory.getLogger("parent.child");
로거는 기존 로거의 속성을 상속받으며 속성을 자체적으로 정의할 수 있습니다. 이는 Java의 클래스 상속과 유사하다고 생각하면 됩니다.
MongoDB Java 드라이버는 드라이버에서 다양한 로깅 이벤트를 구성하기 위해 다음과 같은 로거 이름을 정의합니다. 다음은 드라이버에 정의된 로거 이름과 해당하는 로깅 이벤트입니다.
org.mongodb.driver.authenticator
: 인증org.mongodb.driver.client
:MongoClient
인스턴스와 관련된 이벤트org.mongodb.driver.cluster
: MongoDB deployment 모니터링org.mongodb.driver.connection
: 연결 및 연결 풀org.mongodb.driver.connection.tls
: TLS/SSLorg.mongodb.driver.operation
: 자동 재시도와 관련된 로깅을 포함한 작업org.mongodb.driver.protocol
: MongoDB deployment로 전송된 명령 및 MongoDB deployment에서 수신한 응답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>
로거 구성이 성공적으로 이루어졌는지 테스트하려면 다음 코드를 실행합니다.
MongoClient mongoClient = MongoClients.create(<connection uri>); MongoDatabase database = mongoClient.getDatabase(<database>); MongoCollection<Document> collection = database.getCollection(<collection>); collection.find().first();
다음과 유사한 출력이 표시됩니다.
... 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
파일을 다음으로 설정합니다.
<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>
로거 구성이 성공적으로 이루어졌는지 테스트하려면 다음 코드를 실행합니다.
MongoClient mongoClient = MongoClients.create(<connection uri>); MongoDatabase database = mongoClient.getDatabase(<database>); MongoCollection<Document> collection = database.getCollection(<collection>); collection.find().first();
다음과 유사한 출력이 표시됩니다.
... 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>
Log4J2 구성에 대한 자세한 내용은 공식 Log4J2 구성 가이드를 참조하세요.