<?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: LogFlux</title>
    <description>The latest articles on Forem by LogFlux (@logflux).</description>
    <link>https://forem.com/logflux</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%2Forganization%2Fprofile_image%2F11551%2Fc0c22d63-f025-4775-8ab3-dfda0fbbd933.png</url>
      <title>Forem: LogFlux</title>
      <link>https://forem.com/logflux</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/logflux"/>
    <language>en</language>
    <item>
      <title>Your Logs Contain Secrets: Why We Built a Zero-Knowledge Log Platform</title>
      <dc:creator>someone</dc:creator>
      <pubDate>Tue, 09 Sep 2025 16:58:09 +0000</pubDate>
      <link>https://forem.com/logflux/your-logs-contain-secrets-why-we-built-a-zero-knowledge-log-platform-3igj</link>
      <guid>https://forem.com/logflux/your-logs-contain-secrets-why-we-built-a-zero-knowledge-log-platform-3igj</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5lt3xk2rdk37vbo4vao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5lt3xk2rdk37vbo4vao.png" alt="Zero-Knowledge Logging Architecture" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every developer knows this uncomfortable truth: we've all accidentally logged sensitive data. Maybe it was a debug statement that printed the entire request object (headers and all). Maybe it was an error handler that dumped the database connection string. Maybe it was that helpful middleware that logs everything "just in case."&lt;/p&gt;

&lt;p&gt;But here's what keeps me up at night: &lt;strong&gt;every major log aggregation service can read your logs&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Not "might be able to." Not "theoretically could." They &lt;em&gt;can&lt;/em&gt; read them. Right now.&lt;/p&gt;

&lt;p&gt;Think about that. Your logs probably contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys that slipped through in request headers&lt;/li&gt;
&lt;li&gt;Customer data in error messages&lt;/li&gt;
&lt;li&gt;Internal service URLs and architecture details&lt;/li&gt;
&lt;li&gt;Session tokens, auth headers, and JWTs&lt;/li&gt;
&lt;li&gt;Database connection strings with embedded passwords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And all of this data sits readable in your log provider's infrastructure. Their employees could read it. Anyone who breaches them could read it. Government requests could demand it.&lt;/p&gt;

&lt;p&gt;This isn't a hypothetical problem. Real breaches have started with log access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The LastPass breach in 2022 began with access to their development environment logs&lt;/li&gt;
&lt;li&gt;Toyota exposed source code through misconfigured Elasticsearch clusters containing logs&lt;/li&gt;
&lt;li&gt;CircleCI's 2023 incident involved attackers accessing environment variables in build logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But instead of making up a dramatic story, let me tell you why we actually decided to build a zero-knowledge log platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Started Building This
&lt;/h2&gt;

&lt;p&gt;I've been running production systems for over a decade. Every team I've worked with has had the same "oh shit" moment when someone realizes what's actually in the logs. It usually happens during a security audit or compliance review:&lt;/p&gt;

&lt;p&gt;"Hey, why can I see customer email addresses in these error logs?"&lt;/p&gt;

&lt;p&gt;"Is that a Stripe API key in that debug output?"&lt;/p&gt;

&lt;p&gt;"Wait, are we logging the entire request body including passwords?"&lt;/p&gt;

&lt;p&gt;The traditional solutions are band-aids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add redaction rules (that developers forget to update)&lt;/li&gt;
&lt;li&gt;Filter sensitive logs (losing debugging capability when you need it most)&lt;/li&gt;
&lt;li&gt;Trust your log provider's security (hope they never get breached)&lt;/li&gt;
&lt;li&gt;Just... try to be careful (this always works, right?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We realized there's a fundamental problem: &lt;strong&gt;centralized logging requires centralized trust&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Really in Your Logs?
&lt;/h2&gt;

&lt;p&gt;Let's be honest about what typically ends up in production logs. Here's actual code I've seen in production systems (sanitized for obvious reasons):&lt;/p&gt;

&lt;h3&gt;
  
  
  The Classic Debug Statement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// "I'll remove this before deploying" - Famous last words&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payment processing:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// Contains email, phone, address&lt;/span&gt;
  &lt;span class="na"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;paymentData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Contains card details&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;stripeConfig&lt;/span&gt;     &lt;span class="c1"&gt;// Contains API keys&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Helpful Error Handler
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Logs the entire stack trace with all local variables
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Database error for user &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;connection&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_connection&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# Password in connection string
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                    &lt;span class="c1"&gt;# May contain PII
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;environment&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;          &lt;span class="c1"&gt;# ALL environment variables
&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Overzealous Middleware
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// "We need this for debugging production issues"&lt;/span&gt;
&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[REQUEST] %s %s Headers: %v Body: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;      &lt;span class="c"&gt;// May contain API keys in query params&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c"&gt;// Contains auth tokens&lt;/span&gt;
    &lt;span class="n"&gt;bodyBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c"&gt;// Contains... everything&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Third-Party Library That's "Helping"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Some ORM or HTTP client with verbose logging&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Executing&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
  &lt;span class="nx"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;FROM&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="nx"&gt;WHERE&lt;/span&gt; &lt;span class="nx"&gt;ssn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;123-45-6789&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;AND&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;plaintext_password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Connection&lt;/span&gt; &lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
  &lt;span class="nx"&gt;postgresql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//admin:SuperSecret123@prod-db.internal:5432/customers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this simple check on your own logs (if you dare):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check for potential secrets in your logs&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s1"&gt;'(api[_-]?key|password|token|secret|bearer|authorization)'&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt;.log | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# Check for potential PII&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'[0-9]{3}-[0-9]{2}-[0-9]{4}|[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}'&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt;.log | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Current "Solutions" Don't Actually Solve Anything
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual Redaction: The Infinite Game of Whack-a-Mole
&lt;/h3&gt;

&lt;p&gt;Every team tries to build a redaction layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sanitizeLogs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sensitiveFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apiKey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 50 more fields added over time&lt;/span&gt;

  &lt;span class="c1"&gt;// But what about:&lt;/span&gt;
  &lt;span class="c1"&gt;// - nested objects?&lt;/span&gt;
  &lt;span class="c1"&gt;// - different naming conventions (api-key vs apiKey vs api_key)?&lt;/span&gt;
  &lt;span class="c1"&gt;// - base64 encoded data?&lt;/span&gt;
  &lt;span class="c1"&gt;// - new fields that developers add tomorrow?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This fails because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's a blocklist approach in a world that needs allowlists&lt;/li&gt;
&lt;li&gt;Developers under pressure bypass it&lt;/li&gt;
&lt;li&gt;New sensitive fields appear constantly&lt;/li&gt;
&lt;li&gt;You're still trusting your provider with everything else&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "We Trust Our Provider" Approach
&lt;/h3&gt;

&lt;p&gt;"We use [BigCorp Cloud Logging]. They're SOC2 compliant!"&lt;/p&gt;

&lt;p&gt;Sure, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Their employees can still read your logs&lt;/li&gt;
&lt;li&gt;Compliance doesn't prevent breaches&lt;/li&gt;
&lt;li&gt;Subpoenas and government requests exist&lt;/li&gt;
&lt;li&gt;Their security isn't your security&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enter Zero-Knowledge Logging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Fundamental Shift
&lt;/h3&gt;

&lt;p&gt;What if your log provider &lt;em&gt;couldn't&lt;/em&gt; read your logs, even if they wanted to? Not through policy, not through promises, but through cryptographic impossibility?&lt;/p&gt;

&lt;p&gt;That's what we built: Your logs are encrypted &lt;em&gt;before&lt;/em&gt; they leave your application. Only you hold the keys.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Actually Works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditional Logging:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// What you write&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payment failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="na"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cust_8474&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;99.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cardLast4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4242&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// What your provider sees (EVERYTHING IN PLAINTEXT)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;customerId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cust_8474&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Readable&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;amount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;99.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;// Readable&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cardLast4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4242&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;             &lt;span class="c1"&gt;// Readable&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Zero-Knowledge Logging:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// What you write (exact same code)&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payment failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="na"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cust_8474&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;99.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cardLast4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4242&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// What your provider sees (LogEnvelope - ENCRYPTED)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timestamp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-09-03T10:30:45.123Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;entry_type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;payload_type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;payload&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;U2FsdGVkX1+vJqK8Lm9pN3R4c5T6u7V8w9X0...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nonce&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The provider can still route, store, and search your logs using the tokens, but they can't read the actual content. Ever.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15niuz49frahs8myd5b0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15niuz49frahs8myd5b0.png" alt="Zero-Knowledge Logging Architecture" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The flow is simple but powerful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your Application&lt;/strong&gt; → &lt;strong&gt;Agent&lt;/strong&gt; (runs locally on your servers, encrypts logs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent&lt;/strong&gt; → &lt;strong&gt;Log Provider&lt;/strong&gt; (stores/archives encrypted logs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log Provider&lt;/strong&gt; → &lt;strong&gt;Client Apps&lt;/strong&gt; (runs locally on your system, decrypts logs)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At no point does the Log Provider have access to your encryption keys or readable log content. They handle encrypted blobs that are meaningless without your keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Compliance Superpower Nobody Expected
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GDPR's "Right to be Forgotten" - Actually Possible
&lt;/h3&gt;

&lt;p&gt;With traditional logging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logs are replicated everywhere&lt;/li&gt;
&lt;li&gt;Backups are immutable&lt;/li&gt;
&lt;li&gt;You need to hunt down every copy&lt;/li&gt;
&lt;li&gt;Derived data exists in analytics systems&lt;/li&gt;
&lt;li&gt;It's basically impossible to truly delete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With zero-knowledge logging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Delete user data with one key deletion&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deleteUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Delete the encryption key&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;keyManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`user:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// All logs for this user are now permanent noise&lt;/span&gt;
  &lt;span class="c1"&gt;// No need to touch the actual log data&lt;/span&gt;
  &lt;span class="c1"&gt;// No need to modify backups&lt;/span&gt;
  &lt;span class="c1"&gt;// Cryptographic deletion - immediate and complete&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Data Residency Without the Complexity
&lt;/h3&gt;

&lt;p&gt;Traditional approach: Separate deployments per region, complex routing, data replication rules.&lt;/p&gt;

&lt;p&gt;Our approach: Your encrypted logs can be stored anywhere. Data residency is controlled by where your keys live, not where the encrypted blobs are stored.&lt;/p&gt;

&lt;p&gt;Of course, if your compliance requirements demand it, we also support traditional geographic data residency - keeping your encrypted logs in specific regions. But here's the key difference: even with regional storage, your data remains encrypted with keys you control. So whether your logs are stored in Frankfurt, Singapore, or Virginia, the fundamental zero-knowledge principle holds - we can't read them regardless of where they physically reside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Logs can be stored in US&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ZeroKnowledgeLogger&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;logEndpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://us-east-1.logprovider.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="c1"&gt;// But keys never leave EU&lt;/span&gt;
  &lt;span class="na"&gt;keyManagement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://eu-keys.your-company.internal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// Result: GDPR compliant even though logs are in US&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Hard Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "What if we lose access to our keys?"
&lt;/h3&gt;

&lt;p&gt;This is a valid concern, but here's the key point: &lt;strong&gt;we never have access to your keys in the first place&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Your encryption keys are generated and stored entirely on your side. LogFlux only ever sees encrypted data that we cannot decrypt. However, for the infrastructure keys that manage our service (not your data encryption keys), we do implement robust safeguards:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// LogFlux infrastructure key management&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service_keys&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Stored in HSM with multi-party access&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;backup_keys&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Distributed across secure locations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;access_keys&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Multi-signature authentication required&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Our key protection strategy&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Hardware&lt;/span&gt; &lt;span class="nx"&gt;security&lt;/span&gt; &lt;span class="nf"&gt;modules &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HSMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;critical&lt;/span&gt; &lt;span class="nx"&gt;infrastructure&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;party&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="nx"&gt;recovery&lt;/span&gt; &lt;span class="nx"&gt;procedures&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Secure&lt;/span&gt; &lt;span class="nx"&gt;backup&lt;/span&gt; &lt;span class="nx"&gt;procedures&lt;/span&gt; &lt;span class="nx"&gt;across&lt;/span&gt; &lt;span class="nx"&gt;geographic&lt;/span&gt; &lt;span class="nx"&gt;regions&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Clear&lt;/span&gt; &lt;span class="nx"&gt;incident&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="nx"&gt;protocols&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  "How do we debug production issues?"
&lt;/h3&gt;

&lt;p&gt;You maintain full debugging capability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Temporary decryption session for debugging&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;debugSession&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createDebugSession&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1h&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production-errors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;oncall-engineer@company.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Investigating customer issue #1234&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// All access is audited&lt;/span&gt;
&lt;span class="c1"&gt;// Session auto-expires&lt;/span&gt;
&lt;span class="c1"&gt;// Logs remain encrypted at rest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  "Isn't this overkill for our startup?"
&lt;/h3&gt;

&lt;p&gt;Consider the alternative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One leaked API key can kill your business&lt;/li&gt;
&lt;li&gt;One GDPR violation can cost 4% of global revenue&lt;/li&gt;
&lt;li&gt;One breach destroys customer trust forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Starting with zero-knowledge is easier than retrofitting security later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Built This
&lt;/h2&gt;

&lt;p&gt;We're not trying to sell you on fear. We're building this because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;We've been burned before&lt;/strong&gt; - Every engineer has accidentally leaked something in logs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust shouldn't be required&lt;/strong&gt; - Good security doesn't rely on promises&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy is a feature&lt;/strong&gt; - Your customers' data should be protected by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance should be simple&lt;/strong&gt; - Cryptographic deletion beats complex data pipelines&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try This Yourself
&lt;/h2&gt;

&lt;p&gt;Before you dismiss this as unnecessary, run this audit on your current logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick check for common sensitive patterns&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Checking for potential secrets in logs..."&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;pattern &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="s1"&gt;'token'&lt;/span&gt; &lt;span class="s1"&gt;'api.?key'&lt;/span&gt; &lt;span class="s1"&gt;'secret'&lt;/span&gt; &lt;span class="s1"&gt;'authorization'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt;.log 2&amp;gt;/dev/null | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Found &lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="s2"&gt; instances of '&lt;/span&gt;&lt;span class="nv"&gt;$pattern&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
  &lt;span class="k"&gt;fi
done&lt;/span&gt;

&lt;span class="c"&gt;# Check for credit card patterns&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Checking for credit card patterns..."&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}'&lt;/span&gt; /var/log/&lt;span class="k"&gt;*&lt;/span&gt;.log 2&amp;gt;/dev/null | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you find anything, you have a problem that needs solving.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Path Forward
&lt;/h2&gt;

&lt;p&gt;Zero-knowledge logging isn't about paranoia. It's about accepting reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breaches happen&lt;/li&gt;
&lt;li&gt;Mistakes happen&lt;/li&gt;
&lt;li&gt;Insider threats exist&lt;/li&gt;
&lt;li&gt;Compliance requirements are getting stricter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question isn't "Will someone try to read your logs?" &lt;/p&gt;

&lt;p&gt;The question is "When they try, what will they find?"&lt;/p&gt;

&lt;p&gt;With traditional logging: Everything.&lt;/p&gt;

&lt;p&gt;With zero-knowledge logging: Encrypted noise.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
This was orginally posted to our blog &lt;a href="https://logflux.io/blog/your-logs-contain-secrets/?source=devtot&amp;amp;utm_source=devto&amp;amp;utm_medium=blog-repost&amp;amp;utm_campaign=zero-knowledge-logging&amp;amp;utm_content=bloglink" rel="noopener noreferrer"&gt;https://logflux.io/blog/your-logs-contain-secrets/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Check out our approach at &lt;a href="https://logflux.io?source=devtot&amp;amp;utm_source=devto&amp;amp;utm_medium=blog-repost&amp;amp;utm_campaign=zero-knowledge-logging&amp;amp;utm_content=bloglink" rel="noopener noreferrer"&gt;logflux.io&lt;/a&gt;. The future of logging isn't about collecting more data - it's about collecting data responsibly.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>showdev</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
