<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>structured_logger Blog</title>
        <link>https://structured-logger.altamir.dev/blog</link>
        <description>structured_logger Blog</description>
        <lastBuildDate>Thu, 25 Jun 2026 10:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>pt-BR</language>
        <item>
            <title><![CDATA[Introduzindo structured_logger para Flutter]]></title>
            <link>https://structured-logger.altamir.dev/blog/introducing-structured-logger</link>
            <guid>https://structured-logger.altamir.dev/blog/introducing-structured-logger</guid>
            <pubDate>Thu, 25 Jun 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Logging em apps Flutter costuma ser uma mistura de print, debugPrint e strings montadas na hora. Funciona no dia a dia, mas dificulta busca, alertas e correlação quando o app cresce.]]></description>
            <content:encoded><![CDATA[<p>Logging em apps Flutter costuma ser uma mistura de <code>print</code>, <code>debugPrint</code> e strings montadas na hora. Funciona no dia a dia, mas dificulta busca, alertas e correlação quando o app cresce.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="o-problema-com-logs-não-estruturados">O problema com logs não estruturados<a href="https://structured-logger.altamir.dev/blog/introducing-structured-logger#o-problema-com-logs-n%C3%A3o-estruturados" class="hash-link" aria-label="Link direto para O problema com logs não estruturados" title="Link direto para O problema com logs não estruturados" translate="no">​</a></h2>
<p>Imagine depurar um problema em produção com a seguinte linha:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">User 42 failed to checkout after 3 retries</span><br></div></code></pre></div></div>
<p>Quem é o usuário 42? Qual foi o erro? Em qual tentativa falhou? Sem campos separados, cada ferramenta de observabilidade precisa fazer parsing frágil de texto livre.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-abordagem-estruturada">A abordagem estruturada<a href="https://structured-logger.altamir.dev/blog/introducing-structured-logger#a-abordagem-estruturada" class="hash-link" aria-label="Link direto para A abordagem estruturada" title="Link direto para A abordagem estruturada" translate="no">​</a></h2>
<p>Com <strong>structured_logger</strong>, você separa o <strong>template</strong> da mensagem das <strong>propriedades</strong>:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> logger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-literal string" style="color:#e3116c">'User {userId} failed checkout after {retries} retries: {error}'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  level</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">LogLevel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">error</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-literal string" style="color:#e3116c">'userId'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-literal string" style="color:#e3116c">'retries'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-literal string" style="color:#e3116c">'error'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'payment_timeout'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>O template permanece estável para agrupamento; os dados ficam indexáveis em backends como <a href="https://datalust.co/seq" target="_blank" rel="noopener noreferrer" class="">Seq</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sinks-um-evento-vários-destinos">Sinks: um evento, vários destinos<a href="https://structured-logger.altamir.dev/blog/introducing-structured-logger#sinks-um-evento-v%C3%A1rios-destinos" class="hash-link" aria-label="Link direto para Sinks: um evento, vários destinos" title="Link direto para Sinks: um evento, vários destinos" translate="no">​</a></h2>
<p>O diferencial do pacote é o modelo de <strong>sinks</strong>. O mesmo evento pode ir para:</p>
<ul>
<li class=""><strong>Terminal</strong> (<code>SimpleLineSink</code>) — leitura rápida durante o desenvolvimento</li>
<li class=""><strong>DevTools</strong> (<code>DefaultSink</code>) — inspeção no log do desenvolvedor Dart</li>
<li class=""><strong>Seq</strong> (<code>SinkSeq</code>) — centralização em produção</li>
</ul>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> logger </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">StructureLogger</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">logger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSink</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">SimpleLineSink</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">logger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSink</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">SinkSeq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">'https://seq.example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> apiKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apiKey</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="próximos-passos">Próximos passos<a href="https://structured-logger.altamir.dev/blog/introducing-structured-logger#pr%C3%B3ximos-passos" class="hash-link" aria-label="Link direto para Próximos passos" title="Link direto para Próximos passos" translate="no">​</a></h2>
<ul>
<li class="">Leia a <a class="" href="https://structured-logger.altamir.dev/getting-started/quick-start">documentação de início rápido</a></li>
<li class="">Explore a <a class="" href="https://structured-logger.altamir.dev/concepts/sinks">arquitetura de sinks</a></li>
<li class="">Contribua no <a href="https://github.com/Altamir/structured_logger" target="_blank" rel="noopener noreferrer" class="">repositório GitHub</a></li>
</ul>]]></content:encoded>
            <category>Flutter</category>
            <category>Logging</category>
            <category>Structured Logging</category>
        </item>
        <item>
            <title><![CDATA[SinkSeq — logs Flutter direto no Seq]]></title>
            <link>https://structured-logger.altamir.dev/blog/seq-sink-release</link>
            <guid>https://structured-logger.altamir.dev/blog/seq-sink-release</guid>
            <pubDate>Sat, 20 Jun 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[A versão 0.1.0 trouxe o SinkSeq, permitindo que apps Flutter enviem eventos estruturados em formato CLEF para servidores Seq — o mesmo ecossistema usado por muitas equipes .NET.]]></description>
            <content:encoded><![CDATA[<p>A versão <strong>0.1.0</strong> trouxe o <code>SinkSeq</code>, permitindo que apps Flutter enviem eventos estruturados em formato CLEF para servidores <a href="https://datalust.co/seq" target="_blank" rel="noopener noreferrer" class="">Seq</a> — o mesmo ecossistema usado por muitas equipes .NET.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="por-que-seq">Por que Seq?<a href="https://structured-logger.altamir.dev/blog/seq-sink-release#por-que-seq" class="hash-link" aria-label="Link direto para Por que Seq?" title="Link direto para Por que Seq?" translate="no">​</a></h2>
<p>Seq oferece busca poderosa em propriedades estruturadas, dashboards e alertas. Com CLEF, cada log é um documento JSON com campos <code>@t</code>, <code>@mt</code>, <code>@l</code> e propriedades arbitrárias — exatamente o que <code>LogModel</code> já produz.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="uso-básico">Uso básico<a href="https://structured-logger.altamir.dev/blog/seq-sink-release#uso-b%C3%A1sico" class="hash-link" aria-label="Link direto para Uso básico" title="Link direto para Uso básico" translate="no">​</a></h2>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> seqSink </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">SinkSeq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-literal string" style="color:#e3116c">'https://seq.example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  apiKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'sua-api-key'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  deviceIdentifier</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'checkout-app'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">logger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSink</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">seqSink</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> logger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-literal string" style="color:#e3116c">'Order {orderId} placed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  level</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">LogLevel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">info</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string-literal string" style="color:#e3116c">'orderId'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">'ORD-991'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="melhorias-na-011-e-012">Melhorias na 0.1.1 e 0.1.2<a href="https://structured-logger.altamir.dev/blog/seq-sink-release#melhorias-na-011-e-012" class="hash-link" aria-label="Link direto para Melhorias na 0.1.1 e 0.1.2" title="Link direto para Melhorias na 0.1.1 e 0.1.2" translate="no">​</a></h2>
<p>As versões seguintes corrigiram detalhes importantes para uso em produção:</p>
<ul>
<li class="">Header <code>Content-Type: application/vnd.serilog.clef</code> no POST</li>
<li class="">Campos CLEF reservados (<code>@t</code>, <code>@mt</code>, <code>@l</code>, <code>DeviceIdentifier</code>) protegidos contra sobrescrita por <code>data</code></li>
<li class=""><code>SinkSeq.close()</code> para liberar o pool HTTP interno</li>
<li class="">Validação de URL em builds de release</li>
<li class="">Normalização de URL com trailing slash</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testabilidade">Testabilidade<a href="https://structured-logger.altamir.dev/blog/seq-sink-release#testabilidade" class="hash-link" aria-label="Link direto para Testabilidade" title="Link direto para Testabilidade" translate="no">​</a></h2>
<p>O construtor aceita um <code>http.Client</code> injetado — essencial para testes unitários sem rede:</p>
<div class="language-dart codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-dart codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token class-name">SinkSeq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-literal string" style="color:#e3116c">'https://seq.test'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mockClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="saiba-mais">Saiba mais<a href="https://structured-logger.altamir.dev/blog/seq-sink-release#saiba-mais" class="hash-link" aria-label="Link direto para Saiba mais" title="Link direto para Saiba mais" translate="no">​</a></h2>
<p>Confira o <a class="" href="https://structured-logger.altamir.dev/guides/seq-integration">guia completo de integração com Seq</a> na documentação.</p>]]></content:encoded>
            <category>Seq</category>
            <category>CLEF</category>
            <category>Observability</category>
            <category>Release</category>
        </item>
    </channel>
</rss>