<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Fernando Mendes</title>
    <description>The latest articles on Forem by Fernando Mendes (@marraia).</description>
    <link>https://forem.com/marraia</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F215530%2F46a6d948-c54b-45bd-aabb-2d7b805aa243.jpeg</url>
      <title>Forem: Fernando Mendes</title>
      <link>https://forem.com/marraia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marraia"/>
    <language>en</language>
    <item>
      <title>Gerenciando a integridade de suas aplicações em AspNet Core</title>
      <dc:creator>Fernando Mendes</dc:creator>
      <pubDate>Mon, 30 Sep 2019 13:04:59 +0000</pubDate>
      <link>https://forem.com/marraia/gerenciando-a-integridade-de-suas-aplicacoes-em-aspnet-core-5113</link>
      <guid>https://forem.com/marraia/gerenciando-a-integridade-de-suas-aplicacoes-em-aspnet-core-5113</guid>
      <description>&lt;p&gt;Olá pessoal, tudo bem?&lt;/p&gt;

&lt;p&gt;Com o crescimento dos microserviços, temos a preocupação de saber se as nossas aplicações, banco de dados, serviços e etc, estão rodando normalmente, se nenhum deles está fora do ar.&lt;/p&gt;

&lt;p&gt;Para isso existe um pacote do nuget muito legal, que se chama: &lt;br&gt;
*AspNetCore.Diagnostics.HealthChecks&lt;/p&gt;

&lt;p&gt;Verifique se pelo o que você precisa, existe a o pacote específico, veja em:&lt;br&gt;
&lt;a href="https://github.com/xabaril/AspNetCore.Diagnostics.HealthChecks"&gt;https://github.com/xabaril/AspNetCore.Diagnostics.HealthChecks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para o controle de aplicações, serviços, banco de dados, existe um pacote complementar para cada um. &lt;/p&gt;

&lt;p&gt;Como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AspNetCore.HealthChecks.MongoDb&lt;/li&gt;
&lt;li&gt;AspNetCore.HealthChecks.RabbitMQ&lt;/li&gt;
&lt;li&gt;AspNetCore.HealthChecks.Kafka&lt;/li&gt;
&lt;li&gt;AspNetCore.HealthChecks.Uris&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos fazer um exemplo, da utilização desse pacote.&lt;/p&gt;
&lt;h6&gt;
  
  
  Estrutura da solução
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bP38zfGq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bne7tlq1ub1donrbc09d.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bP38zfGq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bne7tlq1ub1donrbc09d.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja que criei duas API´s.&lt;/p&gt;

&lt;p&gt;Neste exemplo, quero gerenciar o meu banco de dados que será em Mongodb, meu serviço de fila que será Kafka, e API &lt;em&gt;exemplohealthchecks2&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para o projeto &lt;strong&gt;ExemploHealthChecks&lt;/strong&gt; adicione as referências:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install-Package AspNetCore.HealthChecks.MongoDb&lt;/li&gt;
&lt;li&gt;Install-Package AspNetCore.HealthChecks.Kafka&lt;/li&gt;
&lt;li&gt;Install-Package AspNetCore.HealthChecks.Uris&lt;/li&gt;
&lt;li&gt;Install-Package AspNetCore.HealthChecks.UI&lt;/li&gt;
&lt;li&gt;Install-Package AspNetCore.HealthChecks.UI.Client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Veja como configurar o Kafka, no meu post sobre o serviço:&lt;br&gt;
&lt;a href="https://dev.to/marraia/utilizando-kafka-em-suas-aplicacoes-aspnet-core-2ieo"&gt;https://dev.to/marraia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure no Startup.cs, os endereços dos serviços que iremos monitorar:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Veja que na linha 19, estamos adicionando os serviços que vamos monitorar, com seus respectivos endereços&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    services.AddHealthChecks()
      .AddMongoDb(connectionMongo, name: "mongoDb")
      .AddKafka(configKafka, name: "kafka")
      .AddUrlGroup(new Uri(enderecoExemplo2), name: "exemploHelathChecks2");
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E na linha 25, vamos adicionar um dashboard para visualizar a integridades dos serviços configurados&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services.AddHealthChecksUI();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O pacote do Health com esse Dashboard, cria um arquivo chamado &lt;strong&gt;healthchecksdb&lt;/strong&gt; que irá armazenar os dados coletados dos serviços, como uma especie de banco de dados.&lt;/p&gt;

&lt;p&gt;Na linha 38, estamos gerando uma URL para o Dashboard do Health. Para funcionar corretamente essa URL, temos que adicionar ao arquivo &lt;em&gt;appsettings.json&lt;/em&gt; essa configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"HealthChecks-UI": {
    "HealthChecks": [
      {
        "Name": "Health-ExemploAPI",
        "Uri": "http://localhost:61303/health-marraia"
      }
    ]
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E na linha 45, ativamos o Dashboard, para ser utilizado depois que aplicação for iniciada.&lt;/p&gt;

&lt;p&gt;Depois de configurado, vamos executar o projeto.&lt;/p&gt;

&lt;p&gt;Agora, para abrir o Dashboard do Health que configuramos, vamos abrir esse link:&lt;br&gt;
&lt;em&gt;&lt;a href="http://localhost:61303/healthchecks-ui"&gt;http://localhost:61303/healthchecks-ui&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iipNULvz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9fgqwnxden1yagussips.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iipNULvz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9fgqwnxden1yagussips.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja que ele verifica em um tempo configurado, a integridades dos serviços. No exemplo, todos os serviços estão no ar.&lt;/p&gt;

&lt;p&gt;Agora, não irei executar a API &lt;em&gt;exemploHealthChecks2&lt;/em&gt;, para mostrar que ficará diferente a visualização no Dashboard&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U-rJwfCE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qogeqtwh9hb45pb8gm3x.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U-rJwfCE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qogeqtwh9hb45pb8gm3x.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja que a API &lt;em&gt;exemploHealthChecks2&lt;/em&gt;, fica com um estado de &lt;strong&gt;Unhealthy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bom pessoal, este exemplo é bem simples, somente para mostrar como de forma fácil e simples, criar um monitoramento de seus serviços e aplicações.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado, segue o projeto que utilizei de exemplo em meu Github:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marraia/ExemploHealthChecks"&gt;marraia/HealthChecks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>jundevelopers</category>
      <category>aspnetcore</category>
      <category>healthcheck</category>
    </item>
    <item>
      <title>Utilizando Log em ASP .NET Core</title>
      <dc:creator>Fernando Mendes</dc:creator>
      <pubDate>Fri, 27 Sep 2019 12:26:29 +0000</pubDate>
      <link>https://forem.com/marraia/utilizando-log-em-asp-net-core-3hdo</link>
      <guid>https://forem.com/marraia/utilizando-log-em-asp-net-core-3hdo</guid>
      <description>&lt;p&gt;Olá pessoal, o Asp .NET Core contempla várias funcionalidades nativas que anteriormente precisávamos baixar referências de terceiros como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Injeção de Dependências (Simple Injector, AutoFac, etc…)&lt;/li&gt;
&lt;li&gt;Log (NLog, elmah.io, e etc…)
… e algumas outras mais…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste post vou falar sobre uma delas, que é o Log! Em desenvolvimento de sistemas, precisamos muitas vezes logar a entrada de dados de uma API, ou logar uma exceção para analisar o que pode estar acontecendo dentro de um fluxo do sistema e etc..&lt;/p&gt;

&lt;p&gt;O Log do Asp .NET Core, funciona em vários providers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Console&lt;/li&gt;
&lt;li&gt;Depurar&lt;/li&gt;
&lt;li&gt;EventLog&lt;/li&gt;
&lt;li&gt;AzureAppServices&lt;/li&gt;
&lt;li&gt;TraceSource&lt;/li&gt;
&lt;li&gt;EventSource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No exemplo abaixo vou mostrar, como se loga via console do Visual Studio:&lt;br&gt;
Pelo Visual Studio vamos criar uma WebApi em Asp .NET Core&lt;/p&gt;

&lt;h6&gt;
  
  
  Criação da API
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W465tPVZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/947/1%2AsxXgC80t9PSQCfU8QOb1mQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W465tPVZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/947/1%2AsxXgC80t9PSQCfU8QOb1mQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Estrutura da API
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k28yN2my--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/333/1%2AmxayNcRDehsmse6M4mJG1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k28yN2my--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/333/1%2AmxayNcRDehsmse6M4mJG1g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Edite o arquivo Startup.cs, adicione o using Microsoft.Extensions.Logging e no método Configure, adicione um novo parâmetro: ILoggerFactory loggerFactory&lt;/p&gt;

&lt;p&gt;E adicione no método as configurações de Console e Debug, desta forma o Log vai ser feito pelo Console do Visual Studio em tempo de depuração.&lt;/p&gt;

&lt;h6&gt;
  
  
  Alteração do método Main()
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--68XSmx7j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/461/1%2AhnmpvNkKNyv4ef0IQu6R-Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--68XSmx7j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/461/1%2AhnmpvNkKNyv4ef0IQu6R-Q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos criar uma nova controller para API chamada Cidade, e vamos injetar o ILogger no construtor da controller&lt;/p&gt;

&lt;h6&gt;
  
  
  Injeção da interface do ILogger
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--87mzxQUY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/426/1%2ADhiE2x1jRgfHJcXAc4PJkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--87mzxQUY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/426/1%2ADhiE2x1jRgfHJcXAc4PJkw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adicionei um método GET na API, e vou logar como informação o Id que está sendo passado ao método.&lt;/p&gt;

&lt;h6&gt;
  
  
  Log de informação com Id de Evento
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y0PPzaCw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/461/1%2AnfAjVduFZJo4Ef5sLGItgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y0PPzaCw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/461/1%2AnfAjVduFZJo4Ef5sLGItgg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao executar o método na API, o Log é executado no console do Visual Studio em tempo de depuração:&lt;/p&gt;

&lt;h6&gt;
  
  
  Log no console do Visual Studio
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i5B-jFcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/788/1%2AT9eDy5DjCxzy17SfDYZO8Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i5B-jFcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/788/1%2AT9eDy5DjCxzy17SfDYZO8Q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obs: O ILogger tem várias categorias, além do Information que são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error&lt;/li&gt;
&lt;li&gt;Critical&lt;/li&gt;
&lt;li&gt;Trace&lt;/li&gt;
&lt;li&gt;Warning&lt;/li&gt;
&lt;li&gt;Debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ótimo, mas além logar somente em debug não me adianta muita coisa, quero e preciso logar todas as entradas na API, e também logar todas as exceções que possam acontecer na aplicação.&lt;br&gt;
Para isso, temos que criar uma extensão do ILogger e fazer com que o provider salve os dados do log em um banco de dados. Com isso criei esta estrutura na solução:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tSmVO5sz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/237/1%2AbAi5QEnca8bZPYIIFo8eOg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tSmVO5sz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/237/1%2AbAi5QEnca8bZPYIIFo8eOg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar a extensão, temos que usar o ILoggerFactory para criar um novo contexto, um novo provider para configurar o Log a ser registrado em um banco de dados.&lt;/p&gt;

&lt;p&gt;Essa configuração está na classe AppLoggerExtensions&lt;/p&gt;

&lt;h6&gt;
  
  
  Configurar um novo contexto de Log
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a1QlNPkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/809/1%2A-zj85IeAgzj5sdFUXPcuiQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a1QlNPkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/809/1%2A-zj85IeAgzj5sdFUXPcuiQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois temos que sobrescrever o método de Log, herdando do ILoggerProvider&lt;br&gt;
Essa implementação está na classe AppLoggerProvider&lt;/p&gt;

&lt;h6&gt;
  
  
  Sobrescrevendo o método de criar Log
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L4WpJDll--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/631/1%2A2VjvqtFVe-eVCVVAZZrOfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L4WpJDll--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/631/1%2A2VjvqtFVe-eVCVVAZZrOfg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para depois de fato criar o Log no banco de dados, obtendo as informações que foram colocadas no Log, também sobrescrevendo o método de Log, herdando de ILogger&lt;/p&gt;

&lt;p&gt;Essa implementação está na classe AppLogger&lt;/p&gt;

&lt;h6&gt;
  
  
  Sobrescrevendo o método de criar Log
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O4h4cBFW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/713/1%2A0lj4f428CvYZY4js9RafVg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4h4cBFW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/713/1%2A0lj4f428CvYZY4js9RafVg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criei também, um repositório para executar o log no banco de dados. &lt;/p&gt;

&lt;p&gt;Para isso, criei uma tabela em meu banco de dados chamada EventLog, com essa estrutura:&lt;/p&gt;

&lt;h6&gt;
  
  
  Tabela de Log
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k79vSQFc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/976/1%2AxN3oFuPrGhu_y8PujJDkbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k79vSQFc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/976/1%2AxN3oFuPrGhu_y8PujJDkbg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criei uma entidade LogEvento, para ser de model da tabela&lt;/p&gt;

&lt;h6&gt;
  
  
  Entidade LogEvento
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xU9wSqta--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/348/1%2AbOXvGx9GTZ-BHMnV3CP0oA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xU9wSqta--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/348/1%2AbOXvGx9GTZ-BHMnV3CP0oA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na classe RepositorioLogger existe um método para executar o comando no banco.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7I4nWcq3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1030/1%2Ah4OZTSdQ5DttGYwJNIW9Lg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7I4nWcq3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1030/1%2Ah4OZTSdQ5DttGYwJNIW9Lg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de rodar a API, precisamos adicionar esse novo provider nas configurações da API. Edite o arquivo Startup.cs e adicione o novo contexto, passando a string de conexão de seu banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hTvphDrt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/827/1%2ATJ7HrpEG0gL48ucv60DYAQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hTvphDrt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/827/1%2ATJ7HrpEG0gL48ucv60DYAQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enfim, rodando a aplicação e executando a API, o Log é inserido na tabela EventLog.&lt;/p&gt;

&lt;h6&gt;
  
  
  Executando a API pelo Postman
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C_jdGvWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/950/1%2Auqq4dxEseHRypOVx3LUs5Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C_jdGvWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/950/1%2Auqq4dxEseHRypOVx3LUs5Q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Log na tabela do banco de dados, como no exemplo acima tínhamos escrito.&lt;/p&gt;

&lt;h6&gt;
  
  
  Controller da API
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--46VatRoN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/618/1%2AQVkqVH8tu5YVY9gkMgm56w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--46VatRoN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/618/1%2AQVkqVH8tu5YVY9gkMgm56w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Log incluído na tabela
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ylo8SZRF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/602/1%2Ad0rG8l1u9HmRGlwjB4ytJw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ylo8SZRF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/602/1%2Ad0rG8l1u9HmRGlwjB4ytJw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fazendo corretamente as configurações, vocês terão controle de Log em sua aplicação de forma fácil e simples, sem depender de Dlls de terceiros ou fazer na mão.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado do artigo e até a próxima!&lt;/p&gt;

&lt;p&gt;Segue o fonte de exemplo em meu Github&lt;br&gt;
&lt;a href="https://github.com/marraia/ExemploCoreLog"&gt;Marraia-Log&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>log</category>
      <category>aspnetcore</category>
      <category>jundevelopers</category>
    </item>
    <item>
      <title>Utilizando Kafka em suas aplicações AspNet Core</title>
      <dc:creator>Fernando Mendes</dc:creator>
      <pubDate>Tue, 24 Sep 2019 17:28:04 +0000</pubDate>
      <link>https://forem.com/marraia/utilizando-kafka-em-suas-aplicacoes-aspnet-core-2ieo</link>
      <guid>https://forem.com/marraia/utilizando-kafka-em-suas-aplicacoes-aspnet-core-2ieo</guid>
      <description>&lt;p&gt;Olá pessoal, tudo bem com vocês?!&lt;/p&gt;

&lt;p&gt;Depois de quase um ano sem escrever, por vários motivos profissionais e pessoais, estou aqui escrevendo novamente. Depois também de várias pessoas me cobrarem por retornar a escrever.&lt;/p&gt;

&lt;p&gt;Mas vamos lá, talvez seja um assunto que alguns de vocês podem já conhecer, e já usam, mas mesmo assim resolvi escrever sobre esse tema, e fazer um exemplo da utilização do Apache Kafka com AspNet Core.&lt;/p&gt;

&lt;p&gt;Primeiramente, preciso explicar para aqueles que ainda não conhecem o Apache Kafka, para que ele serve.&lt;/p&gt;

&lt;p&gt;O Apache Kafka, foi desenvolvido na linguagem Scala e Java, e para quem já usa o RabbitMQ para processamento de filas e troca de mensagens, o conceito é o mesmo, mas com algumas diferenças, principalmente performance, e diferente conteúdo de mensagem, como por exemplo streaming, sim isso mesmo que você leu, streaming..&lt;/p&gt;

&lt;p&gt;O Apache Kafka, é muito mais performático que o RabbitMQ, ele lida com alta taxa de transferência, bilhões de mensagens. No seu design, foi dada uma atenção especial para o manuseio eficiente de vários consumidores do mesmo fluxo que leem em velocidades diferentes (streamimg)&lt;/p&gt;

&lt;p&gt;Vamos fazer um exemplo, de como usar o Apache Kafka.&lt;/p&gt;

&lt;p&gt;Primeiramente, vamos fazer a instalação do serviço do Apache Kafka em algum servidor, irei instalar o serviço no Docker. Procurei uma imagem oficial, mas não encontrei, existem algumas por ai, mas irei usar essa que deu certo wurstmeister/kafka&lt;/p&gt;

&lt;p&gt;Segue o compose a ser executado em seu servidor com Docker.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Depois de executar o compose, pode perceber que você terá dois serviços rodando, o Apache Kafka e o Apache ZooKeeper.&lt;/p&gt;

&lt;p&gt;Dai agora você se pergunta: Fernando, o que é esse tal de Apache ZooKeeper?&lt;br&gt;
O Apache Kafka, usa o Apache ZooKeeper, para manter e coordenar os brokers. Ele é responsável por controlar o status dos nós do cluster e permite que vários clientes executem leituras e gravações simultâneas.&lt;/p&gt;

&lt;p&gt;Com o Apache Kafka funcionando em seu Docker junto com o Apache ZooKeeper, vamos criar uma API(Producer) e um Hosted Service (Consumer) em Asp Net Core.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0o5tmufkfdw29ikw0tri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0o5tmufkfdw29ikw0tri.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Estrutura da solução&lt;/p&gt;

&lt;p&gt;Nos dois projetos, vamos adicionar referência:&lt;br&gt;
&lt;em&gt;PM&amp;gt; Install-Package Confluent.Kafka -Version 1.1.0&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Essa referência, irá fazer nos comunicar com o serviço do Apache Kafka.&lt;br&gt;
No projeto Kafka.Producer.API, vamos criar uma nova controller de nome Producer, e adicionar esse código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Veja que na linha 29, colocamos o nome da “fila”, de “fila_pedido”. Isso foi configurado na criação do container. No Apache Kafka, nos chamamos de Tópico. &lt;br&gt;
Quer dizer, para qual canal iremos mandar a mensagem,e por qual canal iremos obter a mensagem.&lt;/p&gt;

&lt;p&gt;Neste caso, fizemos quem irá mandar a mensagem. Agora, a seguir vamos codificar, quem irá receber a mensagem.&lt;/p&gt;

&lt;p&gt;No projeto Kafka.Consumer.Handler, vamos criar uma classe de nome MessageHandler.cs, para ser o consumidor da mensagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F9wivpsfs9giobxmoxs5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F9wivpsfs9giobxmoxs5p.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iremos adicionar esse código nessa classe.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Veja que na linha 20, eu adiciono de qual canal iremos ler as mensagens enviadas.&lt;br&gt;
Caso tenha a mensagem, iremos adicionar no Log a mensagem recebida.&lt;br&gt;
Vamos rodar a aplicação, e ir nesse endereço: &lt;a href="http://localhost:55080/swagger/index.html" rel="noopener noreferrer"&gt;http://localhost:55080/swagger/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fgrt7teatw221ouv38e0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fgrt7teatw221ouv38e0s.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swagger&lt;/strong&gt;&lt;br&gt;
Já adicionei o Swagger na aplicação, e vou colocar uma mensagem a ser enviada.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffggn72km3lx7yg9i4poz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffggn72km3lx7yg9i4poz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando a mensagem é enviada, o consumer recebe a mensagem:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fusr5suj02yio9ogsn8r8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fusr5suj02yio9ogsn8r8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mensagem de Log&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fldy4waclr0uqcmnn8pmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fldy4waclr0uqcmnn8pmv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom gente, está um exemplo simples de como usar o Apache Kafka em suas &lt;br&gt;
aplicações, microserviços em Asp Net Core utilizando Docker para hospedar o serviço do Apache Kafka.&lt;/p&gt;

&lt;p&gt;Para suas aplicações que terá um grande volume de mensagens, e precisa de muita performance, ai está o Apache Kafka.&lt;/p&gt;

&lt;p&gt;Espero terem gostado, segue o fonte em meu &lt;strong&gt;Github&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/marraia/Kafka" rel="noopener noreferrer"&gt;Marraia-Kafka&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um grande abraço e até a próxima!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>jundevelopers</category>
      <category>kakfa</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
