Olá vamos fazer um hands-on agora de logs especificamente? Deixa eu então antes de qualquer coisa, antes de mais nada mostrar o setup que eu tenho aqui que você pode seguir aí enfim eu estou utilizando a ideia do IntelliJ, o IntelliJ da JetBrains para desenvolvimento em Java nosso hands-on vai ser em Java, mas o conhecimento aqui pode ser replicado com alguma adaptação para qualquer outra linguagem, plataforma. Estou utilizando o Maven mesmo para gestão de artefatos aqui, building. Por curiosidade, essa aplicação eu me baseei em uma aplicação do Spring Guides, que vocês podem utilizar também Tem algumas aplicações para outros propósitos, por exemplo, acessando dados como MySQL, usando de Neo4j, que é um banco de grafos, enfim Vai sair muito fora do nosso escopo, mas fica como curiosidade e eu usei basicamente um exemplo, por exemplo, esse Tutorast aqui me serviu de inspiração para trazer aqui uma ferramenta, uma aplicação, melhor dizendo, para a gente trabalhar em cima. Então vocês podem utilizar também, tá? É claro que eu adaptei bastante para nossa realidade, mas vocês poderiam, você que está assistindo, poderia utilizar e adaptar para estudo próprio. Então o que tem nessa aplicação, o que ela faz? Eu tenho basicamente CRUDs, é isso. Ela é simples, não está seguindo a melhor arquitetura aqui, não está seguindo a arquitetura hexagonal, enfim, a ideia era ser simples mesmo para que a gente focasse na observabilidade diferente, por exemplo, da aplicação que eu estou com o base, até eu agrupei em pacotes aqui por funcionalidade ou por capacidade de negócio, por exemplo, a gestão de order, de pedidos a gestão de produto especificamente a gestão de customers está separadinho, mas não está, obviamente, a melhor arquitetura, porque o objetivo não é a arquitetura, vocês já tiveram, tem bastante material, curso, inclusive, o foco aqui é a observabilidade, então procurei deixar simples mesmo. E aí eu tenho um crude, basicamente, de produtos, tem o seu controller, camada de persistência, vamos entrar já aqui no detalhe, mas tem, por exemplo, a entidade que vai gravar aqui os dados na base, camada de controller aqui, o humanistic controller do Spring, estou usando o Java Spring, o CRUD de solicitações de pedido, de compra, tem um status aqui, quando você faz a solicitação ele entra em progress, aí você tem que fazer uma requisição nova para dizer se está completo ou cancelado. até adequei, por exemplo, incluindo um carrinho de compras ali onde você vai poder vincular a relação de itens e produto e a quantidade que você quer para cada produto vinculado àquela solicitação. Tem um credit customer aqui que a gente nem vai usar, mas está aqui para conhecimento. E o que a gente vai usar de login especificamente? Nós vamos usar o SLF4J, que é a interface comum, a gente vai utilizá-la, que é o Simple Log Facade for Java. Aqui a documentação dela, o site é www.slf4j.org, tem toda a documentação aqui que vocês precisarem e que você precisar tem inclusive a log4shell tem outras ferramentas aqui também e lembrando que é uma interface, a gente vai usar a implementação do logback para o slf4j aqui você encontra bastante coisa, por exemplo na documentação você encontra vários conteúdos várias coisa, por exemplo, na documentação, você encontra vários conteúdos, várias informações, por exemplo, como implementar os patterns de log, em formatos de escrita, etc. Tem bastante coisa legal que você pode procurar. Por exemplo, aqui no Logback Manual, você tem toda a informação que precisa para implementar. você tem toda a informação que precisa para implementar. Então, aqui eu vou te levar até um ponto em que eu vou explicar muita coisa do que o Logback faz, mas caso eu precise estender a customização e além do que eu vou te trazer aqui hoje, nos próximos vídeos que seguirão, eventualmente aqui você pode recorrer a alguma documentação complementar. Aqui, por exemplo, você tem como configurar os appenders, o conceito que eu comentei sobre Map and Diagnostic Context, o MDC, como implementar, visão arquitetural aqui. Então tem bastante coisinha, bastante conteúdo bacana para olhar. Vamos utilizar o Logback, mas caso você queira experimentar uma outra opção você tem um log for J que também é bastante conhecido e implementa ali diretamente a interface da cela for J também assim como o log back tá é um projeto da Apache Apache, inclusive. E aí deixa eu mostrar o que a aplicação vai fazer de fato. Vou rodar aqui a aplicação, colocar ela para executar. Estou apenas passando uma variável de ambiente nela para informar que eu vou utilizar o profile H2, porque eu vou assumir o banco de memory. Mais à frente que eu mostrar que instrumentações são importantes fazer, por exemplo se eu estiver utilizando um container pode ser que eu integre com uma base mais real, por exemplo um post grid, mas aqui eu estou utilizando H2 e a configuração da H2 está aqui para você utilizar. É fora do escopo do que a gente vai trazer aqui, do que eu vou trazer, mas aqui são as configurações básicas da aplicação, e aí eu estou dizendo que eu vou utilizar H2, aqui a senha do banco, etc. O console, caso eu queira acessar para fazer uma carry no banco de dados em memory, eu posso utilizar aqui esse console. Vou executarar aqui para gente ver o que acontece e de cara eu acho interessante porque do ponto de vista de login você não está dizendo parado a o Sprint já tem built-in implementado aqui ó você consegue ver como você só aplicação que já tem os logs aqui implementado. Pô, isso significa que você não precisa fazer nada? Claro que não. Aqui você vai ter um esforço, porque o log não está no padrão ideal, por exemplo, uma aplicação que vai, ou seja, ele não está implementando aqueles princípios que a gente olhou no vídeo anterior, sobre padronização, formato de saída, por exemplo, vou fazer uma requisição, ele não vai ter os logs, os metadados da requisição, enfim. Então, é importante levar em consideração, porque é um log que dá para você fazer um troubleshooting, ajudar você na construção, mas pode ser que não seja um log ideal para um ambiente production ready, para o ponto que você implantar em produção. não é pronto para você ir para a reprodução. Eu vou fazer uso do insomnia, você poderia fazer uso do post, mas eu vou fazer direto o cull, via linha de comando para fazer essa requisição, mas eu vou utilizar o insomnia para simular as requisições e aí logo de cara quando sobe a aplicação, eu já estou fazendo uma carga de dois produtos e alguns pedidos. Então, se eu fizer a consulta de GetOdds, sem especificar o ID, eu vou ter o resultado aqui de alguns pedidos, algumas solicitações já feitas. A solicitação 1, preço total foi esse, esses são os itens do carrinho, ela está em progresso ainda é e se eu quiser buscar por aí de especificamente eu posso informar um aí dia aqui específico que é o aí que eu vi ali e ele vai trazer somente aquele registro se eu buscar por um ID que não existe, ele vai trazer um erro dizendo, opa, não consegui encontrar essa solicitação. E aí vai ter algum log aqui que já está implementado que vai identificar a exceção e vai alugar para a gente. Vamos entrar no detalhe já já. Mas só para explicar o que acontece, eu posso acontece eu posso fazer criar uma nova ordem vem aqui em ordem vou fazer uma requisição informando que eu quero produto uma quantidade dois produtos dois a quantidade de um que tem os produtos tem já o catálogo de produtos e o produto é um Apple MacBook e o produto dois é um é um tênis, tá? Então, eu tô pedindo dois Macbooks e um tênis no carrinho. Vou fazer a requisição apenas pra pra pra registrar aqui. Então, ele gerou aqui o ID dois pra gente, tá em progress com os itens no carrinho. Se eu precisar, se eu quiser completar essa esse pedido, ó, vou consultar antes, né? Agora eu vou consultar passando o ID 2. Ele vem agora o pedido que eu acabei de fazer. Está em progress. Se eu quiser completá-lo, eu venho aqui em order complete, faço requisição, passando o ID do pedido, da solicitaitação da ordem e ele vai completar para mim se eu tentar completar o mesmo pedido mais de uma vez ele vai dizer vai dar erro dizendo a meta não é laudo com o status code 405 dizer não você não pode completar a ordem que já está completado da mesma forma que se você cancelar quiser cancelar essa ordem você tem aqui é order cancels eu passo aqui no path orders 2 que é o ID do produto se eu informar o 2 ele também vai dizer que eu não posso cancelar porque ela está com status completo eu tenho uma outra ordem que se eu buscar aqui todas as ordens, vai ter aqui ID1 e ID2. O ID2 está completo, o ID1 está em progress. Eu posso vir e cancelar o ID1, a solicitação 1. Ela vai agora estar como cancelada. Se eu tentar novamente, ela vai dar o mesmo erro. E se eu consultar agora todas as orders ela vai listar perdão, consultei uma order só, é aqui, todas as orders então só para frisar, aqui não está com validação de boas práticas de segurança, porque aqui eu estou consultando todas as orders, inclusive não está nem relacionada com o customer. Então, existe um problema de segurança, eu não estou com mecanismo de autorização, autenticação. O objetivo aqui é puramente observabilidade, então por isso que a aplicação é simples e ela falta, claro, uma implementação mais sofisticada de arquitetura, tanto na implementação dela quanto de componentes não funcionais no que diz respeito a autenticação autorização e enfim outros elementos que faça sentido tá até o design da p pode ser que não esteja agradável por exemplo isso que você para fazer uma postagem aqui de um pedido, você passa o produto e o ID, enfim, não identifico o cliente que está fazendo a solicitação e de novo. É uma aplicação simples para a gente começar a implementar a observabilidade, então a ideia é que seja simples mesmo.