Olá pessoal, nós fomos até o passo 4, hoje nós vamos até o passo 5, onde nós vamos instrumentar o nosso Logback para disponibilizar os logs no formato JSON. O objetivo que a gente quer atingir é a aplicação, aqui a os logs no sysout, como JSON, para o buffer do próprio Docker, buffer de log, e o próprio Docker tem um dispositivo chamado log driver que vai capturar esses eventos e vai jogar no serviço e a gente vai rodar o Splunk, serviço de logs aqui localmente, tá? serviço e a gente vai rodar o Splunk, o serviço de logs aqui localmente. Então a primeira etapa agora vamos fazer o passo 5 que é a instrumentação dos logs no formato JSON seguindo o passo 5. Então nós vamos até o passo 4, o passo 5 nós vamos copiar essa configuração, passo 4 o passo 5 nós vamos copiar essa configuração vamos copiar ela toda vamos copiar toda a configuração vamos lá no nosso log, vou substituir tudo. E só para não atrapalhar um pouco aqui, eu vou comentar o Appender de arquivo, vou disponibilizar só o formato JSON, e aí deixa eu mostrar o que nós temos aqui nessa configuração completa. Aqui a gente tem o Appender utilizando o console Appender mesmo, ele é o console Appender do próprio pacote ali do logback que a gente já viu. Esse console logger, perdão, a diferença é que essa configuração, a gente está usando um encoder, esse encoder chamado Logging Event Composite JSON Encoder, ele faz parte do pacote daquela biblioteca que a gente adicionou e vamos usar definitivamente agora. Então, no POM XML, a gente tem aqui a biblioteca do logback Logstash Encoder, que nós importamos junto com o logback core. portamos junto com o LogbackCore. Dentro do encoder, a gente tem as configurações necessárias que essa biblioteca pede, que são os providers. E dentro dos providers, aqui a gente tem as configurações, quais campos que a gente quer disponibilizar na saída. Eu poderia simplesmente dizer timestamp, logger name, que são os campos que ele reconhece, mas eu quero customizar os campos que eu vou disponibilizar no log. Eu quero que o timestamp se chame ts. Então lá na saída do JSON vai ter um campo ts com o valor do time stamp e eu quero que ele formate com timezone e o tc para cada campo tem uma configuração específica por exemplo a configuração de logger level que eu chamei tem fio do name eu chamei de level mas eu tenho por exemplo o color data que vai ter a classe o método separadinho por campos eu dei o nome da thread aqui, os atributos de MDC eu poderia customizar também mas eu quero que ele disponibilize todos os dados o stack trace, um caso de erro e a mensagem que eu vou, aquela mesma informação que eu passo quando eu chamo log.info, log.error e eu passo aquela parte textual. Ops, apaguei aqui. Um adicional é, quando eu disponibilizo os dados, você que está me assistindo vai ver detalhe, eu vou mostrar, mas quando você disponibiliza a informação na saída e a interpolando ali com o login como eu mostrei, aqueles dados vão ser... o Spring vai chamar o toString daquele objeto e vai formatar de acordo com a função toString que a gente está usando, que você estiver usando. Só que se você quiser capturar os dados estruturados daquele argumento que você passou no login, é possível também, você acrescenta o arguments, e aí você tem aqui o include non-structured arguments e non-structured arguments field prefix. Todos os atributos, ou seja, aquele objeto, ele vai ser disponibilizado agora no outro campo do meu Jason aberto sem por cento aberto ou talvez tem uma alimentação dependendo do tipo de cama mas ele é gerais ele vai disponibilizar aberto para que você consiga até fazer buscas e catalogar ali na ferramenta de logo que você estiver utilizando E esse prefixo, todo argumento vai ter esse campo com prefixo. Então vamos para a parte prática aqui e vamos demonstrar. Aqui não tem nada, só comentei aqui a saída. Vamos dar um play aqui e vamos ver o resultado. Observe que vamos ver o resultado observe que a partir do momento que ele inicializou o Spring ele já está disponibilizando os logs de inicialização já no formato que eu que eu especifiquei vamos fazer algumas requisições na aplicação assim que ele subir eu acho que já subiu eu acho que já foi vamos fazer algumas requisições vamos por exemplo criar aqui em orders vamos criar uma nova order uma nova solicitação novo pedido ops acho que ele tentou subir vamos tentar de novo deixa eu ver acho que ele está rodando em uma porta diferente eu estava rodando na porta 8080 então estou fazendo a seleção aqui desculpe fiz a solicitação de uma nova ordem fiz uma segunda, gerou a ordem 3. Eu vou obter os dados de todas as orders. Vou consultar uma ordem pelo ID. Eu criei até a order 3. Vamos consultar 3. Opa, desculpa. A porta está errada. Vamos. Pronto. Agora vamos consult a porta está errada. Vamos, pronto. Agora vamos consultar uma order errada. Vamos consultar a order 10 que não cadastramos. Então, deu certo lá. Vamos olhar aqui que logs que ele gerou para a gente. Vamos pegar mais ou menos daqui. Deixa eu ver que log que vai ser interessante a gente pegar. Aqui, a partir do momento requested new order. Eu vou pegar todos esses logs. Deixa eu marcar para não perder essa linha. Vou pegar essa linha aqui. Vou pegar todos os logs para baixo. Vamos ver o que ele está disponibilizando para a gente. aqui vou pegar todos os blogs para baixo vamos ver o que que ele tá disponibilizando para gente eu vou colocar no no no no no ps code utilizando o plugin Jason vou formatar botão direito format document ou control shift F ou alt shift F e vamos lá então quando eu fiz a criação da ordem eu ele gerou esse logo e com essa ordem e ela como que ficam os dados na saída aqui eu tenho um livro de log a classe é que mais atrai de três e observe que os dados do mdc estão aqui também espalhados estão três é de que eram um dado que a gente incluiu utilizando o MDC, Map Diagnostic Context, o host também que eu passei na requisição, ele está vindo para cá as informações da aplicação, App Version, Build Name, etc. Vamos para baixo aqui tem uma impressão de um log debugger, lembra que a gente fez a configuração logback para que todas as informações da nossa aplicação aqui do Store App, ele disponibilize também log de debug os demais logs não seriam capturados, o debug da nossa aplicação sim das outras bibliotecas, de outros pacotes não mesma coisa e observe aqui, quando eu fiz uma solicitação quando eu fiz uma requisição da order, tem aqui a opção de debug também, a new order, a order que eu criei. E observe que essa mensagem, se eu buscar no código, vamos lembrar. Essa mensagem aqui é a mensagem que eu joguei na saída utilizando o logger.debug aqui em order controller. Vou buscar aqui, vou minimizar aqui. Observe que aqui quando eu fiz o log.debug, eu coloquei a informação order that is going to be persisted e utilizei o mecanismo de interpolação para colocar o order. Quando ele vai interpolar na mensagem, que é o que está acontecendo aqui, ele vai, o próprio Spring, como é que é um campo de string, ele vai jogar o ponto do string, né? E vai formatar, e quem está formatando para mim é o Lombok como a gente já viu anteriormente o Lombok está formatando desse jeito aqui mas supondo que eu quisesse pesquisar por dados especificamente dessa requisição preço, valor, etc que fizesse nesse sentido então utilizamos aquelas configurações aqui no logback conforme demonstrei e aí ele colocou o prefix argument e o zero é a ordem que os é a ordem que os argumentos vão aparecendo aqui na na ordem que eu fui informando então aqui se tivesse outra variável 2, variável 3 a ordem que eu colocar aqui, ele vai aparecer lá. Então, ele trouxe aqui pra gente o argumento 1, a id da ordem, e aí eu posso até filtrar, buscar no log por essas configurações. Legal? Aqui também, ó, teve uma outra requisição, order saved successfully, eu passo esses dados da ordem ali, ele trouxe pra gente, e os demais requisições, as demais requisições que a gente foi fazendo. Vamos ver um log de exceção, né, quando eu fiz a requisição, passando, solicitando uma ordem que não existia, olha lá, ele trouxe aqui a stack trace, ele não tá quebrando a linha, ele trouxe aqui a stack trace ele não está quebrando a linha porque o próprio o próprio VS Code não quebrou eu poderia trocar esses caracteres de repente trocar por enter, por shift enter, vamos ver se ele vai funcionar, pronto aí eu consigo visualizar, claro que dependendo da ferramenta de log, o Splunk ele permite fazer isso, a gente vai ver daqui a pouco no próximo vídeo aquele já formataria essa quebra-gireira então quando quando deu erro e eu forcei o erro ou seja consultei uma order que não existia ele eu joguei stacktrace também ele trouxe stacktrace para mim aqui ó então pode facilitar muito o dia a dia