<?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/en/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>en</language>
        <item>
            <title><![CDATA[Introducing structured_logger for Flutter]]></title>
            <link>https://structured-logger.altamir.dev/en/blog/introducing-structured-logger</link>
            <guid>https://structured-logger.altamir.dev/en/blog/introducing-structured-logger</guid>
            <pubDate>Thu, 25 Jun 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Logging in Flutter apps is often a mix of print, debugPrint, and ad-hoc string concatenation. It works day to day, but makes search, alerts, and correlation harder as the app grows.]]></description>
            <content:encoded><![CDATA[<p>Logging in Flutter apps is often a mix of <code>print</code>, <code>debugPrint</code>, and ad-hoc string concatenation. It works day to day, but makes search, alerts, and correlation harder as the app grows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-with-unstructured-logs">The problem with unstructured logs<a href="https://structured-logger.altamir.dev/en/blog/introducing-structured-logger#the-problem-with-unstructured-logs" class="hash-link" aria-label="Direct link to The problem with unstructured logs" title="Direct link to The problem with unstructured logs" translate="no">​</a></h2>
<p>Imagine debugging a production issue with this line:</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>Who is user 42? What was the error? Which attempt failed? Without separate fields, every observability tool needs fragile free-text parsing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-structured-approach">The structured approach<a href="https://structured-logger.altamir.dev/en/blog/introducing-structured-logger#the-structured-approach" class="hash-link" aria-label="Direct link to The structured approach" title="Direct link to The structured approach" translate="no">​</a></h2>
<p>With <strong>structured_logger</strong>, you separate the message <strong>template</strong> from <strong>properties</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>The template stays stable for grouping; data becomes indexable in backends like <a href="https://datalust.co/seq" target="_blank" rel="noopener noreferrer" class="">Seq</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sinks-one-event-many-destinations">Sinks: one event, many destinations<a href="https://structured-logger.altamir.dev/en/blog/introducing-structured-logger#sinks-one-event-many-destinations" class="hash-link" aria-label="Direct link to Sinks: one event, many destinations" title="Direct link to Sinks: one event, many destinations" translate="no">​</a></h2>
<p>The package's strength is the <strong>sink</strong> model. The same event can go to:</p>
<ul>
<li class=""><strong>Terminal</strong> (<code>SimpleLineSink</code>) — quick reading during development</li>
<li class=""><strong>DevTools</strong> (<code>DefaultSink</code>) — inspection in the Dart developer log</li>
<li class=""><strong>Seq</strong> (<code>SinkSeq</code>) — centralization in production</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="next-steps">Next steps<a href="https://structured-logger.altamir.dev/en/blog/introducing-structured-logger#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class="">Read the <a class="" href="https://structured-logger.altamir.dev/en/getting-started/quick-start">quick start guide</a></li>
<li class="">Explore <a class="" href="https://structured-logger.altamir.dev/en/concepts/sinks">sink architecture</a></li>
<li class="">Contribute on <a href="https://github.com/Altamir/structured_logger" target="_blank" rel="noopener noreferrer" class="">GitHub</a></li>
</ul>]]></content:encoded>
            <category>Flutter</category>
            <category>Logging</category>
            <category>Structured Logging</category>
        </item>
        <item>
            <title><![CDATA[SinkSeq — Flutter logs straight to Seq]]></title>
            <link>https://structured-logger.altamir.dev/en/blog/seq-sink-release</link>
            <guid>https://structured-logger.altamir.dev/en/blog/seq-sink-release</guid>
            <pubDate>Sat, 20 Jun 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Version 0.1.0 introduced SinkSeq, allowing Flutter apps to send structured events in CLEF format to Seq servers — the same ecosystem many .NET teams already use.]]></description>
            <content:encoded><![CDATA[<p>Version <strong>0.1.0</strong> introduced <code>SinkSeq</code>, allowing Flutter apps to send structured events in CLEF format to <a href="https://datalust.co/seq" target="_blank" rel="noopener noreferrer" class="">Seq</a> servers — the same ecosystem many .NET teams already use.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-seq">Why Seq?<a href="https://structured-logger.altamir.dev/en/blog/seq-sink-release#why-seq" class="hash-link" aria-label="Direct link to Why Seq?" title="Direct link to Why Seq?" translate="no">​</a></h2>
<p>Seq offers powerful search over structured properties, dashboards, and alerts. With CLEF, each log is a JSON document with <code>@t</code>, <code>@mt</code>, <code>@l</code>, and arbitrary properties — exactly what <code>LogModel</code> already produces.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-usage">Basic usage<a href="https://structured-logger.altamir.dev/en/blog/seq-sink-release#basic-usage" class="hash-link" aria-label="Direct link to Basic usage" title="Direct link to Basic usage" 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">'your-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="improvements-in-011-and-012">Improvements in 0.1.1 and 0.1.2<a href="https://structured-logger.altamir.dev/en/blog/seq-sink-release#improvements-in-011-and-012" class="hash-link" aria-label="Direct link to Improvements in 0.1.1 and 0.1.2" title="Direct link to Improvements in 0.1.1 and 0.1.2" translate="no">​</a></h2>
<p>Later releases fixed important production details:</p>
<ul>
<li class=""><code>Content-Type: application/vnd.serilog.clef</code> header on POST</li>
<li class="">CLEF reserved fields (<code>@t</code>, <code>@mt</code>, <code>@l</code>, <code>DeviceIdentifier</code>) protected from <code>data</code> overwrites</li>
<li class=""><code>SinkSeq.close()</code> to release the internal HTTP pool</li>
<li class="">URL validation in release builds</li>
<li class="">Trailing slash URL normalization</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testability">Testability<a href="https://structured-logger.altamir.dev/en/blog/seq-sink-release#testability" class="hash-link" aria-label="Direct link to Testability" title="Direct link to Testability" translate="no">​</a></h2>
<p>The constructor accepts an injected <code>http.Client</code> — essential for unit tests without network:</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="learn-more">Learn more<a href="https://structured-logger.altamir.dev/en/blog/seq-sink-release#learn-more" class="hash-link" aria-label="Direct link to Learn more" title="Direct link to Learn more" translate="no">​</a></h2>
<p>See the full <a class="" href="https://structured-logger.altamir.dev/en/guides/seq-integration">Seq integration guide</a> in the documentation.</p>]]></content:encoded>
            <category>Seq</category>
            <category>CLEF</category>
            <category>Observability</category>
            <category>Release</category>
        </item>
    </channel>
</rss>