분류

Couchbase Java 클라이언트를 사용한 로깅

[이 블로그는 http://nitschinger.at/ 에서 신디케이트되었습니다.]

소개

Java용 로깅 프레임워크에는 매우 다양한 종류가 있으며, 모든 사람을 만족시키기는 어렵습니다. 현재 SDK에서 로깅이 어떻게 처리되는지 이해하려면 몇 년 전으로 거슬러 올라가야 합니다. 아시다시피 SDK의 로깅은 스파이멤캐시 라이브러리의 로깅 메커니즘도 상속받습니다. 과거에는 더스틴 는 스파이를 썼는데, 로깅을 위한 좋은 추상화가 없었습니다( SLF4J), 그래서 그는 직접 글을 썼습니다. 요즘은 상황이 바뀌었지만 스파이가 여전히 이 유산을 계승하고 있습니다.

이 글을 쓰는 시점에서 SDK는 간단한 기본 로거에 로깅을 지원합니다(정보 레벨 업에서 STDERR에 로깅), Log4J 및 SunLogger(java.util.logging)를 지원합니다. 곧 출시될 2.9.0 버전에서는 자체 구현을 플러그인할 수 있는 SLF4J 로깅 파사드도 지원할 예정입니다. 다음 버전의 SDK(1.1.7이 될 가능성이 높습니다)는 스파이 2.9에 의존하므로 거기에서도 이점을 누릴 수 있습니다.

개념을 자세히 알아보기 전에 지원되는 로그 수준은 다음과 같습니다( net.spy.memcached.compat.log.Level):

  1. TRACE(2.9 포함)
  2. DEBUG
  3. 정보
  4. 경고
  5. 오류
  6. FATAL

로거마다 구현하는 레벨이 다르므로 일부 로거의 경우 매핑이 가장 먼저 이루어져야 한다는 점에 유의하세요. 이는 각 구현에 대한 설명 중에 언급될 것입니다.

이제 사용 가능한 다양한 로깅 메커니즘과 이를 구성하는 방법에 대해 살펴보겠습니다. SLF4J는 마지막에 다룰 예정입니다.

로깅 전환

아무것도 변경하지 않으면 기본 로거가 사용됩니다. 이 메커니즘은 (정보 수준 이상에서) STDERR에 로그 메시지를 인쇄하기만 합니다. SDK를 사용하는 로깅 라이브러리와 동일한 로깅 라이브러리와 통합하고 싶을 수도 있습니다. 스파이 내부의 LoggerFactory는 시스템 속성에 따라 어떤 것을 선택할지 구성 시 결정합니다. 따라서 이를 프로그래밍 방식으로 변경하거나 매개 변수를 통해 자바 명령을 사용합니다.

Log4JLogger를 프로그래밍 방식으로 사용하려면 다음과 같이 하세요(초기화하기 전에 카우치베이스클라이언트 객체):

속성 systemProperties = System.getProperties();
systemProperties.put("net.spy.log.LoggerImpl", "net.spy.memcached.compat.log.Log4JLogger");
System.setProperties(systemProperties);

물론 이 기능을 사용하려면 클래스 경로에 Log4J JAR을 추가해야 합니다(나중에 살펴보겠지만). 또는 명령줄에서 이 방법으로 설정할 수도 있습니다:

java -Dnet.spy.log.LoggerImpl=net.spy.memcached.compat.log.Log4JLogger ...

이제 다양한 구현을 활성화하는 방법을 알았으니 좀 더 자세히 살펴보겠습니다.

간단한 기본 로거

아무것도 변경하지 않으면 SDK는 DefaultLogger(net.spy.memcached.compat.log.DefaultLogger). 이 로거는 종속성이 없으며 정보 수준 이상의 모든 로그 메시지(정보, 경고, 오류 및 치명적)를 시스템 STDERR에 인쇄합니다. STDERR은 대부분의 IDE에서 자동으로 처리되므로 콘솔 출력 창에서도 볼 수 있습니다.

이 동작은 매우 간단하기 때문에 사용자 정의할 수 없습니다. 모든 로그 메시지에도 타임스탬프가 찍히게 됩니다(형식은 yyyy-MM-dd HH:mm:ss.SSS). Couchbase에 연결하는 방법은 일반적으로 다음과 같습니다:

 
2013-05-07 12:28:41.852 INFO com.couchbase.client.CouchbaseConnection: 큐 연결에 {QA sa=/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} 추가했습니다.
2013-05-07 12:28:41.862 INFO com.couchbase.client.CouchbaseConnection: sun.nio.ch.SelectionKeyImpl@3d9360e2에 대한 연결 상태가 변경되었습니다.
2013-05-07 12:28:41.887 INFO com.couchbase.client.ViewConnection: 연결 대기열에 localhost를 추가했습니다.
2013-05-07 12:28:41.888 INFO com.couchbase.client.CouchbaseClient: viewmode 속성이 정의되지 않았습니다. 뷰모드를 프로덕션 모드로 설정
2013-05-07 12:28:41.986 INFO com.couchbase.client.CouchbaseConnection: 카우치베이스 클라이언트를 종료합니다.
2013-05-07 12:28:41.991 INFO com.couchbase.client.ViewConnection: 노드 localhost에 큐에 작업이 없습니다.
2013-05-07 12:28:41.992 INFO com.couchbase.client.ViewNode: 로컬 호스트에 대한 I/O 리액터가 종료되었습니다.
 

따라서 형식은 항상 그렇습니다: . 디버그 메시지 등은 로깅되지 않으므로 디폴트로거에서는 볼 수 없다는 점을 기억하세요.

 

선로거(java.util.logging)

선로거는 또한 추가 종속성을 도입하지 않습니다. java.util.logging 구현합니다. 그리고 java.util.logging.Level 열거형은 다음 수준을 정의합니다: 모두, 설정, 최고, 미세, 미세, 정보, 경고, 심각 및 꺼짐. 이것이 정의된 수준과 잘 매핑되지 않기 때문에 다음과 같이 매핑됩니다:

 
  1. 트레이스 투 파인스트(2.9 사용)
  2. 디버그에서 파인으로
  3. 정보에서 정보로
  4. 경고에서 경고로
  5. 오류를 심각으로 전환
  6. 치명적에서 심각
 
더 이상 변경하지 않으면 SunLogger는 이와 같이 정보 수준부터 위쪽으로 인쇄합니다:
 
May 7, 2013 12:42:16 PM com.couchbase.client.CouchbaseProperties setPropertyFile
INFO: 속성 파일 "cbclient.properties"를 로드할 수 없습니다: 시스템 클래스 로더에서 파일을 찾을 수 없습니다.
2013년 5월 7일 12:42:16 PM net.spy.memcached.MemcachedConnection createConnections
INFO: 큐 연결에 {QA sa=/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}을 추가했습니다.
May 7, 2013 12:42:16 PM net.spy.memcached.MemcachedConnection handleIO
INFO: sun.nio.ch.SelectionKeyImpl@4ce2cb55에 대한 연결 상태가 변경되었습니다.
May 7, 2013 12:42:16 PM com.couchbase.client.ViewConnection createConnections
INFO: 연결 대기열에 로컬 호스트 추가
2013/05/07 12:42:16 PM com.couchbase.client.CouchbaseClient
정보: 뷰모드 속성이 정의되지 않았습니다. 보기 모드를 프로덕션 모드로 설정
2013년 5월 7일 12:42:16 PM com.couchbase.client.CouchbaseConnection 실행
INFO: 카우치베이스 클라이언트 종료
2013년 5월 7일 12:42:16 PM com.couchbase.client.ViewConnection 종료
INFO: 노드 localhost에 대기열에 작업이 없습니다.
May 7, 2013 12:42:16 PM com.couchbase.client.ViewNode$1 실행
INFO: 로컬호스트에 대해 I/O 리액터가 종료되었습니다.
 

로그 수준을 DEBUG 이하로 변경하려면 다음과 같이 변경하면 됩니다:

 
Logger.getLogger("com.couchbase.client").setLevel(Level.FINEST);
 

이제 모든 디버그 메시지를 콘솔에 인쇄하려면 한 가지 더 해야 할 일이 있습니다. 로깅 수준을 올바르게 설정했지만 콘솔 핸들러 가 아직 디버깅으로 설정되지 않은 경우(따라서 디버그 로깅에 대한 대가를 지불하지만 실제로는 IDE에 아무것도 표시되지 않을 가능성이 높습니다).

 
for(핸들러 h : Logger.getLogger("com.couchbase.client").getParent().getHandlers()) {
     if(h 인스턴스 오브 콘솔핸들러) {
        h.setLevel(Level.FINEST);
     }
}
 

따라서 다음은 사용 방법에 대한 전체 예제입니다. SunLogger 를 클릭하고 콘솔에서 모든 디버그 메시지를 가져옵니다.

 
    속성 systemProperties = System.getProperties();
    systemProperties.put("net.spy.log.LoggerImpl", "net.spy.memcached.compat.log.SunLogger");
    System.setProperties(systemProperties);

    로거 logger = Logger.getLogger("com.couchbase.client");
    logger.setLevel(Level.FINEST);
    for(핸들러 h : logger.getParent().getHandlers()) {
       if(h 인스턴스 오브 콘솔핸들러){
         h.setLevel(Level.FINEST);
       }
    }

 

그런 다음 계속해서 카우치베이스클라이언트 객체를 사용하면 다음과 같은 자세한 출력이 표시됩니다(여기서 잘린 부분):

 
May 7, 2013 12:54:34 PM com.couchbase.client.vbucket.RecfigurableObserver 업데이트
최고: 업데이트를 수신하여 재구성 가능성에 대해 com.couchbase.client.vbucket.config.Bucketcom.couchbase.client.vbucket.config.Bucket@3d77949에 대해 알립니다.
May 7, 2013 12:54:34 PM com.couchbase.client.vbucket.RecfigurableObserver 업데이트
최고: 업데이트를 수신하여 재구성 가능 항목에 대해 com.couchbase.client.vbucket.config.Bucketcom.couchbase.client.vbucket.config.Bucket@4e927ae에 대해 알립니다.
May 7, 2013 12:54:34 PM com.couchbase.client.vbucket.RecfigurableObserver 업데이트
FINEST: 기본값이라고 표시되며 /pools/default/bucketsStreaming/default?bucket_uuid=adfff22b70e09fafaa26ca37b7e05e9d와 대화 중입니다.
May 7, 2013 12:54:34 PM com.couchbase.client.vbucket.ReconfigurableObserver 업데이트
FINEST: 기본값이라고 표시되며 /pools/default/bucketsStreaming/default?bucket_uuid=adfff22b70e09fafaa26ca37b7e05e9d와 대화 중입니다.
 

Log4J

대부분의 사람들은 더 많은 유연성을 필요로 하며, Log4J는 많은 애플리케이션에서 표준으로 사용되어 왔고 지금도 사용되고 있습니다. SDK는 Log4J도 지원합니다. 이 기능을 사용하려면 먼저 인스턴스를 올바르게 설정해야 합니다:

 
    속성 systemProperties = System.getProperties();
    systemProperties.put("net.spy.log.LoggerImpl", "net.spy.memcached.compat.log.Log4JLogger");
    System.setProperties(systemProperties);
 

이제 이것을 실행하면 일부 Log4J 클래스를 찾을 수 없다는 오류가 발생합니다. 클래스 경로에 없기 때문에 이것은 놀라운 일이 아닙니다. 적절하게 추가하여 이 문제를 해결해 보겠습니다. maven을 사용하는 경우 log4j.log4j 종속성을 추가해야 합니다(현재 버전은 1.2.17입니다). 필요에 따라 JAR을 다운로드하여 클래스 경로에 추가할 수도 있습니다.

 
이제 다시 실행하면 또 다른 오류가 발생합니다:
 
log4j:경고 로거에 대한 추가자를 찾을 수 없습니다(com.couchbase.client.vbucket.ConfigurationProviderHTTP).
log4j:WARN log4j 시스템을 올바르게 초기화하세요.
log4j:WARN 자세한 내용은 http://logging.apache.org/log4j/1.2/faq.html#noconfig 참조.
 

이 문제를 해결하는 한 가지 방법은 올바른 log4j.xml 구성 파일을 클래스 경로에 추가하지만, 빠르게 작동하도록 하기 위해 Log4J는 기본 구성자. 시스템 속성 구성 바로 뒤에 이것을 추가합니다:

 
org.apache.log4j.BasicConfigurator.configure();
 

코드 변경 사항을 적용한 상태에서 실행하면 로그 메시지가 멋지게 출력되는 것을 볼 수 있습니다. 또한 DEBUG 수준에서 바로 표시되는 것을 볼 수 있습니다(심지어 어느 스레드에서 로깅되었는지 정보도 포함):

 
69 [main] INFO com.couchbase.client.CouchbaseConnection - 큐 연결에 {QA sa=/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} 추가되었습니다.
70 [main] DEBUG com.couchbase.client.vbucket.VBucketNodeLocator - VBucketNodeLocator에서 nodesMap 업데이트 중입니다.
73 [main] DEBUG com.couchbase.client.vbucket.VBucketNodeLocator - 호스트 이름이 127.0.0.1:11210인 노드 추가 중입니다.
74 [main] DEBUG com.couchbase.client.vbucket.VBucketNodeLocator - 추가된 노드는 {QA sa=localhost/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=8}입니다.
74 [{MemcachedConnection to localhost/127.0.0.1:11210}을 통한 Memcached IO] DEBUG com.couchbase.client.CouchbaseConnection - 큐 처리가 완료되었습니다.
74 [{MemcachedConnection to localhost/127.0.0.1:11210}을 통한 Memcached IO] DEBUG com.couchbase.client.CouchBaseConnection - 0ms의 지연으로 선택 중
79 [{MemcachedConnection to localhost/127.0.0.1:11210}을 통한 Memcached IO] DEBUG com.couchbase.client.CouchBaseConnection - 선택된 1, 선택된 1 키
79 [멤캐시드 IO 오버
 

일반적인 Log4J 메커니즘을 통해 로깅 수준을 제어할 수 있습니다. 여기서는 이에 대해 자세히 설명하지 않겠습니다. 체크 아웃 공식 문서(예를 들어 속성 구성자 대신).

Log4J에 대해 말하자면,  스테픈 라센 를 구현했습니다. Log4J 애펜더 를 사용하여 (파일 대신) Couchbase에 로그를 저장할 수 있습니다!

새로운 파사드: SLF4J

애플리케이션을 특정 로깅 라이브러리에 바인딩하지 않는 것은 항상 좋은 생각입니다. SLF4J는 그 뒤에 있는 다양한 플러그 가능한 로깅 프레임워크를 위한 외관입니다. 따라서 런타임 중에 로깅 구현을 선택할 수 있습니다. 로그백, Log4J 등을 사용할 수 있습니다. 이미 Log4J를 사용해 보았으므로, 다른 매우 일반적인 로그 프레임워크 중 하나인 Logback과 SLF4J가 작동하도록 만들어 보겠습니다.

SLF4J 지원은 spymemcached 1.9.0 릴리스에서 제공될 예정이며, 따라서 다음 릴리스 중 하나에서 Couchbase Java SDK를 사용할 수 있습니다.

먼저 그에 맞게 구성해야 합니다:

속성 systemProperties = System.getProperties();
systemProperties.put("net.spy.log.LoggerImpl", "net.spy.memcached.compat.log.SLF4JLogger");
System.setProperties(systemProperties);
 

이제 클래스 경로에 두 개의 JAR을 포함시켜야 합니다. 첫 번째는 SLF4J 파사드 API이고 다른 하나는 우리가 선택한 로깅 프레임워크입니다. 파사드 API 패키지는 SLF4J-API (이 패키지는 항상 제자리에 있어야 함) 그리고 로그백을 사용하려고 하므로 로그백 클래식 JAR. 이 정보는 SDK에만 해당되는 것이 아니며, 다음 정보에서 찾을 수 있습니다. 여기. maven을 사용하는 경우 이 코드 조각을 사용할 수 있습니다:

   
      org.slf4j
      SLF4J-API
      1.7.5
   

   
      ch.qos.logback
      로그백 클래식
      1.0.12
   
 

SLF4J는 로그백 구현을 자동으로 선택하므로 로그는 다음과 같이 표시됩니다:

 
13:25:43.692 [main] INFO c.c.client.CouchbaseConnection - 큐 연결에 {QA sa=/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} 추가됨.
13:25:43.694 [main] DEBUG c.c.c.vbucket.VBucketNodeLocator - VBucketNodeLocator에서 nodesMap 업데이트 중입니다.
13:25:43.697 [main] DEBUG c.c.c.vbucket.VBucketNodeLocator - 호스트 이름이 127.0.0.1:11210인 노드 추가 중입니다.
13:25:43.697 [main] DEBUG c.c.c.vbucket.VBucketNodeLocator - 추가된 노드는 {QA sa=localhost/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=8}입니다.
13:25:43.698 [{MemcachedConnection to localhost/127.0.0.1:11210}을 통한 Memcached IO] DEBUG c.c.client.CouchbaseConnection - 대기열 처리 완료.
13:25:43.699 [{MemcachedConnection to localhost/127.0.0.1:11210}을 통한 Memcached IO] DEBUG c.c.client.CouchbaseConnection - 0ms의 지연으로 선택 중
13:25:43.702 [{MemcachedConnection to localhost/127.0.0.1:11210}을 통한 Memcached IO] DEBUG c.c.client.CouchbaseConnection - 선택한 1, 선택한 1 키
13:25:43.703 [{MemcachedConnection to localhost/127.0.0.1:11210}에 대한 Memcached IO] DEBUG c.c.client.CouchbaseConnection - 처리하는 IO 대상: sun.nio.ch.SelectionKeyImpl@48ff2413 (r=false, w=false, c=true, op={QA sa=localhost/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=8})
13:25:43.703 [{MemcachedConnection to localhost/127.0.0.1:11210}에 대한 Memcached IO] INFO c.c.client.CouchbaseConnection - 연결 상태가 sun.nio.ch.SelectionKeyImpl@48ff2413으로 변경되었습니다.
13:25:43.713
 

보시다시피 여기에는 DEBUG 수준 로깅도 포함되어 있습니다. 런타임 중에 로깅 구현을 포함하지 않으면 SLF4J가 시작될 때 불평합니다:

 
SLF4J: "org.slf4j.impl.StaticLoggerBinder" 클래스를 로드하지 못했습니다.
SLF4J: 무작동(NOP) 로거 구현 기본값으로 설정하기
SLF4J: 자세한 내용은 http://www.slf4j.org/codes.html#StaticLoggerBinder 참조
 
로그백을 구성하는 방법을 알아보려면 다음과 같이 하세요, 여기를 보세요.
 

요약

스파이멤캐시의 추상화와 작동 방식을 알고 나면 로깅 구현을 쉽고 간단하게 전환할 수 있습니다. 오류를 보고하기 위해 Couchbase 직원 중 한 명과 함께 작업하는 경우 오류 원인을 파악하는 데 사용할 수 있는 유용한 정보가 많이 포함되어 있으므로 DEBUG가 켜진 상태로 출력을 포함하세요.

다음 스파이 릴리스(2.9)에 SLF4J 파사드가 추가되면 모든 대규모 로깅 프레임워크를 SDK에 연결할 수 있게 됩니다. 이러한 메커니즘에 포함되지 않은 사용 사례를 보거나 이에 대한 다른 의견이 있으면 알려주세요.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 마이클 니칭거

마이클 니칭어는 Couchbase의 수석 소프트웨어 엔지니어로 일하고 있습니다. 그는 JVM에서 최초의 완전 반응형 데이터베이스 드라이버 중 하나인 Couchbase Java SDK의 설계자이자 유지 관리자입니다. 또한 Couchbase Spark Connector를 작성하고 유지 관리하고 있습니다. Michael은 오픈 소스 커뮤니티에서 활발히 활동 중이며, RxJava 및 Netty와 같은 다양한 프로젝트에 기여하고 있습니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.