<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://structured-logger.altamir.dev/blog</id>
    <title>structured_logger Blog</title>
    <updated>2026-06-25T10:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://structured-logger.altamir.dev/blog"/>
    <subtitle>structured_logger Blog</subtitle>
    <icon>https://structured-logger.altamir.dev/img/logo.svg</icon>
    <entry>
        <title type="html"><![CDATA[Introduzindo structured_logger para Flutter]]></title>
        <id>https://structured-logger.altamir.dev/blog/introducing-structured-logger</id>
        <link href="https://structured-logger.altamir.dev/blog/introducing-structured-logger"/>
        <updated>2026-06-25T10:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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>
        <author>
            <name>Altamir</name>
            <uri>https://github.com/Altamir</uri>
        </author>
        <category label="Flutter" term="Flutter"/>
        <category label="Logging" term="Logging"/>
        <category label="Structured Logging" term="Structured Logging"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SinkSeq — logs Flutter direto no Seq]]></title>
        <id>https://structured-logger.altamir.dev/blog/seq-sink-release</id>
        <link href="https://structured-logger.altamir.dev/blog/seq-sink-release"/>
        <updated>2026-06-20T10:00:00.000Z</updated>
        <summary type="html"><![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.]]></summary>
        <content type="html"><![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>
        <author>
            <name>Altamir</name>
            <uri>https://github.com/Altamir</uri>
        </author>
        <category label="Seq" term="Seq"/>
        <category label="CLEF" term="CLEF"/>
        <category label="Observability" term="Observability"/>
        <category label="Release" term="Release"/>
    </entry>
</feed>