{"id":1676,"date":"2014-12-18T14:17:01","date_gmt":"2014-12-18T14:17:01","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1676"},"modified":"2014-12-18T14:17:01","modified_gmt":"2014-12-18T14:17:01","slug":"logging-couchbase-java-client","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/logging-couchbase-java-client\/","title":{"rendered":"Registro em log com o cliente Java do Couchbase"},"content":{"rendered":"<p><em style=\"line-height: 23px; font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif;\">[Este blog foi distribu\u00eddo pelo site https:\/\/nitschinger.at\/].<\/em><\/p>\n<h2>Introdu\u00e7\u00e3o<\/h2>\n<p>H\u00e1 uma enorme variedade de estruturas de registro para Java, e \u00e9 dif\u00edcil agradar a todos. Para entender como o registro em log \u00e9 tratado atualmente no SDK, temos que voltar alguns anos atr\u00e1s. Como voc\u00ea deve saber, o SDK depende do <a href=\"https:\/\/code.google.com\/p\/spymemcached\/\">cache de spymem<\/a>\u00a0e, portanto, tamb\u00e9m herda seus mecanismos de registro. Na \u00e9poca em que o <a href=\"https:\/\/twitter.com\/dlsspy\">@dustin<\/a>\u00a0escreveu spy, n\u00e3o havia uma boa abstra\u00e7\u00e3o para registro dispon\u00edvel (como <a href=\"https:\/\/www.slf4j.org\/\">SLF4J<\/a>), ent\u00e3o ele escreveu o seu pr\u00f3prio. Atualmente, as coisas mudaram, mas o espi\u00e3o ainda herda esse legado.<\/p>\n<p>No momento em que este artigo foi escrito, o SDK suporta o registro em um registrador padr\u00e3o simples (registros em STDERR a partir do n\u00edvel INFO), <a href=\"https:\/\/logging.apache.org\/log4j\/1.2\/\">Log4J<\/a>\u00a0e o SunLogger (java.util.logging). Na pr\u00f3xima vers\u00e3o 2.9.0 do spymemcached, ele tamb\u00e9m suportar\u00e1 a fachada de registro SLF4J, na qual voc\u00ea poder\u00e1 conectar sua pr\u00f3pria implementa\u00e7\u00e3o. A pr\u00f3xima vers\u00e3o do SDK (provavelmente a 1.1.7) depender\u00e1 do spy 2.9, portanto, voc\u00ea tamb\u00e9m obter\u00e1 os benef\u00edcios.<\/p>\n<p>Antes de nos aprofundarmos nos conceitos, aqui est\u00e3o os n\u00edveis de registro suportados (definidos por <em>net.spy.memcached.compat.log.Level<\/em>):<\/p>\n<ol class=\"rteindent1\">\n<li>TRACE (com 2.9)<\/li>\n<li>DEBUG<\/li>\n<li>INFORMA\u00c7\u00d5ES<\/li>\n<li>AVISO<\/li>\n<li>ERRO<\/li>\n<li>FATAL<\/li>\n<\/ol>\n<p>Lembre-se de que diferentes registradores implementam n\u00edveis diferentes, portanto, para alguns deles, \u00e9 necess\u00e1rio fazer um mapeamento. Isso ser\u00e1 observado durante as descri\u00e7\u00f5es de cada implementa\u00e7\u00e3o.<\/p>\n<p>Agora, veremos os diferentes mecanismos de registro dispon\u00edveis e como voc\u00ea pode configur\u00e1-los. O SLF4J ser\u00e1 abordado no final.<\/p>\n<h2>Troca de registro<\/h2>\n<p>Se voc\u00ea n\u00e3o alterar nada, o registrador padr\u00e3o ser\u00e1 usado. Esse mecanismo apenas imprime mensagens de registro no STDERR (do n\u00edvel INFO para cima). \u00c9 prov\u00e1vel que voc\u00ea queira integrar o SDK com a mesma biblioteca de registro que voc\u00ea tamb\u00e9m usa. O LoggerFactory dentro do spy decide na constru\u00e7\u00e3o qual deles escolher, com base em uma propriedade do sistema. Portanto, voc\u00ea pode alterar isso programaticamente ou por meio de um par\u00e2metro para o <em>java<\/em> comando.<\/p>\n<p>Se voc\u00ea quiser usar o Log4JLogger de forma program\u00e1tica, fa\u00e7a-o desta forma (antes de inicializar o <em>Cliente Couchbase<\/em>\u00a0objeto):<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">Propriedades systemProperties = System.getProperties();<br \/>systemProperties.put(\"net.spy.log.LoggerImpl\", \"net.spy.memcached.compat.log.Log4JLogger\");<br \/>System.setProperties(systemProperties);<\/div>\n<\/div>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">Obviamente, voc\u00ea precisa adicionar o JAR do Log4J ao CLASSPATH para que ele funcione (como veremos mais adiante). Como alternativa, voc\u00ea pode configur\u00e1-lo dessa forma na linha de comando:<\/span><\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">java -Dnet.spy.log.LoggerImpl=net.spy.memcached.compat.log.Log4JLogger ...<\/div>\n<\/div>\n<p>Agora que sabemos como habilitar as diferentes implementa\u00e7\u00f5es, vamos examin\u00e1-las mais detalhadamente.<\/p>\n<h2>O registrador padr\u00e3o simples<\/h2>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">Se voc\u00ea n\u00e3o alterar nada, o SDK usar\u00e1 o DefaultLogger (<\/span><em style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">net.spy.memcached.compat.log.DefaultLogger<\/em><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">). Esse registrador n\u00e3o tem depend\u00eancias e imprime todas as mensagens de registro de n\u00edvel INFO ou superior (INFO, WARN, ERROR e FATAL) no STDERR do sistema. Como o STDERR \u00e9 coberto automaticamente pela maioria dos IDEs, voc\u00ea tamb\u00e9m os ver\u00e1 na janela de sa\u00edda do console.<\/span><\/p>\n<p>Como \u00e9 muito simples, n\u00e3o \u00e9 poss\u00edvel personalizar esse comportamento. Cada mensagem de registro tamb\u00e9m recebe um registro de data e hora (o formato \u00e9 <em>aaaa-MM-dd HH:mm:ss.SSS<\/em>). A conex\u00e3o com o Couchbase geralmente \u00e9 assim:<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">2013-05-07 12:28:41.852 INFO com.couchbase.client.CouchbaseConnection:  Adicionado {QA sa=\/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} \u00e0 fila de conex\u00e3o<br \/>2013-05-07 12:28:41.862 INFO com.couchbase.client.CouchbaseConnection:  Estado da conex\u00e3o alterado para sun.nio.ch.SelectionKeyImpl@3d9360e2<br \/>2013-05-07 12:28:41.887 INFO com.couchbase.client.ViewConnection:  Adicionado localhost \u00e0 fila de conex\u00e3o<br \/>2013-05-07 12:28:41.888 INFO com.couchbase.client.CouchbaseClient: A propriedade viewmode n\u00e3o est\u00e1 definida. Definindo viewmode para o modo de produ\u00e7\u00e3o<br \/>2013-05-07 12:28:41.986 INFO com.couchbase.client.CouchbaseConnection:  Encerrar o cliente Couchbase<br \/>2013-05-07 12:28:41.991 INFO com.couchbase.client.ViewConnection:  O n\u00f3 localhost n\u00e3o tem opera\u00e7\u00f5es na fila<br \/>2013-05-07 12:28:41.992 INFO com.couchbase.client.ViewNode:  Reator de E\/S encerrado para localhost<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Portanto, o formato \u00e9 sempre o mesmo: <em><timestamp> <level> <classname> <message><\/em>. Lembre-se de que as mensagens DEBUG ou similares n\u00e3o ser\u00e3o registradas, portanto, voc\u00ea n\u00e3o as ver\u00e1 com o DefaultLogger.<\/p>\n<div>\u00a0<\/div>\n<h2>O SunLogger (java.util.logging)<\/h2>\n<p>O SunLogger tamb\u00e9m n\u00e3o introduz depend\u00eancias adicionais, pois depende do <em>java.util.logging<\/em> implementa\u00e7\u00e3o. A <em>java.util.logging.Level<\/em> enum define os seguintes n\u00edveis: ALL, CONFIG, FINEST, FINER, FINE, INFO, WARNING, SEVERE e OFF. Como isso n\u00e3o mapeia bem os nossos n\u00edveis definidos, aqui est\u00e1 o mapeamento que acontece:<\/p>\n<div>\u00a0<\/div>\n<ol class=\"rteindent1\">\n<li>TRACE para FINEST (com 2.9)<\/li>\n<li><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">DEBUG para FINE<\/span><\/li>\n<li><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">INFO para INFO<\/span><\/li>\n<li><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">WARN para WARNING<\/span><\/li>\n<li><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">ERROR a SEVERE<\/span><\/li>\n<li><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">FATAL a SEVERO<\/span><\/li>\n<\/ol>\n<div>\u00a0<\/div>\n<div>Sem nenhuma outra altera\u00e7\u00e3o, o SunLogger tamb\u00e9m imprime a partir do n\u00edvel INFO, da seguinte forma:<\/div>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">7 de maio de 2013 12:42:16 PM com.couchbase.client.CouchbaseProperties setPropertyFile<br \/>INFO: N\u00e3o foi poss\u00edvel carregar o arquivo de propriedades \"cbclient.properties\" porque: Arquivo n\u00e3o encontrado com o carregador de classes do sistema.<br \/>7 de maio de 2013 12:42:16 PM net.spy.memcached.MemcachedConnection createConnections<br \/>INFO: Adicionado {QA sa=\/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} \u00e0 fila de conex\u00e3o<br \/>7 de maio de 2013 12:42:16 PM net.spy.memcached.MemcachedConnection handleIO<br \/>INFO: Estado da conex\u00e3o alterado para sun.nio.ch.SelectionKeyImpl@4ce2cb55<br \/>7 de maio de 2013 12:42:16 PM com.couchbase.client.ViewConnection createConnections<br \/>INFO: Adicionado localhost \u00e0 fila de conex\u00e3o<br \/>7 de maio de 2013 12:42:16 PM com.couchbase.client.CouchbaseClient <init><br \/>INFO: A propriedade viewmode n\u00e3o est\u00e1 definida. Defini\u00e7\u00e3o de viewmode para o modo de produ\u00e7\u00e3o<br \/>7 de maio de 2013 12:42:16 PM com.couchbase.client.CouchbaseConnection run<br \/>INFO: Encerrar o cliente Couchbase<br \/>7 de maio de 2013 12:42:16 PM com.couchbase.client.ViewConnection shutdown<br \/>INFO: O n\u00f3 localhost n\u00e3o tem opera\u00e7\u00f5es na fila<br \/>7 de maio de 2013 12:42:16 PM com.couchbase.client.ViewNode$1 run<br \/>INFO: Reator de E\/S encerrado para localhost<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Se quiser alterar o n\u00edvel de registro para DEBUG e inferior, fa\u00e7a isso da seguinte forma:<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">Logger.getLogger(\"com.couchbase.client\").setLevel(Level.FINEST);<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Now there is one more thing you need to do if you want to print all debug messages to the console. You set the logging level correctly, but the `ConsoleHandler` is not set to debug yet (so most likely you will pay the price for debug logging, but won&#39;t actually see anything in your IDE).<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">for(Handler h : Logger.getLogger(\"com.couchbase.client\").getParent().getHandlers()) {<br \/>\u00a0 \u00a0 \u00a0if(h instanceof ConsoleHandler) {<br \/>\u00a0 \u00a0 \u00a0 \u00a0 h.setLevel(Level.FINEST);<br \/>\u00a0 \u00a0 \u00a0}<br \/>}<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>So, here is a full example on how to use the `SunLogger` and get all Debug messages on the console.<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">\u00a0 \u00a0 Propriedades systemProperties = System.getProperties();<br \/>\u00a0 \u00a0 systemProperties.put(\"net.spy.log.LoggerImpl\", \"net.spy.memcached.compat.log.SunLogger\");<br \/>\u00a0 \u00a0 System.setProperties(systemProperties);<\/p>\n<p>\u00a0 \u00a0 Logger logger = Logger.getLogger(\"com.couchbase.client\");<br \/>\u00a0 \u00a0 logger.setLevel(Level.FINEST);<br \/>\u00a0 \u00a0 for(Handler h : logger.getParent().getHandlers()) {<br \/>\u00a0 \u00a0 \u00a0 \u00a0se(h instanceof ConsoleHandler){<br \/>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0h.setLevel(Level.FINEST);<br \/>\u00a0 \u00a0 \u00a0 \u00a0}<br \/>\u00a0 \u00a0 }<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Then just go ahead and create your `CouchbaseClient` object, you will see detailed output like this (trimmed here):<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">7 de maio de 2013 12:54:34 PM com.couchbase.client.vbucket.ReconfigurableObserver update<br \/>FINEST: Recebeu uma atualiza\u00e7\u00e3o, notificando os reconfigur\u00e1veis sobre um com.couchbase.client.vbucket.config.Bucketcom.couchbase.client.vbucket.config.Bucket@3d77949<br \/>7 de maio de 2013 12:54:34 PM com.couchbase.client.vbucket.ReconfigurableObserver update<br \/>FINEST: Recebeu uma atualiza\u00e7\u00e3o, notificando os reconfigur\u00e1veis sobre um com.couchbase.client.vbucket.config.Bucketcom.couchbase.client.vbucket.config.Bucket@4e927ae<br \/>7 de maio de 2013 12:54:34 PM com.couchbase.client.vbucket.ReconfigurableObserver update<br \/>FINEST: Ele diz que \u00e9 padr\u00e3o e est\u00e1 se comunicando com \/pools\/default\/bucketsStreaming\/default?bucket_uuid=adfff22b70e09fafaa26ca37b7e05e9d<br \/>7 de maio de 2013 12:54:34 PM com.couchbase.client.vbucket.ReconfigurableObserver updat<br \/>FINEST: Ele diz que \u00e9 padr\u00e3o e est\u00e1 se comunicando com \/pools\/default\/bucketsStreaming\/default?bucket_uuid=adfff22b70e09fafaa26ca37b7e05e9d<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<h2>Log4J<\/h2>\n<p>A maioria das pessoas precisar\u00e1 de mais flexibilidade, e o Log4J era (e ainda \u00e9) padr\u00e3o em muitos aplicativos. O SDK tamb\u00e9m oferece suporte ao Log4J. Para que ele funcione, primeiro voc\u00ea precisa definir a inst\u00e2ncia corretamente:<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">\u00a0 \u00a0 Propriedades systemProperties = System.getProperties();<br \/>\u00a0 \u00a0 systemProperties.put(\"net.spy.log.LoggerImpl\", \"net.spy.memcached.compat.log.Log4JLogger\");<br \/>\u00a0 \u00a0 System.setProperties(systemProperties);<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Now if you run this, you&#39;ll get an error that some of the Log4J classes can not be found. This is not a surprise, because its not on the classpath. Let&#39;s fix this by adding it accordingly. If you use maven, add the `log4j.log4j` dependency (current version is 1.2.17). You can also just download the JAR and add it to the CLASSPATH as needed.<\/p>\n<div>\u00a0<\/div>\n<div>Agora, se o executarmos novamente, receberemos outro erro:<\/div>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">log4j:WARN N\u00e3o foi poss\u00edvel encontrar nenhum anexo para o registrador (com.couchbase.client.vbucket.ConfigurationProviderHTTP).<br \/>log4j:WARN Por favor, inicialize o sistema log4j corretamente.<br \/>log4j:WARN Consulte https:\/\/logging.apache.org\/log4j\/1.2\/faq.html#noconfig para obter mais informa\u00e7\u00f5es.<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Uma maneira de corrigir isso \u00e9 obter um <em>log4j.xml<\/em>\u00a0em nosso CLASSPATH, mas para que ele funcione rapidamente, o Log4J fornece um arquivo de configura\u00e7\u00e3o <em>BasicConfigurator<\/em>. Logo ap\u00f3s as configura\u00e7\u00f5es de propriedade do sistema, adicione isto:<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">org.apache.log4j.BasicConfigurator.configure();<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Se voc\u00ea execut\u00e1-lo com a altera\u00e7\u00e3o de c\u00f3digo aplicada, ver\u00e1 que as mensagens de registro s\u00e3o bem impressas. Voc\u00ea tamb\u00e9m pode ver que elas aparecem diretamente no n\u00edvel DEBUG (e at\u00e9 mesmo cont\u00eam informa\u00e7\u00f5es de qual thread elas foram registradas):<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">69 [main] INFO com.couchbase.client.CouchbaseConnection - Adicionado {QA sa=\/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} \u00e0 fila de conex\u00e3o<br \/>70 [main] DEBUG com.couchbase.client.vbucket.VBucketNodeLocator - Atualizando o nodesMap no VBucketNodeLocator.<br \/>73 [main] DEBUG com.couchbase.client.vbucket.VBucketNodeLocator - Adicionando n\u00f3 com nome de host 127.0.0.1:11210.<br \/>74 [main] DEBUG com.couchbase.client.vbucket.VBucketNodeLocator - O n\u00f3 adicionado \u00e9 {QA sa=localhost\/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=8}.<br \/>74 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG com.couchbase.client.CouchbaseConnection - Conclu\u00eddo o tratamento da fila.<br \/>74 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG com.couchbase.client.CouchbaseConnection - Selecionando com atraso de 0ms<br \/>79 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG com.couchbase.client.CouchbaseConnection - Selected 1, selected 1 keys<br \/>79 [IO do Memcached sobre<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Voc\u00ea pode controlar os n\u00edveis de registro por meio dos mecanismos usuais do Log4J. N\u00e3o entrarei em detalhes sobre eles aqui, portanto, por favor <a href=\"https:\/\/logging.apache.org\/log4j\/1.2\/manual.html\">confira<\/a>\u00a0sua documenta\u00e7\u00e3o oficial (por exemplo, sobre como usar o <em>Configurador de propriedades<\/em> em vez disso).<\/p>\n<p>Por falar em Log4J, \u00a0<a href=\"https:\/\/twitter.com\/zooldk\">Steffen Larsen<\/a>\u00a0implementou um <a href=\"https:\/\/github.com\/zooldk\/log4j-couchbase\">Ap\u00eandice do Log4J<\/a>\u00a0para armazenar os registros no Couchbase (em vez de em um arquivo)!<\/p>\n<h2>A nova fachada: SLF4J<\/h2>\n<p>N\u00e3o vincular o aplicativo a uma biblioteca de registro espec\u00edfica \u00e9 sempre uma boa ideia. O SLF4J \u00e9 uma fachada para v\u00e1rias estruturas de registro plug\u00e1veis por tr\u00e1s dele. Portanto, voc\u00ea pode escolher a implementa\u00e7\u00e3o de registro durante o tempo de execu\u00e7\u00e3o, seja ela <a href=\"https:\/\/logback.qos.ch\/\">retorno de registro<\/a>Log4J ou outros. Como j\u00e1 experimentamos o Log4J, vamos fazer com que o SLF4J funcione com o Logback, um dos outros frameworks de registro muito comuns no mercado.<\/p>\n<p>Observe que o suporte ao SLF4J estar\u00e1 dispon\u00edvel na vers\u00e3o 1.9.0 do spymemcached e, portanto, tamb\u00e9m em uma das pr\u00f3ximas vers\u00f5es do Couchbase Java SDK.<\/p>\n<p>Primeiro, precisamos configur\u00e1-lo adequadamente:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">Propriedades systemProperties = System.getProperties();<br \/>systemProperties.put(\"net.spy.log.LoggerImpl\", \"net.spy.memcached.compat.log.SLF4JLogger\");<br \/>System.setProperties(systemProperties);<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Now, we need to include two JARs into our classpath. The first one is the SLF4J facade API and the other one is our logging framework of choice. The facade API package is called `slf4j-api` (this package always needs to be in place) and since we want to use logback we need to include the `logback-classic` JAR. Note that this is not specific to the SDK, you can find this information <a href=\"https:\/\/logback.qos.ch\/manual\/introduction.html\">aqui<\/a>. Se voc\u00ea usa o maven, pode usar este snippet:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">\u00a0 \u00a0 <dependency><br \/>\u00a0 \u00a0 \u00a0 <groupid>org.slf4j<\/groupid><br \/>\u00a0 \u00a0 \u00a0 <artifactid>slf4j-api<\/artifactid><br \/>\u00a0 \u00a0 \u00a0 <version>1.7.5<\/version><br \/>\u00a0 \u00a0 <\/dependency><br \/>\u00a0 \u00a0 <dependency><br \/>\u00a0 \u00a0 \u00a0 <groupid>ch.qos.logback<\/groupid><br \/>\u00a0 \u00a0 \u00a0 <artifactid>logback-cl\u00e1ssico<\/artifactid><br \/>\u00a0 \u00a0 \u00a0 <version>1.0.12<\/version><br \/>\u00a0 \u00a0 <\/dependency><\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>O SLF4J pegar\u00e1 automaticamente nossa implementa\u00e7\u00e3o de logback, de modo que os registros ter\u00e3o a seguinte apar\u00eancia:<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">13:25:43.692 [main] INFO c.c.client.CouchbaseConnection - Adicionado {QA sa=\/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} \u00e0 fila de conex\u00e3o<br \/>13:25:43.694 [main] DEBUG c.c.c.vbucket.VBucketNodeLocator - Atualizando o nodesMap no VBucketNodeLocator.<br \/>13:25:43.697 [main] DEBUG c.c.c.vbucket.VBucketNodeLocator - Adicionando n\u00f3 com nome de host 127.0.0.1:11210.<br \/>13:25:43.697 [main] DEBUG c.c.c.vbucket.VBucketNodeLocator - O n\u00f3 adicionado \u00e9 {QA sa=localhost\/127.0.0.1:11210, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=8}.<br \/>13:25:43.698 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG c.c.client.CouchbaseConnection - Conclu\u00eddo o tratamento da fila.<br \/>13:25:43.699 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG c.c.client.CouchbaseConnection - Selecionando com atraso de 0ms<br \/>13:25:43.702 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG c.c.client.CouchbaseConnection - Selecionou 1, selecionou 1 chaves<br \/>13:25:43.703 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] DEBUG c.c.client.CouchbaseConnection - Manipulando IO para: 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})<br \/>13:25:43.703 [Memcached IO over {MemcachedConnection to localhost\/127.0.0.1:11210}] INFO c.c.client.CouchbaseConnection - Estado da conex\u00e3o alterado para sun.nio.ch.SelectionKeyImpl@48ff2413<br \/>13:25:43.713<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<p>Como voc\u00ea pode ver, eles tamb\u00e9m incluem o registro de n\u00edvel DEBUG aqui. Se voc\u00ea n\u00e3o incluir a implementa\u00e7\u00e3o de registro durante o tempo de execu\u00e7\u00e3o, o SLF4J reclamar\u00e1 na inicializa\u00e7\u00e3o:<\/p>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">SLF4J: Falha ao carregar a classe \"org.slf4j.impl.StaticLoggerBinder\".<br \/>SLF4J: implementa\u00e7\u00e3o padr\u00e3o do registrador sem opera\u00e7\u00e3o (NOP)<br \/>SLF4J: Consulte https:\/\/www.slf4j.org\/codes.html#StaticLoggerBinder para obter mais detalhes<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<div>Se voc\u00ea quiser saber como configurar o logback, <a href=\"https:\/\/logback.qos.ch\/manual\/configuration.html\">veja aqui<\/a>.<\/div>\n<div>\u00a0<\/div>\n<h2>Resumo<\/h2>\n<p>Depois de conhecer a abstra\u00e7\u00e3o no spymemcached e como ela funciona, a troca de implementa\u00e7\u00f5es de registro \u00e9 f\u00e1cil e direta. Se voc\u00ea trabalhar com uma das pessoas do Couchbase para relatar erros, tente incluir a sa\u00edda com DEBUG ativado, pois isso inclui muitas informa\u00e7\u00f5es \u00fateis que podem ser usadas para determinar as origens da falha.<\/p>\n<p>Com a fachada SLF4J adicionada na pr\u00f3xima vers\u00e3o do spy (2.9), voc\u00ea poder\u00e1 conectar todas as grandes estruturas de registro existentes no SDK. Informe-nos se encontrar um caso de uso n\u00e3o coberto por esses mecanismos ou se tiver outros coment\u00e1rios sobre o assunto.<\/p>","protected":false},"excerpt":{"rendered":"<p>[This blog was syndicated from https:\/\/nitschinger.at\/] Introduction There is a huge variety in logging frameworks for Java, and its hard to please everyone. To understand how logging is currently handled in the SDK, we have to go back a few [&hellip;]<\/p>","protected":false},"author":19,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[1281],"ppma_author":[8987],"class_list":["post-1676","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-logging"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Logging with the Couchbase Java Client - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/logging-couchbase-java-client\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Logging with the Couchbase Java Client\" \/>\n<meta property=\"og:description\" content=\"[This blog was syndicated from https:\/\/nitschinger.at\/] Introduction There is a huge variety in logging frameworks for Java, and its hard to please everyone. To understand how logging is currently handled in the SDK, we have to go back a few [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/logging-couchbase-java-client\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-18T14:17:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Michael Nitschinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daschl\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Nitschinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/\"},\"author\":{\"name\":\"Michael Nitschinger\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\"},\"headline\":\"Logging with the Couchbase Java Client\",\"datePublished\":\"2014-12-18T14:17:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/\"},\"wordCount\":2201,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Logging\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/\",\"name\":\"Logging with the Couchbase Java Client - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-18T14:17:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Logging with the Couchbase Java Client\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\",\"name\":\"Michael Nitschinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"caption\":\"Michael Nitschinger\"},\"description\":\"Michael Nitschinger works as a Principal Software Engineer at Couchbase. He is the architect and maintainer of the Couchbase Java SDK, one of the first completely reactive database drivers on the JVM. He also authored and maintains the Couchbase Spark Connector. Michael is active in the open source community, a contributor to various other projects like RxJava and Netty.\",\"sameAs\":[\"https:\/\/nitschinger.at\",\"https:\/\/x.com\/daschl\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-nitschinger\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Logging with the Couchbase Java Client - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/logging-couchbase-java-client\/","og_locale":"pt_BR","og_type":"article","og_title":"Logging with the Couchbase Java Client","og_description":"[This blog was syndicated from https:\/\/nitschinger.at\/] Introduction There is a huge variety in logging frameworks for Java, and its hard to please everyone. To understand how logging is currently handled in the SDK, we have to go back a few [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/logging-couchbase-java-client\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-18T14:17:01+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Michael Nitschinger","twitter_card":"summary_large_image","twitter_creator":"@daschl","twitter_misc":{"Written by":"Michael Nitschinger","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/"},"author":{"name":"Michael Nitschinger","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d"},"headline":"Logging with the Couchbase Java Client","datePublished":"2014-12-18T14:17:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/"},"wordCount":2201,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Logging"],"articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/","url":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/","name":"Logging with the Couchbase Java Client - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-18T14:17:01+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/logging-couchbase-java-client\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Logging with the Couchbase Java Client"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d","name":"Michael Nitschinger","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b","url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","caption":"Michael Nitschinger"},"description":"Michael Nitschinger trabalha como engenheiro de software principal na Couchbase. Ele \u00e9 o arquiteto e mantenedor do Couchbase Java SDK, um dos primeiros drivers de banco de dados totalmente reativos na JVM. Ele tamb\u00e9m \u00e9 o autor e mantenedor do Couchbase Spark Connector. Michael participa ativamente da comunidade de c\u00f3digo aberto e contribui para v\u00e1rios outros projetos, como RxJava e Netty.","sameAs":["https:\/\/nitschinger.at","https:\/\/x.com\/daschl"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-nitschinger\/"}]}},"authors":[{"term_id":8987,"user_id":19,"is_guest":0,"slug":"michael-nitschinger","display_name":"Michael Nitschinger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","author_category":"","last_name":"Nitschinger, Principal Software Engineer, Couchbase","first_name":"Michael","job_title":"","user_url":"https:\/\/nitschinger.at","description":"Michael Nitschinger trabalha como engenheiro de software principal na Couchbase. Ele \u00e9 o arquiteto e mantenedor do Couchbase Java SDK, um dos primeiros drivers de banco de dados totalmente reativos na JVM. Ele tamb\u00e9m \u00e9 o autor e mantenedor do Couchbase Spark Connector. Michael participa ativamente da comunidade de c\u00f3digo aberto e contribui para v\u00e1rios outros projetos, como RxJava e Netty."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1676","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1676"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1676\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1676"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}