<?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>DEV Community: Hello Cerbi</title>
    <description>The latest articles on DEV Community by Hello Cerbi (@hellocerbi).</description>
    <link>https://dev.to/hellocerbi</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3602114%2F38362102-25a9-472d-871f-13a7bcfcffc0.png</url>
      <title>DEV Community: Hello Cerbi</title>
      <link>https://dev.to/hellocerbi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hellocerbi"/>
    <language>en</language>
    <item>
      <title>Cerbi Scanner: Find Risky Log Calls Before They Ship</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Wed, 03 Jun 2026 00:36:47 +0000</pubDate>
      <link>https://dev.to/hellocerbi/cerbi-scanner-find-risky-log-calls-before-they-ship-5h81</link>
      <guid>https://dev.to/hellocerbi/cerbi-scanner-find-risky-log-calls-before-they-ship-5h81</guid>
      <description>&lt;p&gt;I’m building Cerbi Scanner because I think most teams have a blind spot in their DevSecOps process.&lt;/p&gt;

&lt;p&gt;We scan dependencies.&lt;/p&gt;

&lt;p&gt;We scan containers.&lt;/p&gt;

&lt;p&gt;We scan secrets.&lt;/p&gt;

&lt;p&gt;We scan infrastructure.&lt;/p&gt;

&lt;p&gt;But we rarely scan the thing that quietly spreads operational, customer, and security data everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logger.info(...)
console.log(...)
LogInformation(...)
logger.error(...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs start as debugging help.&lt;/p&gt;

&lt;p&gt;Then they become searchable data.&lt;/p&gt;

&lt;p&gt;Then they show up in dashboards, alerts, SIEM tools, storage accounts, incident exports, support screenshots, and audit trails.&lt;/p&gt;

&lt;p&gt;By the time someone asks, “Why did we log that?”, the data has already moved.&lt;/p&gt;

&lt;p&gt;Cerbi Scanner is meant to make that risk visible earlier.&lt;/p&gt;

&lt;p&gt;Not after production.&lt;/p&gt;

&lt;p&gt;Not after ingestion.&lt;/p&gt;

&lt;p&gt;In the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Cerbi Scanner is
&lt;/h2&gt;

&lt;p&gt;Cerbi Scanner is a repo-level logging governance scanner.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show teams where risky logging behavior already exists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It looks for patterns like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;requestBody near log calls
token near log calls
password near log calls
authorizationHeader near log calls
email or customer data near log calls
unstructured log messages
missing correlation fields
inconsistent event names
missing governance profiles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first version is focused on visibility.&lt;/p&gt;

&lt;p&gt;Not rewriting your code.&lt;/p&gt;

&lt;p&gt;Not forcing a migration.&lt;/p&gt;

&lt;p&gt;Not making every developer stop and attend a governance ceremony.&lt;/p&gt;

&lt;p&gt;Just scan the repo and show the risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;p&gt;Cerbi Scanner is not a replacement for Snyk, Trivy, GitHub Advanced Security, Sonar, or secret scanning.&lt;/p&gt;

&lt;p&gt;Those tools matter.&lt;/p&gt;

&lt;p&gt;They answer questions like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do we have vulnerable dependencies?
Did we commit a secret?
Is this container risky?
Does the code have known security issues?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cerbi Scanner asks a different question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Are we about to ship risky logging behavior?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a smaller question, but it matters.&lt;/p&gt;

&lt;p&gt;Because a clean dependency scan does not mean your app is safe to log a request body.&lt;/p&gt;

&lt;p&gt;A passing build does not mean your structured logs are actually structured.&lt;/p&gt;

&lt;p&gt;A green dashboard does not mean the data feeding it is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Most teams have logging standards.&lt;/p&gt;

&lt;p&gt;Somewhere.&lt;/p&gt;

&lt;p&gt;Maybe in Confluence.&lt;/p&gt;

&lt;p&gt;Maybe in a platform guide.&lt;/p&gt;

&lt;p&gt;Maybe in a security checklist.&lt;/p&gt;

&lt;p&gt;The standards usually say things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not log secrets.
Do not log PII.
Use structured logging.
Include correlation IDs.
Use consistent event names.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All reasonable.&lt;/p&gt;

&lt;p&gt;But standards are only useful if teams can see whether code is following them.&lt;/p&gt;

&lt;p&gt;That is the gap.&lt;/p&gt;

&lt;p&gt;A developer can search a repo for &lt;code&gt;logger&lt;/code&gt;, &lt;code&gt;token&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, or &lt;code&gt;requestBody&lt;/code&gt; and often find suspicious patterns manually.&lt;/p&gt;

&lt;p&gt;That is exactly why a scanner should exist.&lt;/p&gt;

&lt;p&gt;If the risk is visible enough to find with search, it should be visible enough to report consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first win is seeing the risk
&lt;/h2&gt;

&lt;p&gt;Cerbi Scanner is not meant to start with enforcement.&lt;/p&gt;

&lt;p&gt;The first win is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pick a repo. Run a scan. See where logging risk lives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That alone is useful.&lt;/p&gt;

&lt;p&gt;You can answer practical questions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which files have risky log calls?
Which services log request bodies?
Which logs are missing correlation IDs?
Which events are unstructured?
Which apps do not have a governance profile?
Which fields look sensitive near logging statements?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That changes the conversation.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We should probably improve logging someday.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This service has three high-risk logging findings, no governance profile, and inconsistent correlation fields.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is actionable.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLI first
&lt;/h2&gt;

&lt;p&gt;The CLI is the easiest way to try the idea.&lt;/p&gt;

&lt;p&gt;The goal is a low-friction workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; Cerbi.Scanner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then scan a repo and review the report.&lt;/p&gt;

&lt;p&gt;The scanner is intended to support outputs that fit real workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JSON for automation
SARIF for code scanning workflows
HTML for human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful finding should be easy to understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finding: Possible token logged
File: AuthController.cs
Severity: High
Why it matters: Tokens should not be emitted into logs.
Suggested action: Remove the field, redact it, or govern it explicitly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the type of output I want.&lt;/p&gt;

&lt;p&gt;Not a wall of noise.&lt;/p&gt;

&lt;p&gt;Not “everything is critical.”&lt;/p&gt;

&lt;p&gt;Not a report that requires a security team to decode it.&lt;/p&gt;

&lt;p&gt;Just clear logging risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure DevOps extension
&lt;/h2&gt;

&lt;p&gt;The CLI is good when someone remembers to run it.&lt;/p&gt;

&lt;p&gt;The Azure DevOps extension is for making the signal repeatable.&lt;/p&gt;

&lt;p&gt;The idea is to add logging governance checks into the delivery path.&lt;/p&gt;

&lt;p&gt;A pipeline already asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does it build?
Do tests pass?
Did dependency scanning pass?
Did secret scanning pass?
Can this deploy?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cerbi Scanner adds another question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Are we shipping risky logging behavior?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extension should support a gradual rollout.&lt;/p&gt;

&lt;p&gt;Start in audit-only mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show findings.
Do not fail the build.
Let teams learn where risk exists.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then move toward enforcement when the rules are trusted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;failOnViolation: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That matters because governance tools lose developer trust when they show up and immediately break everything.&lt;/p&gt;

&lt;p&gt;The better path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Observe first.
Guide next.
Enforce when ready.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where CerbiShield fits
&lt;/h2&gt;

&lt;p&gt;Cerbi Scanner is the discovery step.&lt;/p&gt;

&lt;p&gt;It helps answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where is the logging risk?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Cerbi governance packages help answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we enforce rules when the app emits logs?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CerbiShield helps answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we manage profiles, scoring, reporting, RBAC, deployment history, and audit evidence across teams?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That path is intentional.&lt;/p&gt;

&lt;p&gt;I do not want Cerbi adoption to start with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Install the whole platform and change every logging workflow.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I want it to start with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Scan one repo and see what your logs are doing.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the scanner finds nothing interesting, great.&lt;/p&gt;

&lt;p&gt;If it finds risky fields, missing standards, or messy log shapes, also great.&lt;/p&gt;

&lt;p&gt;Either way, the team stops guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I am building this
&lt;/h2&gt;

&lt;p&gt;I have seen the same pattern in enterprise systems too many times.&lt;/p&gt;

&lt;p&gt;Logging standards exist.&lt;/p&gt;

&lt;p&gt;Developers are expected to remember them.&lt;/p&gt;

&lt;p&gt;Code review catches some issues.&lt;/p&gt;

&lt;p&gt;Production catches the rest.&lt;/p&gt;

&lt;p&gt;Then everyone acts surprised when sensitive fields or messy event shapes show up downstream.&lt;/p&gt;

&lt;p&gt;Cerbi Scanner is meant to move that discovery earlier.&lt;/p&gt;

&lt;p&gt;Before the log ships.&lt;/p&gt;

&lt;p&gt;Before it spreads.&lt;/p&gt;

&lt;p&gt;Before someone has to ask which system received the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current direction
&lt;/h2&gt;

&lt;p&gt;The scanner work is focused on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLI-based repo scanning
Azure DevOps pipeline integration
Readable risk reports
JSON, SARIF, and HTML output
Governance profile awareness
Multi-language scanning
Easy first-run experience
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to make logging governance feel heavy.&lt;/p&gt;

&lt;p&gt;The goal is to make the risk obvious enough that teams can decide what to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this sounds useful
&lt;/h2&gt;

&lt;p&gt;I am looking for feedback from people who have dealt with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PII or secrets showing up in logs
Inconsistent event names
Missing correlation IDs
Unstructured logs everywhere
Observability bills inflated by noisy logs
Logging standards that exist but are not enforced
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The question I care about most is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would you run a scanner against one repo just to see how risky your logging is?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the starting point.&lt;/p&gt;

&lt;p&gt;Not a sales call.&lt;/p&gt;

&lt;p&gt;Not a platform migration.&lt;/p&gt;

&lt;p&gt;Just a scan.&lt;/p&gt;

&lt;p&gt;Because bad logs are easiest to fix before they become production data.&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>devops</category>
      <category>security</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Logs Are Not Breadcrumbs. They Are Evidence.</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Tue, 02 Jun 2026 02:10:17 +0000</pubDate>
      <link>https://dev.to/hellocerbi/logs-are-not-breadcrumbs-they-are-evidence-1394</link>
      <guid>https://dev.to/hellocerbi/logs-are-not-breadcrumbs-they-are-evidence-1394</guid>
      <description>&lt;p&gt;I do not understand why we still log blindly.&lt;/p&gt;

&lt;p&gt;We govern infrastructure.&lt;/p&gt;

&lt;p&gt;We govern identity.&lt;/p&gt;

&lt;p&gt;We govern CI/CD.&lt;/p&gt;

&lt;p&gt;We govern vendors.&lt;/p&gt;

&lt;p&gt;We govern production access.&lt;/p&gt;

&lt;p&gt;Then we let applications spray passwords, access tokens, payment data, session cookies, API keys, chat transcripts, environment variables, and private signing keys into logs and diagnostic artifacts like those things are harmless.&lt;/p&gt;

&lt;p&gt;They are not harmless.&lt;/p&gt;

&lt;p&gt;They are evidence.&lt;/p&gt;

&lt;p&gt;They are regulated data.&lt;/p&gt;

&lt;p&gt;They are operational cost.&lt;/p&gt;

&lt;p&gt;They are incident scope.&lt;/p&gt;

&lt;p&gt;And too often, they are the part of the system nobody clearly owns until something breaks.&lt;/p&gt;

&lt;p&gt;Then the room gets weird.&lt;/p&gt;

&lt;p&gt;Was it the app team?&lt;/p&gt;

&lt;p&gt;The Splunk team?&lt;/p&gt;

&lt;p&gt;The Datadog team?&lt;/p&gt;

&lt;p&gt;Security?&lt;/p&gt;

&lt;p&gt;Platform?&lt;/p&gt;

&lt;p&gt;The vendor?&lt;/p&gt;

&lt;p&gt;Leadership?&lt;/p&gt;

&lt;p&gt;The answer is probably yes.&lt;/p&gt;

&lt;p&gt;That is the problem.&lt;/p&gt;

&lt;p&gt;Logs are treated like developer exhaust until they become breach evidence.&lt;/p&gt;

&lt;p&gt;By then, the data has already left the application.&lt;/p&gt;

&lt;p&gt;The cost has already started.&lt;/p&gt;

&lt;p&gt;The audit problem already exists.&lt;/p&gt;

&lt;p&gt;The meeting is already on the calendar.&lt;/p&gt;

&lt;p&gt;And someone is about to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need better logging standards.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No kidding.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is not an unknown problem
&lt;/h2&gt;

&lt;p&gt;MITRE has an entire weakness for this: &lt;strong&gt;CWE-532, Insertion of Sensitive Information into Log File&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The description is brutally simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The product writes sensitive information to a log file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;MITRE also points out the obvious failure mode: logs often become a less-protected path for attackers to acquire application data. Its mitigations are not complicated. Do not write secrets to logs. Remove debug logs before production. Protect log files from unauthorized access. [1]&lt;/p&gt;

&lt;p&gt;OWASP says the same thing in developer language. Its Logging Cheat Sheet says session IDs, access tokens, sensitive personal data, authentication passwords, database connection strings, encryption keys, and payment card data should usually not be recorded directly in logs. They should be removed, masked, sanitized, hashed, or encrypted. [2]&lt;/p&gt;

&lt;p&gt;NIST has treated log management as an enterprise discipline for years. SP 800-92 frames log management as infrastructure, policy, process, roles, retention, analysis, and operational support. Not just "buy a SIEM and hope." [3]&lt;/p&gt;

&lt;p&gt;So this is not a knowledge gap.&lt;/p&gt;

&lt;p&gt;It is an ownership gap.&lt;/p&gt;

&lt;p&gt;Everybody knows bad logs are dangerous.&lt;/p&gt;

&lt;p&gt;Nobody wants to own preventing them before they leave the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that makes me mad
&lt;/h2&gt;

&lt;p&gt;Most companies already know how to define ownership when they care.&lt;/p&gt;

&lt;p&gt;Infrastructure has owners.&lt;/p&gt;

&lt;p&gt;Cloud subscriptions have owners.&lt;/p&gt;

&lt;p&gt;Applications have owners.&lt;/p&gt;

&lt;p&gt;Databases have owners.&lt;/p&gt;

&lt;p&gt;Service accounts have owners.&lt;/p&gt;

&lt;p&gt;Pipelines have owners.&lt;/p&gt;

&lt;p&gt;Production changes have owners.&lt;/p&gt;

&lt;p&gt;But logs?&lt;/p&gt;

&lt;p&gt;Logs get hand-waved into a shared platform, a SIEM, an observability vendor, or a lakehouse.&lt;/p&gt;

&lt;p&gt;Then everyone acts shocked when those logs contain data that should never have existed there in the first place.&lt;/p&gt;

&lt;p&gt;That is backwards.&lt;/p&gt;

&lt;p&gt;The first logging governance question should not be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where do we send this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this be emitted at all?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question belongs at the source.&lt;/p&gt;

&lt;p&gt;Before the log leaves the application.&lt;/p&gt;

&lt;p&gt;Before it hits Splunk.&lt;/p&gt;

&lt;p&gt;Before it hits Datadog.&lt;/p&gt;

&lt;p&gt;Before it hits Azure Monitor.&lt;/p&gt;

&lt;p&gt;Before it hits Elastic.&lt;/p&gt;

&lt;p&gt;Before it hits OpenTelemetry collectors.&lt;/p&gt;

&lt;p&gt;Before it hits CloudWatch.&lt;/p&gt;

&lt;p&gt;Before it becomes vendor data.&lt;/p&gt;

&lt;p&gt;Before it becomes audit evidence.&lt;/p&gt;

&lt;p&gt;Before it becomes legal discovery.&lt;/p&gt;

&lt;p&gt;Before it becomes the thing everyone regrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small tally of preventable pain
&lt;/h2&gt;

&lt;p&gt;This is not every logging failure.&lt;/p&gt;

&lt;p&gt;This is not a courtroom damages model.&lt;/p&gt;

&lt;p&gt;This is a practical sample of public incidents and vulnerability patterns where uncontrolled logging, unsafe diagnostic capture, exposed log stores, or sensitive runtime metadata created avoidable risk.&lt;/p&gt;

&lt;p&gt;The cost numbers are intentionally conservative.&lt;/p&gt;

&lt;p&gt;Some are confirmed.&lt;/p&gt;

&lt;p&gt;Some are estimates.&lt;/p&gt;

&lt;p&gt;Some use IBM's average breach-cost reporting as a proxy because companies usually do not publish the full cleanup bill. IBM's 2025 Cost of a Data Breach report reports the global average breach cost at roughly &lt;strong&gt;$4.44 million&lt;/strong&gt;. [4]&lt;/p&gt;

&lt;p&gt;The point is not fake precision.&lt;/p&gt;

&lt;p&gt;The point is the pattern.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;What went wrong&lt;/th&gt;
&lt;th&gt;What source-level governance could have changed&lt;/th&gt;
&lt;th&gt;Conservative preventable-risk range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Twitter plaintext password logging, 2018&lt;/td&gt;
&lt;td&gt;Twitter disclosed that a bug caused passwords to be written to an internal log before normal hashing protection. Users were told to change passwords. [5]&lt;/td&gt;
&lt;td&gt;A static analyzer blocks password fields in log statements. Runtime redaction catches credential-shaped values before emission. A governed schema rejects raw password fields.&lt;/td&gt;
&lt;td&gt;$100K to $1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;SHEIN / Zoetop payment-card logging and breach response, 2016 to 2018&lt;/td&gt;
&lt;td&gt;Public reporting and the NY settlement describe a major breach and a $1.9M settlement tied to the company's response and security failures. The supplied research notes attribute part of the failure pattern to payment data in debug logs.&lt;/td&gt;
&lt;td&gt;Disallowed fields for PAN/CVV. Runtime masking. PCI-oriented governance profiles. Build failure when payment fields are logged.&lt;/td&gt;
&lt;td&gt;$1.9M confirmed settlement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Microsoft Storm-0558 signing-key crash dump, 2021 to 2023&lt;/td&gt;
&lt;td&gt;A private signing key ended up in a crash dump, was moved into a debugging environment, and was later used by China-backed attackers to access email accounts across 25 organizations, including government agencies. [6]&lt;/td&gt;
&lt;td&gt;Diagnostic dump scrubbing. Secret/key detection before dump export. High-sensitivity classification for crash artifacts. Restricted access and evidence retention for sensitive diagnostic data.&lt;/td&gt;
&lt;td&gt;$4.44M to $25M+ proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;DeepSeek exposed ClickHouse logs, 2025&lt;/td&gt;
&lt;td&gt;Researchers found an open ClickHouse database with more than one million log lines, including chat history, API keys, system logs, and internal metadata. [7]&lt;/td&gt;
&lt;td&gt;Do not log raw prompts or chats. Redact API keys. Classify prompt/user text as sensitive. Emit references or hashes instead of raw content.&lt;/td&gt;
&lt;td&gt;$100K to $2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Vercel third-party OAuth incident and environment-variable exposure, 2026&lt;/td&gt;
&lt;td&gt;Vercel disclosed unauthorized access to internal systems. Reporting says variables not marked sensitive could decrypt to plaintext and customers were told to rotate credentials. A threat actor reportedly sought $2M for stolen data. [8]&lt;/td&gt;
&lt;td&gt;Treat deployment variables as sensitive by default. Redact env vars in logs and metadata. Enforce secret classification before build/deploy events are emitted.&lt;/td&gt;
&lt;td&gt;$2M to $5M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Post SMTP WordPress email log exposure, 2025&lt;/td&gt;
&lt;td&gt;A vulnerability allowed low-privileged users to access full email logs. Those logs could contain password reset emails and enable account takeover. TechRadar reported roughly 160,000 sites still at risk at the time. [9]&lt;/td&gt;
&lt;td&gt;Do not store full reset emails in readable logs. Redact reset links and tokens. Enforce RBAC on log access. Apply retention limits for sensitive operational logs.&lt;/td&gt;
&lt;td&gt;$500K to $5M aggregate exposure risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Public API credential exposure across web assets, 2026 research&lt;/td&gt;
&lt;td&gt;Researchers scanning 10 million web pages found 1,748 distinct API credentials across nearly 10,000 pages. Most came from JavaScript environments, but the lesson is the same: secrets escape through developer artifacts when source controls are weak. [10]&lt;/td&gt;
&lt;td&gt;Secret detection before emission, publish, or artifact creation. Runtime and build-time classification of tokens, keys, and credentials.&lt;/td&gt;
&lt;td&gt;Not included in total because it is a research sample, not one breach&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conservative tally
&lt;/h2&gt;

&lt;p&gt;Using only the six main cases above and excluding the broader API credential research sample:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;Low estimate&lt;/th&gt;
&lt;th&gt;High estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twitter plaintext password logs&lt;/td&gt;
&lt;td&gt;$100K&lt;/td&gt;
&lt;td&gt;$1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHEIN / Zoetop&lt;/td&gt;
&lt;td&gt;$1.9M&lt;/td&gt;
&lt;td&gt;$1.9M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Storm-0558 diagnostic-key failure&lt;/td&gt;
&lt;td&gt;$4.44M&lt;/td&gt;
&lt;td&gt;$25M+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek exposed log database&lt;/td&gt;
&lt;td&gt;$100K&lt;/td&gt;
&lt;td&gt;$2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel environment-variable exposure&lt;/td&gt;
&lt;td&gt;$2M&lt;/td&gt;
&lt;td&gt;$5M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post SMTP email-log exposure&lt;/td&gt;
&lt;td&gt;$500K&lt;/td&gt;
&lt;td&gt;$5M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$9.04M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$39.9M+&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the conservative range.&lt;/p&gt;

&lt;p&gt;And honestly, it still undercounts the Microsoft case.&lt;/p&gt;

&lt;p&gt;A nation-state email compromise involving a signing key does not fit cleanly into a spreadsheet. You can write "$4.44M proxy" if you want to keep the model tidy, but that is not reality.&lt;/p&gt;

&lt;p&gt;That is accounting theater.&lt;/p&gt;

&lt;p&gt;The actual blast radius includes federal email compromise, internal investigations, customer concern, product hardening, emergency response, security reform, executive distraction, and years of reputation debt.&lt;/p&gt;

&lt;p&gt;So the real takeaway is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cerbi would have saved exactly $39.9M.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The real takeaway is worse:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A handful of logging and diagnostic mistakes can create eight figures of preventable risk before anyone even notices.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Falsehoods engineers believe about logs
&lt;/h2&gt;

&lt;p&gt;Internal logs are safe.&lt;/p&gt;

&lt;p&gt;Debug logs never reach production.&lt;/p&gt;

&lt;p&gt;The SIEM team owns logging risk.&lt;/p&gt;

&lt;p&gt;If a field helps debugging, it belongs in the log.&lt;/p&gt;

&lt;p&gt;We can redact it later.&lt;/p&gt;

&lt;p&gt;Developers know what not to log.&lt;/p&gt;

&lt;p&gt;Environment variables are safe unless someone marks them sensitive.&lt;/p&gt;

&lt;p&gt;Session IDs are fine if they are only internal.&lt;/p&gt;

&lt;p&gt;Crash dumps are just diagnostic data.&lt;/p&gt;

&lt;p&gt;Email logs are harmless.&lt;/p&gt;

&lt;p&gt;Prompt logs are not regulated data.&lt;/p&gt;

&lt;p&gt;Logs are operational exhaust.&lt;/p&gt;

&lt;p&gt;Logs are cheap.&lt;/p&gt;

&lt;p&gt;Logs are someone else's problem.&lt;/p&gt;

&lt;p&gt;All of these are wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is really about logging culture
&lt;/h2&gt;

&lt;p&gt;The deeper problem is not that teams lack logging tools.&lt;/p&gt;

&lt;p&gt;They have plenty.&lt;/p&gt;

&lt;p&gt;Splunk.&lt;/p&gt;

&lt;p&gt;Datadog.&lt;/p&gt;

&lt;p&gt;Azure Monitor.&lt;/p&gt;

&lt;p&gt;Elastic.&lt;/p&gt;

&lt;p&gt;Grafana.&lt;/p&gt;

&lt;p&gt;OpenTelemetry.&lt;/p&gt;

&lt;p&gt;CloudWatch.&lt;/p&gt;

&lt;p&gt;New Relic.&lt;/p&gt;

&lt;p&gt;Seq.&lt;/p&gt;

&lt;p&gt;Log analytics platforms are not the missing piece.&lt;/p&gt;

&lt;p&gt;The missing piece is logging culture.&lt;/p&gt;

&lt;p&gt;Most companies still treat logs as developer notes instead of enterprise evidence.&lt;/p&gt;

&lt;p&gt;That creates a bad operating model.&lt;/p&gt;

&lt;p&gt;Developers log whatever helps them debug.&lt;/p&gt;

&lt;p&gt;Security reviews risk after the data already exists.&lt;/p&gt;

&lt;p&gt;Observability teams inherit noisy, inconsistent, unsafe data.&lt;/p&gt;

&lt;p&gt;Platform teams try to standardize after every app has already invented its own logging style.&lt;/p&gt;

&lt;p&gt;Leadership sees the bill, the breach, or the audit gap only after the damage is done.&lt;/p&gt;

&lt;p&gt;That is not a tooling gap.&lt;/p&gt;

&lt;p&gt;That is a culture gap.&lt;/p&gt;

&lt;p&gt;A better logging culture starts with different questions:&lt;/p&gt;

&lt;p&gt;Should this field be logged?&lt;/p&gt;

&lt;p&gt;Who owns this event?&lt;/p&gt;

&lt;p&gt;What business process does it support?&lt;/p&gt;

&lt;p&gt;Could this expose a customer, employee, credential, token, secret, or private key?&lt;/p&gt;

&lt;p&gt;Is this useful evidence or just noise?&lt;/p&gt;

&lt;p&gt;Would this log still be safe if it landed in the wrong place?&lt;/p&gt;

&lt;p&gt;Can another team understand it without reading the source code?&lt;/p&gt;

&lt;p&gt;Can security review the behavior before production?&lt;/p&gt;

&lt;p&gt;Can architecture enforce the pattern without begging every team to read a wiki?&lt;/p&gt;

&lt;p&gt;Those questions should not be optional.&lt;/p&gt;

&lt;p&gt;They should be part of how software ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Culture alone does not scale
&lt;/h2&gt;

&lt;p&gt;Here is the annoying truth.&lt;/p&gt;

&lt;p&gt;A principal architect can write logging standards.&lt;/p&gt;

&lt;p&gt;Security can publish guidance.&lt;/p&gt;

&lt;p&gt;Platform teams can create templates.&lt;/p&gt;

&lt;p&gt;Developers can attend training.&lt;/p&gt;

&lt;p&gt;Everyone can nod in the meeting.&lt;/p&gt;

&lt;p&gt;Then production breaks at 2 AM and someone logs the entire request object.&lt;/p&gt;

&lt;p&gt;Not because they are reckless.&lt;/p&gt;

&lt;p&gt;Because they are trying to fix production while people are asking whether we "have logs for that."&lt;/p&gt;

&lt;p&gt;That is how bad logging happens.&lt;/p&gt;

&lt;p&gt;One emergency.&lt;/p&gt;

&lt;p&gt;One debug statement.&lt;/p&gt;

&lt;p&gt;One copied pattern.&lt;/p&gt;

&lt;p&gt;One "temporary" field.&lt;/p&gt;

&lt;p&gt;One TODO that never gets removed.&lt;/p&gt;

&lt;p&gt;One vendor sink that accepts anything.&lt;/p&gt;

&lt;p&gt;One log pipeline that happily stores the evidence.&lt;/p&gt;

&lt;p&gt;This is why logging culture needs guardrails.&lt;/p&gt;

&lt;p&gt;Not to punish developers.&lt;/p&gt;

&lt;p&gt;To protect them.&lt;/p&gt;

&lt;p&gt;Good governance makes the safe path the easy path.&lt;/p&gt;

&lt;h2&gt;
  
  
  What source-level logging governance changes
&lt;/h2&gt;

&lt;p&gt;Source-level governance moves the control point earlier.&lt;/p&gt;

&lt;p&gt;It does not wait until the bad log is in the SIEM.&lt;/p&gt;

&lt;p&gt;It does not wait until the data lake has copied it.&lt;/p&gt;

&lt;p&gt;It does not wait until retention policies have preserved it for seven years.&lt;/p&gt;

&lt;p&gt;It does not wait until legal asks what was exposed.&lt;/p&gt;

&lt;p&gt;It checks before emission.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static analyzers can catch unsafe logging during development.&lt;/li&gt;
&lt;li&gt;Runtime governance can validate logs before they leave the process.&lt;/li&gt;
&lt;li&gt;Disallowed fields can be blocked, masked, redacted, or tagged.&lt;/li&gt;
&lt;li&gt;Required fields can make operational evidence consistent.&lt;/li&gt;
&lt;li&gt;Sensitive data can be caught before it becomes vendor data.&lt;/li&gt;
&lt;li&gt;Log ownership and policy metadata can travel with the event.&lt;/li&gt;
&lt;li&gt;Audit rules can explain why a log was allowed, changed, or flagged.&lt;/li&gt;
&lt;li&gt;Developers can follow rules without becoming compliance lawyers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part matters.&lt;/p&gt;

&lt;p&gt;Most developers are not trying to leak secrets.&lt;/p&gt;

&lt;p&gt;They are trying to ship software.&lt;/p&gt;

&lt;p&gt;A good logging governance system should help them do the right thing by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Cerbi fits
&lt;/h2&gt;

&lt;p&gt;This is the problem I am working on with Cerbi.&lt;/p&gt;

&lt;p&gt;Not another logging sink.&lt;/p&gt;

&lt;p&gt;Not another dashboard.&lt;/p&gt;

&lt;p&gt;Not another place to search bad logs after the damage is already done.&lt;/p&gt;

&lt;p&gt;Cerbi is built around one simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop it at the source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before the log leaves the app.&lt;/p&gt;

&lt;p&gt;Before it hits Splunk.&lt;/p&gt;

&lt;p&gt;Before it hits Datadog.&lt;/p&gt;

&lt;p&gt;Before it hits Azure Monitor.&lt;/p&gt;

&lt;p&gt;Before it hits Elastic.&lt;/p&gt;

&lt;p&gt;Before it hits OpenTelemetry.&lt;/p&gt;

&lt;p&gt;Before it hits CloudWatch.&lt;/p&gt;

&lt;p&gt;Before a secret becomes vendor data.&lt;/p&gt;

&lt;p&gt;Before a debug field becomes breach evidence.&lt;/p&gt;

&lt;p&gt;Before teams spend three weeks arguing over who owned the log.&lt;/p&gt;

&lt;p&gt;The point is not to replace observability platforms.&lt;/p&gt;

&lt;p&gt;Those tools have a job.&lt;/p&gt;

&lt;p&gt;The point is to stop treating them as the first line of defense against bad application logging.&lt;/p&gt;

&lt;p&gt;That is backwards.&lt;/p&gt;

&lt;p&gt;Cerbi turns logging standards into executable controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source-level rules.&lt;/li&gt;
&lt;li&gt;Runtime redaction.&lt;/li&gt;
&lt;li&gt;Static analysis.&lt;/li&gt;
&lt;li&gt;Field governance.&lt;/li&gt;
&lt;li&gt;Required and disallowed fields.&lt;/li&gt;
&lt;li&gt;Ownership metadata.&lt;/li&gt;
&lt;li&gt;Audit-ready evidence.&lt;/li&gt;
&lt;li&gt;Safer defaults for developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not about telling teams to stop logging.&lt;/p&gt;

&lt;p&gt;It is about helping teams log with ownership, structure, safety, and intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The culture shift I want
&lt;/h2&gt;

&lt;p&gt;I want logging culture to change.&lt;/p&gt;

&lt;p&gt;Not because logs are bad.&lt;/p&gt;

&lt;p&gt;Because logs are powerful.&lt;/p&gt;

&lt;p&gt;Good logs help teams debug faster.&lt;/p&gt;

&lt;p&gt;Good logs support incident response.&lt;/p&gt;

&lt;p&gt;Good logs create audit evidence.&lt;/p&gt;

&lt;p&gt;Good logs help security understand behavior.&lt;/p&gt;

&lt;p&gt;Good logs help leadership understand operational risk.&lt;/p&gt;

&lt;p&gt;Bad logs do the opposite.&lt;/p&gt;

&lt;p&gt;They leak data.&lt;/p&gt;

&lt;p&gt;They increase cost.&lt;/p&gt;

&lt;p&gt;They confuse incidents.&lt;/p&gt;

&lt;p&gt;They create audit gaps.&lt;/p&gt;

&lt;p&gt;They spread ownership across everyone and no one.&lt;/p&gt;

&lt;p&gt;They turn observability into liability.&lt;/p&gt;

&lt;p&gt;So yes, I am building Cerbi.&lt;/p&gt;

&lt;p&gt;But the bigger goal is not another logging product.&lt;/p&gt;

&lt;p&gt;The bigger goal is changing the default behavior.&lt;/p&gt;

&lt;p&gt;Stop logging blindly.&lt;/p&gt;

&lt;p&gt;Stop treating logs like exhaust.&lt;/p&gt;

&lt;p&gt;Stop assuming the observability team owns whatever every app emits.&lt;/p&gt;

&lt;p&gt;Stop waiting until the data lands downstream to decide whether it should have existed.&lt;/p&gt;

&lt;p&gt;Logs are evidence.&lt;/p&gt;

&lt;p&gt;Evidence needs ownership.&lt;/p&gt;

&lt;p&gt;And ownership should start before the log leaves the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The line I keep coming back to
&lt;/h2&gt;

&lt;p&gt;Evidence without governance is liability with timestamps.&lt;/p&gt;

&lt;p&gt;That is what bad logging creates.&lt;/p&gt;

&lt;p&gt;Liability with timestamps.&lt;/p&gt;

&lt;p&gt;Searchable.&lt;/p&gt;

&lt;p&gt;Retained.&lt;/p&gt;

&lt;p&gt;Replicated.&lt;/p&gt;

&lt;p&gt;Indexed.&lt;/p&gt;

&lt;p&gt;Forwarded.&lt;/p&gt;

&lt;p&gt;And very expensive to explain later.&lt;/p&gt;




&lt;h1&gt;
  
  
  Source notes
&lt;/h1&gt;

&lt;p&gt;This article uses public reporting and security guidance. Some dollar amounts are confirmed. Some are conservative preventable-risk estimates because full incident costs are rarely public.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;MITRE, CWE-532: Insertion of Sensitive Information into Log File&lt;br&gt;&lt;br&gt;
&lt;a href="https://cwe.mitre.org/data/definitions/532.html" rel="noopener noreferrer"&gt;https://cwe.mitre.org/data/definitions/532.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OWASP Logging Cheat Sheet&lt;br&gt;&lt;br&gt;
&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html" rel="noopener noreferrer"&gt;https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NIST SP 800-92, Guide to Computer Security Log Management&lt;br&gt;&lt;br&gt;
&lt;a href="https://csrc.nist.gov/pubs/sp/800/92/final" rel="noopener noreferrer"&gt;https://csrc.nist.gov/pubs/sp/800/92/final&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IBM, Cost of a Data Breach Report 2025&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.ibm.com/reports/data-breach" rel="noopener noreferrer"&gt;https://www.ibm.com/reports/data-breach&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Time, Twitter advises users to change passwords after internal plaintext logging bug&lt;br&gt;&lt;br&gt;
&lt;a href="https://time.com/5265244/twitter-all-users-change-passwords-leaving-unprotected/" rel="noopener noreferrer"&gt;https://time.com/5265244/twitter-all-users-change-passwords-leaving-unprotected/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wired, The Comedy of Errors That Let China-Backed Hackers Steal Microsoft's Signing Key&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.wired.com/story/china-backed-hackers-steal-microsofts-signing-key-post-mortem" rel="noopener noreferrer"&gt;https://www.wired.com/story/china-backed-hackers-steal-microsofts-signing-key-post-mortem&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reuters, Sensitive DeepSeek data exposed to web, cyber firm says&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.reuters.com/technology/artificial-intelligence/sensitive-deepseek-data-exposed-web-israeli-cyber-firm-says-2025-01-29/" rel="noopener noreferrer"&gt;https://www.reuters.com/technology/artificial-intelligence/sensitive-deepseek-data-exposed-web-israeli-cyber-firm-says-2025-01-29/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tom's Hardware, Vercel breached after employee grants AI tool unrestricted access to Google Workspace&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.tomshardware.com/tech-industry/cyber-security/vercel-breached-after-employee-grants-ai-tool-unrestricted-access-to-google-workspace" rel="noopener noreferrer"&gt;https://www.tomshardware.com/tech-industry/cyber-security/vercel-breached-after-employee-grants-ai-tool-unrestricted-access-to-google-workspace&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TechRadar, Post SMTP WordPress plugin flaw exposed email logs&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.techradar.com/pro/security/dangerous-wordpress-plugin-puts-over-160-000-sites-at-risk-heres-what-we-know" rel="noopener noreferrer"&gt;https://www.techradar.com/pro/security/dangerous-wordpress-plugin-puts-over-160-000-sites-at-risk-heres-what-we-know&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TechRadar coverage of research on exposed API credentials across 10 million web pages&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.techradar.com/pro/security/api-credentials-are-widely-and-publicly-exposed-on-the-web-experts-scour-10-million-web-pages-and-find-a-shocking-amount-of-security-info-just-lying-around" rel="noopener noreferrer"&gt;https://www.techradar.com/pro/security/api-credentials-are-widely-and-publicly-exposed-on-the-web-experts-scour-10-million-web-pages-and-find-a-shocking-amount-of-security-info-just-lying-around&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>logging</category>
      <category>cybersecurity</category>
      <category>devsecops</category>
      <category>observability</category>
    </item>
    <item>
      <title>I don’t understand why we still log blindly.</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Mon, 01 Jun 2026 22:06:08 +0000</pubDate>
      <link>https://dev.to/hellocerbi/i-dont-understand-why-we-still-log-blindly-4p16</link>
      <guid>https://dev.to/hellocerbi/i-dont-understand-why-we-still-log-blindly-4p16</guid>
      <description>&lt;p&gt;Most companies have standards for code reviews, cloud infrastructure, identity, CI/CD, access, endpoint security, vendor contracts, and production change control.&lt;/p&gt;

&lt;p&gt;But logs?&lt;/p&gt;

&lt;p&gt;A lot of teams still let every application emit whatever it wants, in whatever shape it wants, with whatever fields the developer happened to think were useful that day.&lt;/p&gt;

&lt;p&gt;Then the logs get shipped to Splunk, Datadog, Azure Monitor, Elastic, OpenTelemetry collectors, or another platform.&lt;/p&gt;

&lt;p&gt;And when something goes wrong, ownership gets fuzzy fast.&lt;/p&gt;

&lt;p&gt;Was it the Splunk team’s problem?&lt;/p&gt;

&lt;p&gt;The platform team’s?&lt;/p&gt;

&lt;p&gt;Security’s?&lt;/p&gt;

&lt;p&gt;The developers’?&lt;/p&gt;

&lt;p&gt;The vendor’s?&lt;/p&gt;

&lt;p&gt;Leadership’s?&lt;/p&gt;

&lt;p&gt;The uncomfortable answer is probably: all of them.&lt;/p&gt;

&lt;p&gt;Logging is not just an observability concern. It is a shared enterprise control.&lt;/p&gt;

&lt;p&gt;Leadership owns the business requirement.&lt;/p&gt;

&lt;p&gt;Security owns the risk model: what cannot be logged, what must be protected, what needs audit evidence, and what needs review.&lt;/p&gt;

&lt;p&gt;Architecture and platform teams own the standards, reusable patterns, approved fields, deployment paths, and operational model.&lt;/p&gt;

&lt;p&gt;Developers own the implementation, but they should not have to guess what “good logging” means for every app.&lt;/p&gt;

&lt;p&gt;Observability teams own usability, routing, indexing, retention, dashboards, and incident workflows.&lt;/p&gt;

&lt;p&gt;Vendors provide storage, search, alerting, analytics, and visualization. But they should not be the first line of defense against bad logging behavior.&lt;/p&gt;

&lt;p&gt;By the time a bad log reaches the sink, the damage may already be done.&lt;/p&gt;

&lt;p&gt;Sensitive data may have been emitted.&lt;/p&gt;

&lt;p&gt;Noise may have entered the system.&lt;/p&gt;

&lt;p&gt;Storage and indexing costs may have already been created.&lt;/p&gt;

&lt;p&gt;Incident response may have become harder.&lt;/p&gt;

&lt;p&gt;Audit evidence may already be inconsistent.&lt;/p&gt;

&lt;p&gt;That feels backwards.&lt;/p&gt;

&lt;p&gt;OWASP warns that logs may contain personal and sensitive information and says logging mechanisms and collected event data need protection from misuse, tampering, unauthorized access, modification, and deletion.&lt;sup id="fnref1"&gt;1&lt;/sup&gt; Splunk’s own logging best practices say not to log sensitive data or PII, including Social Security numbers and credit card numbers.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; NIST treats log management as a combination of infrastructure and organizational process, not just centralized storage.&lt;sup id="fnref3"&gt;3&lt;/sup&gt; OpenTelemetry has semantic conventions because consistent names and structures matter across codebases, libraries, and platforms.&lt;sup id="fnref4"&gt;4&lt;/sup&gt; IBM’s 2025 breach report puts the global average cost of a data breach at about $4.4 million.&lt;sup id="fnref5"&gt;5&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;So why do we still let logging quality, safety, ownership, and structure vary wildly from app to app?&lt;/p&gt;

&lt;p&gt;My view:&lt;/p&gt;

&lt;p&gt;Logging governance should start at the source.&lt;/p&gt;

&lt;p&gt;Before the log leaves the application.&lt;/p&gt;

&lt;p&gt;Before it hits Splunk, Datadog, Azure Monitor, Elastic, or any other sink.&lt;/p&gt;

&lt;p&gt;Before teams are stuck arguing over who owns the mess.&lt;/p&gt;

&lt;p&gt;This is the problem I’m working on with Cerbi.&lt;/p&gt;

&lt;p&gt;Not replacing observability platforms.&lt;/p&gt;

&lt;p&gt;Not telling teams to stop logging.&lt;/p&gt;

&lt;p&gt;Just making logging safer, more consistent, and more accountable before the data leaves the app.&lt;/p&gt;

&lt;p&gt;Because logs are not just developer breadcrumbs.&lt;/p&gt;

&lt;p&gt;They are operational evidence.&lt;/p&gt;

&lt;p&gt;And evidence needs ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence notes
&lt;/h2&gt;

&lt;p&gt;This argument is supported by several practical industry sources:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OWASP Logging Cheat Sheet&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OWASP notes that logs may contain personal and sensitive information, and that logging mechanisms and collected event data must be protected from misuse, tampering, unauthorized access, modification, and deletion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Splunk Logging Best Practices&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Splunk explicitly says not to log sensitive data or PII, including Social Security numbers and credit card numbers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NIST SP 800-92, Guide to Computer Security Log Management&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
NIST frames log management as more than collecting logs. It involves infrastructure, policy, procedures, and operational process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenTelemetry Semantic Conventions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OpenTelemetry defines common names for telemetry data so signals can be standardized across codebases, libraries, and platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IBM Cost of a Data Breach Report 2025&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
IBM reports the global average cost of a data breach at about $4.4 million.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CISA Secure by Demand Guide&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
CISA encourages organizations to make security expectations part of software purchasing and vendor evaluation, which supports the broader ownership point: security and governance requirements should be explicit, not assumed later.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;OWASP, “Logging Cheat Sheet.” &lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html" rel="noopener noreferrer"&gt;https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Splunk Developer Documentation, “Logging best practices.” &lt;a href="https://dev.splunk.com/view/logging-best-practices/SP-CAAADP6" rel="noopener noreferrer"&gt;https://dev.splunk.com/view/logging-best-practices/SP-CAAADP6&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;NIST, “SP 800-92, Guide to Computer Security Log Management.” &lt;a href="https://csrc.nist.gov/pubs/sp/800/92/final" rel="noopener noreferrer"&gt;https://csrc.nist.gov/pubs/sp/800/92/final&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;OpenTelemetry, “Semantic Conventions.” &lt;a href="https://opentelemetry.io/docs/concepts/semantic-conventions/" rel="noopener noreferrer"&gt;https://opentelemetry.io/docs/concepts/semantic-conventions/&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;IBM, “Cost of a Data Breach Report 2025.” &lt;a href="https://www.ibm.com/reports/data-breach" rel="noopener noreferrer"&gt;https://www.ibm.com/reports/data-breach&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>security</category>
      <category>programming</category>
      <category>codequality</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Adding Log Governance to Serilog in .NET — Without Rewriting a Single Call Site</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Mon, 01 Jun 2026 14:02:07 +0000</pubDate>
      <link>https://dev.to/hellocerbi/adding-log-governance-to-serilog-in-net-without-rewriting-a-single-call-site-3idn</link>
      <guid>https://dev.to/hellocerbi/adding-log-governance-to-serilog-in-net-without-rewriting-a-single-call-site-3idn</guid>
      <description>&lt;h1&gt;
  
  
  Adding Log Governance to Serilog in .NET — Without Rewriting a Single Call Site
&lt;/h1&gt;

&lt;p&gt;If you've shipped a .NET application in the last few years, there's a good chance Serilog is already in your stack. It's battle-tested, flexible, and the sink ecosystem is massive. But here's the thing nobody talks about: Serilog doesn't care &lt;em&gt;what&lt;/em&gt; you log. It will happily ship a patient's SSN, a raw JWT, or a credit card number to Elasticsearch without blinking.&lt;/p&gt;

&lt;p&gt;That's not a Serilog problem — it's a governance problem. And it's one I ran into repeatedly while working on distributed .NET systems before I built Cerbi.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gap Between "Structured Logging" and "Safe Logging"
&lt;/h2&gt;

&lt;p&gt;Structured logging is great. You get queryable fields, consistent shapes, and tooling that actually works. But structure doesn't mean compliance. A perfectly structured log event can still contain PII that violates HIPAA or GDPR. The structure just makes it &lt;em&gt;easier to find&lt;/em&gt; during an audit — which cuts both ways.&lt;/p&gt;

&lt;p&gt;The industry response has been to bolt on post-collection filtering: Datadog has sensitive data scrubbing, Splunk has masking rules, Elastic has field-level security. These all work &lt;em&gt;after&lt;/em&gt; the data has already left your application. If your pipeline has any delay, misconfiguration, or side-channel (a dev environment, a debug sink, a shared log file) — the data escaped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Governance before emission is the only way to guarantee containment.&lt;/strong&gt; That's the design principle behind CerbiStream.&lt;/p&gt;

&lt;h2&gt;
  
  
  CerbiStream + Serilog: How It Actually Works
&lt;/h2&gt;

&lt;p&gt;CerbiStream ships a dedicated Serilog package: &lt;code&gt;Cerbi.Serilog.Governance&lt;/code&gt;. It hooks into Serilog's enricher/sink pipeline and enforces your governance profile &lt;em&gt;before&lt;/em&gt; any sink receives the event.&lt;/p&gt;

&lt;p&gt;Install both packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package CerbiStream
dotnet add package Cerbi.Serilog.Governance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then wire it up in your &lt;code&gt;Program.cs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;CerbiStream.Governance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Cerbi.Serilog.Governance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;governanceConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GovernanceProfileBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnforceRequiredFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CorrelationId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ServiceName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Environment"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RedactFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SSN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"CreditCardNumber"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"PatientId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"AuthToken"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BlockIfMissing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CorrelationId"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;LoggerConfiguration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enrich&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithCerbiGovernance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;governanceConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// &amp;lt;-- governance hook&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteTo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputTemplate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"[{Timestamp:HH:mm:ss} {Level}] {Message:lj} {Properties}{NewLine}{Exception}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteTo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Seq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:5341"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateLogger&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseSerilog&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire integration. No changes to existing &lt;code&gt;Log.Information(...)&lt;/code&gt; calls anywhere in your codebase. The enricher intercepts every log event, runs the governance checks, redacts what needs redacting, and either passes the event downstream or blocks it — all in under a millisecond.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Governance Before Emission" Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;Here's a realistic scenario. You have a service that logs user activity, and somewhere deep in a helper method, someone wrote this six months ago:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processing request for user {UserId} with token {AuthToken}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without governance, that &lt;code&gt;AuthToken&lt;/code&gt; value goes straight into your log aggregator. With &lt;code&gt;Cerbi.Serilog.Governance&lt;/code&gt; and &lt;code&gt;RedactFields("AuthToken")&lt;/code&gt; configured, the emitted event looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_8821"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"AuthToken"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[REDACTED]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"CorrelationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f3a1c7b2-..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ServiceName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UserActivityService"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The field is still present (so your log schema doesn't break), but the value is gone before it hits any sink. No Elasticsearch index, no Seq stream, no debug console — nothing receives the raw token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema Enforcement Alongside Redaction
&lt;/h2&gt;

&lt;p&gt;The other half of the governance config is enforcement of required fields. This matters in microservices where teams are moving fast and log schemas drift over time. You add &lt;code&gt;BlockIfMissing("CorrelationId")&lt;/code&gt; and suddenly every service that forgets to propagate the correlation ID will emit a governance violation instead of a silent gap in your trace.&lt;/p&gt;

&lt;p&gt;You can configure this to either block the event entirely, emit a warning event with governance metadata, or — in development — throw an exception so the problem gets caught before it ever reaches staging. Configure the behavior per environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;governanceConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GovernanceProfileBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnforceRequiredFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CorrelationId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ServiceName"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RedactFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SSN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"AuthToken"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"CreditCardNumber"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OnViolation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isDevelopment&lt;/span&gt; 
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ViolationBehavior&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ThrowException&lt;/span&gt; 
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ViolationBehavior&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EmitWarningAndProceed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using a Signature Pack Instead of Manual Config
&lt;/h2&gt;

&lt;p&gt;If you're targeting a specific compliance standard (HIPAA, GDPR, PCI DSS, SOC 2, etc.), you don't have to enumerate fields manually. Cerbi ships pre-built Signature Packs that encode the relevant field patterns and rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package Cerbi.Signatures.Hipaa
dotnet add package Cerbi.Signatures.Gdpr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;governanceConfig&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GovernanceProfileBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ApplySignaturePack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HipaaSignaturePack&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ApplySignaturePack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GdprSignaturePack&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The packs cover the field patterns, redaction rules, and required audit fields for each standard. You can stack multiple packs and add your own custom rules on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overhead
&lt;/h2&gt;

&lt;p&gt;CerbiStream adds less than 1ms per log event. I've run this under heavy load in ASP.NET Core services doing 10k+ requests/minute and the governance layer is invisible in profiling output. The enricher path is synchronous and allocation-minimal — no async overhead, no reflection per-event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;CerbiStream and all the governance packages are MIT-licensed and free forever. If you want centralized policy management, schema dashboards, and drift alerting across teams, that's &lt;a href="https://cerbi.io" rel="noopener noreferrer"&gt;CerbiShield&lt;/a&gt; — but the SDK works standalone without it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 NuGet: &lt;code&gt;dotnet add package CerbiStream&lt;/code&gt; / &lt;code&gt;dotnet add package Cerbi.Serilog.Governance&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🔗 GitHub: &lt;a href="https://github.com/Zeroshi/CerbiStream" rel="noopener noreferrer"&gt;github.com/Zeroshi/CerbiStream&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 Docs &amp;amp; CerbiShield trial (14 days, no credit card): &lt;a href="https://cerbi.io" rel="noopener noreferrer"&gt;cerbi.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're already on Serilog, this is a one-afternoon integration that closes a real compliance gap. Happy to answer questions in the comments.&lt;/p&gt;

&lt;p&gt;— Thomas Nelson&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>serilog</category>
      <category>logging</category>
    </item>
    <item>
      <title>We Keep Buying Better Observability Tools for Worse Logs</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Mon, 01 Jun 2026 13:34:06 +0000</pubDate>
      <link>https://dev.to/hellocerbi/we-keep-buying-better-observability-tools-for-worse-logs-l83</link>
      <guid>https://dev.to/hellocerbi/we-keep-buying-better-observability-tools-for-worse-logs-l83</guid>
      <description>&lt;p&gt;Most teams do not have an observability problem.&lt;/p&gt;

&lt;p&gt;They have a logging behavior problem.&lt;/p&gt;

&lt;p&gt;That sounds like splitting hairs, but it is not.&lt;/p&gt;

&lt;p&gt;An observability problem sounds like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We need better dashboards.”&lt;br&gt;&lt;br&gt;
“We need better alerting.”&lt;br&gt;&lt;br&gt;
“We need better search.”&lt;br&gt;&lt;br&gt;
“We need better retention.”&lt;br&gt;&lt;br&gt;
“We need a better vendor.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A logging behavior problem sounds like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why did someone log a token?”&lt;br&gt;&lt;br&gt;
“Why does every service use a different correlation field?”&lt;br&gt;&lt;br&gt;
“Why are half our logs unstructured strings?”&lt;br&gt;&lt;br&gt;
“Why are we paying to ingest data nobody can query?”&lt;br&gt;&lt;br&gt;
“Why did this debug log become permanent infrastructure?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second group is the one we avoid talking about.&lt;/p&gt;

&lt;p&gt;Because it is not solved by buying another dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bad logs are usually created by good developers
&lt;/h2&gt;

&lt;p&gt;I do not think most bad logs come from careless developers.&lt;/p&gt;

&lt;p&gt;They come from normal developers under pressure.&lt;/p&gt;

&lt;p&gt;Production is broken.&lt;br&gt;&lt;br&gt;
The error is vague.&lt;br&gt;&lt;br&gt;
The customer is waiting.&lt;br&gt;&lt;br&gt;
The incident channel is getting louder.&lt;br&gt;&lt;br&gt;
Someone needs context fast.&lt;/p&gt;

&lt;p&gt;So someone adds this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"User login failed: {@User}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or this:&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="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="s2"&gt;payment request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;requestBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Auth header: {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authorizationHeader&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody thinks they are creating risk.&lt;/p&gt;

&lt;p&gt;They are trying to solve a problem.&lt;/p&gt;

&lt;p&gt;That is what makes logging hard. The same instinct that helps debug production can also leak sensitive data, pollute dashboards, and create expensive garbage.&lt;/p&gt;

&lt;h2&gt;
  
  
  A wiki page is not a control
&lt;/h2&gt;

&lt;p&gt;Most companies have logging standards.&lt;/p&gt;

&lt;p&gt;Somewhere.&lt;/p&gt;

&lt;p&gt;Maybe in Confluence.&lt;br&gt;&lt;br&gt;
Maybe in a platform engineering document.&lt;br&gt;&lt;br&gt;
Maybe in a security policy.&lt;br&gt;&lt;br&gt;
Maybe in a PDF last updated by someone who left three reorganizations ago.&lt;/p&gt;

&lt;p&gt;The standards usually say reasonable things:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use structured logging.
Include correlation IDs.
Do not log secrets.
Do not log PII.
Use standard severity levels.
Include service and environment metadata.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All good.&lt;/p&gt;

&lt;p&gt;But here is the problem:&lt;/p&gt;

&lt;p&gt;A document does not change behavior.&lt;/p&gt;

&lt;p&gt;A tired developer at 2 AM is not going to stop and lovingly reread the logging policy.&lt;/p&gt;

&lt;p&gt;They are going to log whatever helps them understand the issue.&lt;/p&gt;

&lt;p&gt;That is not a character flaw. That is how real systems get operated.&lt;/p&gt;

&lt;p&gt;So the question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Do we have logging standards?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can developers accidentally bypass them?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is yes, the standard is mostly a suggestion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboards cannot fix what the app already emitted
&lt;/h2&gt;

&lt;p&gt;Observability tools are useful.&lt;/p&gt;

&lt;p&gt;Search is useful.&lt;br&gt;&lt;br&gt;
Dashboards are useful.&lt;br&gt;&lt;br&gt;
Alerts are useful.&lt;br&gt;&lt;br&gt;
Retention policies are useful.&lt;br&gt;&lt;br&gt;
Pipelines are useful.&lt;/p&gt;

&lt;p&gt;But most of those tools operate after the log already exists.&lt;/p&gt;

&lt;p&gt;If the app emits a token, the token already moved.&lt;/p&gt;

&lt;p&gt;If the app emits an email address, the email already moved.&lt;/p&gt;

&lt;p&gt;If the app emits junk fields, your dashboard gets junk fields.&lt;/p&gt;

&lt;p&gt;If every service names the same concept differently, your query layer becomes a crime scene.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc-123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"corr_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc-123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc-123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestThingy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc-123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congrats. You now have four standards.&lt;/p&gt;

&lt;p&gt;Which is another way of saying you have zero standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  We need to govern logs before they spread
&lt;/h2&gt;

&lt;p&gt;I think logging needs to be treated more like an enterprise control.&lt;/p&gt;

&lt;p&gt;Not in the annoying “please fill out this 47 step process before writing code” way.&lt;/p&gt;

&lt;p&gt;I mean simple guardrails close to the developer workflow.&lt;/p&gt;

&lt;p&gt;Things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"eventName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"serviceName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"environment"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"disallowedFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"ssn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"creditCardNumber"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"authorizationHeader"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the policy is not just a paragraph.&lt;/p&gt;

&lt;p&gt;It is something the system can check.&lt;/p&gt;

&lt;p&gt;A log can be evaluated before it leaves the app.&lt;/p&gt;

&lt;p&gt;A risky field can be blocked, redacted, warned on, or tagged.&lt;/p&gt;

&lt;p&gt;A missing field can be detected.&lt;/p&gt;

&lt;p&gt;A temporary exception can be tracked.&lt;/p&gt;

&lt;p&gt;That last part matters.&lt;/p&gt;

&lt;p&gt;Because enterprise systems need escape hatches. Sometimes teams need relaxed rules during a migration, rollout, or incident. Fine. But those exceptions should be visible.&lt;/p&gt;

&lt;p&gt;Invisible exceptions become permanent architecture.&lt;/p&gt;

&lt;p&gt;And permanent architecture is where temporary hacks go to buy furniture.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is what I am building with Cerbi
&lt;/h2&gt;

&lt;p&gt;This is the problem I am working on with Cerbi.&lt;/p&gt;

&lt;p&gt;Cerbi is not meant to replace Serilog, NLog, Log4j, Logback, Pino, Winston, Zap, Datadog, Splunk, Application Insights, OpenSearch, or whatever else teams already use.&lt;/p&gt;

&lt;p&gt;That would be a terrible sales pitch and an even worse migration plan.&lt;/p&gt;

&lt;p&gt;The point is different:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Govern logs before they leave the application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cerbi’s tagline is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We stop it at the source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The idea is to put logging rules closer to where logs are created, not only after they land in a vendor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think logging governance should include
&lt;/h2&gt;

&lt;p&gt;The first piece is runtime governance.&lt;/p&gt;

&lt;p&gt;Some logging behavior only exists when the app runs. Fields are dynamic. Context comes from middleware. Values come from requests. Static analysis can help, but it cannot see everything.&lt;/p&gt;

&lt;p&gt;Runtime governance can tag violations like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"GovernanceProfileUsed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payments-prod-v3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"GovernanceViolations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Missing required field: correlationId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Disallowed field detected: token"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"GovernanceRelaxed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now governance becomes measurable.&lt;/p&gt;

&lt;p&gt;You can see which apps follow the rules.&lt;br&gt;&lt;br&gt;
You can see which teams are drifting.&lt;br&gt;&lt;br&gt;
You can see which exceptions were allowed.&lt;br&gt;&lt;br&gt;
You can see which logs are safe enough to send downstream.&lt;/p&gt;

&lt;p&gt;That is much better than hoping code review caught everything.&lt;/p&gt;
&lt;h2&gt;
  
  
  The next step is scanning repos
&lt;/h2&gt;

&lt;p&gt;The next thing I want to push further is a repository scanner.&lt;/p&gt;

&lt;p&gt;Because before you govern new logs, you probably need to know how bad the current state is.&lt;/p&gt;

&lt;p&gt;A scanner could look for patterns like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logger.info(user)
logger.error(requestBody)
console.log(token)
log.Debug("Customer data: " + customer)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It could also look for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unstructured log messages
Missing correlation IDs
Unsafe field names
Inconsistent event names
No governance profile attached
Sensitive data near log calls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives teams a simple starting question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What is our logging risk right now?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not in theory.&lt;/p&gt;

&lt;p&gt;In the repo.&lt;/p&gt;

&lt;p&gt;That matters for platform teams, security teams, architecture reviews, migrations, and audits.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI can help, but it should not be in charge
&lt;/h2&gt;

&lt;p&gt;I also think AI can help with logging governance.&lt;/p&gt;

&lt;p&gt;But not as magic.&lt;/p&gt;

&lt;p&gt;I do not want AI silently creating production policy like an intern with admin rights.&lt;/p&gt;

&lt;p&gt;Useful AI assistance would look more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Suggest required fields based on existing log patterns.
Detect fields that look sensitive.
Explain why a log violates policy.
Recommend safer structured log shapes.
Convert messy string logs into structured events.
Suggest starter governance profiles for a repo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI should recommend.&lt;/p&gt;

&lt;p&gt;Humans should approve.&lt;/p&gt;

&lt;p&gt;The system should enforce.&lt;/p&gt;

&lt;p&gt;That is the boring version.&lt;/p&gt;

&lt;p&gt;Which usually means it is the version that might actually survive contact with enterprise reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-cloud makes this harder
&lt;/h2&gt;

&lt;p&gt;Most teams do not send logs to one place anymore.&lt;/p&gt;

&lt;p&gt;Some go to Azure.&lt;br&gt;&lt;br&gt;
Some go to AWS.&lt;br&gt;&lt;br&gt;
Some go to GCP.&lt;br&gt;&lt;br&gt;
Some go to a SIEM.&lt;br&gt;&lt;br&gt;
Some go to object storage.&lt;br&gt;&lt;br&gt;
Some go to a data platform.&lt;br&gt;&lt;br&gt;
Some go to an observability vendor.&lt;/p&gt;

&lt;p&gt;That is normal now.&lt;/p&gt;

&lt;p&gt;But logging rules should not disappear because the destination changed.&lt;/p&gt;

&lt;p&gt;If a field is unsafe, it is unsafe before it reaches Azure.&lt;/p&gt;

&lt;p&gt;If a field is required, it is required before it reaches AWS.&lt;/p&gt;

&lt;p&gt;If a log is missing governance metadata, it is missing that metadata before it reaches GCP.&lt;/p&gt;

&lt;p&gt;The destination should not define the discipline.&lt;/p&gt;

&lt;p&gt;The application should emit governed logs from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  My question for other developers
&lt;/h2&gt;

&lt;p&gt;This is the part I am genuinely curious about.&lt;/p&gt;

&lt;p&gt;Do your teams actually enforce logging standards?&lt;/p&gt;

&lt;p&gt;Not document them.&lt;/p&gt;

&lt;p&gt;Enforce them.&lt;/p&gt;

&lt;p&gt;Do you scan repos for unsafe logging?&lt;/p&gt;

&lt;p&gt;Do you block or redact sensitive fields before logs leave the app?&lt;/p&gt;

&lt;p&gt;Do you rely on code review?&lt;/p&gt;

&lt;p&gt;Do you rely on your observability vendor?&lt;/p&gt;

&lt;p&gt;Do you have a logging policy that everyone technically agrees with but nobody thinks about until something breaks?&lt;/p&gt;

&lt;p&gt;I am building Cerbi because I think this is a real gap.&lt;/p&gt;

&lt;p&gt;But I want to hear from people who have dealt with this in real systems.&lt;/p&gt;

&lt;p&gt;Have logs ever saved you?&lt;/p&gt;

&lt;p&gt;Have they ever lied to you?&lt;/p&gt;

&lt;p&gt;And would you want logging governance in your developer workflow, or would it feel like one more enterprise control pretending to help?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>devops</category>
      <category>security</category>
      <category>observability</category>
    </item>
    <item>
      <title>Is Logging Governance Actually Needed?</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Mon, 01 Jun 2026 05:44:56 +0000</pubDate>
      <link>https://dev.to/hellocerbi/is-logging-governance-actually-needed-4d3m</link>
      <guid>https://dev.to/hellocerbi/is-logging-governance-actually-needed-4d3m</guid>
      <description>&lt;p&gt;Most teams do not think about logging governance until something bad happens.&lt;/p&gt;

&lt;p&gt;A customer ID gets logged in the wrong place.&lt;br&gt;
A token shows up in a debug message.&lt;br&gt;
A developer adds email, ssn, or authorizationHeader because they are trying to troubleshoot a production issue at 2 AM.&lt;br&gt;
Six months later, nobody knows which apps log what, which teams follow standards, or whether the logs are safe to send into Splunk, Datadog, Application Insights, OpenSearch, or whatever else the company uses.&lt;/p&gt;

&lt;p&gt;That is the problem Cerbi is trying to solve.&lt;/p&gt;

&lt;p&gt;Cerbi is not another logging vendor.&lt;/p&gt;

&lt;p&gt;It does not try to replace Serilog, NLog, Log4j, Logback, Pino, Winston, Zap, Application Insights, Splunk, or Datadog.&lt;/p&gt;

&lt;p&gt;The goal is simpler:&lt;/p&gt;

&lt;p&gt;Stop bad logs at the source before they become risk, cost, or garbage data.&lt;/p&gt;

&lt;p&gt;The Problem With Logging Today&lt;/p&gt;

&lt;p&gt;Most companies have logging standards.&lt;/p&gt;

&lt;p&gt;Somewhere.&lt;/p&gt;

&lt;p&gt;Usually in a wiki page.&lt;/p&gt;

&lt;p&gt;Maybe in Confluence.&lt;/p&gt;

&lt;p&gt;Maybe in a security policy nobody has read since 2021.&lt;/p&gt;

&lt;p&gt;The policy usually says things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not log PII.&lt;/li&gt;
&lt;li&gt;Do not log PHI.&lt;/li&gt;
&lt;li&gt;Include correlation IDs.&lt;/li&gt;
&lt;li&gt;Include timestamps.&lt;/li&gt;
&lt;li&gt;Use structured logging.&lt;/li&gt;
&lt;li&gt;Do not log secrets.&lt;/li&gt;
&lt;li&gt;Follow severity standards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All good ideas.&lt;/p&gt;

&lt;p&gt;But here is the problem: a wiki page does not enforce anything.&lt;/p&gt;

&lt;p&gt;Developers move fast. Production breaks. Teams are understaffed. Logs get added quickly. Logging libraries give you the power to write almost anything, but they usually do not know what your enterprise allows.&lt;/p&gt;

&lt;p&gt;So the real question is not:&lt;/p&gt;

&lt;p&gt;“Do we have logging standards?”&lt;/p&gt;

&lt;p&gt;The real question is:&lt;/p&gt;

&lt;p&gt;“Are those standards actually enforced before logs leave the application?”&lt;/p&gt;

&lt;p&gt;For most teams, the answer is no.&lt;/p&gt;

&lt;p&gt;Why Logging Governance Matters&lt;/p&gt;

&lt;p&gt;Logs are not just text.&lt;/p&gt;

&lt;p&gt;Logs can contain:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "userId": "12345",&lt;br&gt;
  "email": "customer@example.com",&lt;br&gt;
  "ssn": "123-45-6789",&lt;br&gt;
  "token": "eyJhbGciOi...",&lt;br&gt;
  "requestId": "abc-123",&lt;br&gt;
  "severity": "Error",&lt;br&gt;
  "message": "Payment failed"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Some of that is useful.&lt;/p&gt;

&lt;p&gt;Some of that is dangerous.&lt;/p&gt;

&lt;p&gt;Some of it may be required for support, security, and analytics.&lt;/p&gt;

&lt;p&gt;Some of it should never leave the app.&lt;/p&gt;

&lt;p&gt;The hard part is that every organization has different rules. Healthcare, finance, SaaS, government, retail, and internal enterprise teams all care about different fields, different environments, different retention needs, and different audit requirements.&lt;/p&gt;

&lt;p&gt;Logging governance matters because logs sit at the intersection of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Compliance&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Developer experience&lt;/li&gt;
&lt;li&gt;Cloud cost&lt;/li&gt;
&lt;li&gt;Incident response&lt;/li&gt;
&lt;li&gt;Audit evidence&lt;/li&gt;
&lt;li&gt;Data quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a weird intersection. It is also why the problem gets missed.&lt;/p&gt;

&lt;p&gt;Security thinks observability owns it.&lt;br&gt;
Observability thinks app teams own it.&lt;br&gt;
App teams think platform owns it.&lt;br&gt;
Platform thinks the logging vendor handles it.&lt;br&gt;
The logging vendor says, “We ingest what you send us.”&lt;/p&gt;

&lt;p&gt;And around we go.&lt;/p&gt;

&lt;p&gt;What Cerbi Does&lt;/p&gt;

&lt;p&gt;Cerbi adds a governance layer around logging.&lt;/p&gt;

&lt;p&gt;Instead of only saying “developers should log this way,” Cerbi allows teams to define rules such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "requiredFields": ["correlationId", "traceId", "eventName"],&lt;br&gt;
  "disallowedFields": ["password", "ssn", "creditCardNumber", "authorizationHeader"],&lt;br&gt;
  "allowedTopics": ["Orders", "Payments", "Authentication"],&lt;br&gt;
  "fieldSeverities": {&lt;br&gt;
    "email": "Warning",&lt;br&gt;
    "token": "Error"&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then those rules can be used before logs are emitted.&lt;/p&gt;

&lt;p&gt;That means governance is not just documentation. It becomes part of the development flow.&lt;/p&gt;

&lt;p&gt;Cerbi can help answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this log missing required fields?&lt;/li&gt;
&lt;li&gt;Is this app logging sensitive data?&lt;/li&gt;
&lt;li&gt;Are teams using consistent event names?&lt;/li&gt;
&lt;li&gt;Are severity levels being abused?&lt;/li&gt;
&lt;li&gt;Are relaxed governance exceptions being tracked?&lt;/li&gt;
&lt;li&gt;Which apps are following the logging rules?&lt;/li&gt;
&lt;li&gt;Which teams are drifting from standards?&lt;/li&gt;
&lt;li&gt;What evidence can we show during audit or review?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the real value.&lt;/p&gt;

&lt;p&gt;Not prettier logs.&lt;/p&gt;

&lt;p&gt;Governed logs.&lt;/p&gt;

&lt;p&gt;What Makes Cerbi Different?&lt;/p&gt;

&lt;p&gt;Most logging tools focus on capture, search, dashboards, alerting, or storage.&lt;/p&gt;

&lt;p&gt;Cerbi focuses on what happens before the log reaches those tools.&lt;/p&gt;

&lt;p&gt;That is the difference.&lt;/p&gt;

&lt;p&gt;Cerbi is designed to sit closer to the application and developer workflow. The goal is to prevent bad logging behavior early instead of trying to detect it later after the data has already been shipped somewhere.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Source-Level Governance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cerbi’s main idea is simple:&lt;/p&gt;

&lt;p&gt;Govern logs where they are created.&lt;/p&gt;

&lt;p&gt;Downstream detection is useful, but it is still downstream.&lt;/p&gt;

&lt;p&gt;If a secret, token, or sensitive field already reached your observability platform, the blast radius already exists. You can mask it later. You can alert on it later. You can delete it later. But it already moved.&lt;/p&gt;

&lt;p&gt;Cerbi’s approach is to stop or flag the issue before the log leaves the app.&lt;/p&gt;

&lt;p&gt;That matters.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It Works With Existing Logging Tools&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cerbi is not trying to make every company rip out their current logging stack.&lt;/p&gt;

&lt;p&gt;That would be silly. Also, good luck getting that approved by an architecture review board without someone aging five years in the meeting.&lt;/p&gt;

&lt;p&gt;The better approach is to work with the tools teams already use.&lt;/p&gt;

&lt;p&gt;Cerbi is being built around common logging ecosystems, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET logging&lt;/li&gt;
&lt;li&gt;Serilog&lt;/li&gt;
&lt;li&gt;NLog&lt;/li&gt;
&lt;li&gt;Java Log4j2&lt;/li&gt;
&lt;li&gt;Java Logback&lt;/li&gt;
&lt;li&gt;Node Winston&lt;/li&gt;
&lt;li&gt;Node Pino&lt;/li&gt;
&lt;li&gt;Go Zap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace the logger.&lt;/p&gt;

&lt;p&gt;The goal is to add governance around the logger.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It Supports Runtime Governance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Static analysis is useful, but runtime behavior matters too.&lt;/p&gt;

&lt;p&gt;Sometimes logs are built dynamically. Sometimes fields come from request context. Sometimes the actual data shape only exists at runtime.&lt;/p&gt;

&lt;p&gt;Cerbi is designed to support runtime governance validation so logs can be checked against active governance profiles as they are emitted.&lt;/p&gt;

&lt;p&gt;That allows teams to tag logs with metadata such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
  "GovernanceProfileUsed": "payments-prod-v3",&lt;br&gt;
  "GovernanceViolations": ["Missing correlationId", "Disallowed field: token"],&lt;br&gt;
  "GovernanceRelaxed": false&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This turns logging governance into something measurable.&lt;/p&gt;

&lt;p&gt;You can report on it.&lt;br&gt;
You can audit it.&lt;br&gt;
You can improve it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Relaxed Mode Is Tracked&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Real enterprise systems need escape hatches.&lt;/p&gt;

&lt;p&gt;Sometimes a team needs to temporarily relax governance during a migration, incident, or rollout.&lt;/p&gt;

&lt;p&gt;The problem is when exceptions become invisible.&lt;/p&gt;

&lt;p&gt;Cerbi supports the idea of relaxed logging, but the important part is that relaxed logs are still tagged.&lt;/p&gt;

&lt;p&gt;That means teams can say:&lt;/p&gt;

&lt;p&gt;“We allowed this exception, but we did not lose visibility.”&lt;/p&gt;

&lt;p&gt;That is a much more realistic model than pretending every system can be perfectly governed on day one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Governance Profiles Can Be Versioned and Deployed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Logging rules should not be random code scattered across every app.&lt;/p&gt;

&lt;p&gt;Cerbi’s model is based on governance profiles that can be created, versioned, validated, deployed, and reviewed.&lt;/p&gt;

&lt;p&gt;That matters for enterprise teams because standards change.&lt;/p&gt;

&lt;p&gt;A rule that made sense last year may not make sense now. A new compliance concern may require a new disallowed field. A new platform standard may require a new correlation field. A new app team may need its own profile.&lt;/p&gt;

&lt;p&gt;Governance should evolve without becoming tribal knowledge.&lt;/p&gt;

&lt;p&gt;Current Roadmap&lt;/p&gt;

&lt;p&gt;Cerbi is still early, but the roadmap is focused on making logging governance easier to adopt across real teams.&lt;/p&gt;

&lt;p&gt;Repository Scanner&lt;/p&gt;

&lt;p&gt;One planned area is a scanner that can inspect repositories and identify logging risk before runtime.&lt;/p&gt;

&lt;p&gt;The scanner would look for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unsafe logging patterns&lt;/li&gt;
&lt;li&gt;Missing required fields&lt;/li&gt;
&lt;li&gt;Possible sensitive fields&lt;/li&gt;
&lt;li&gt;Inconsistent event names&lt;/li&gt;
&lt;li&gt;Unstructured log messages&lt;/li&gt;
&lt;li&gt;Hardcoded secrets or risky values in log calls&lt;/li&gt;
&lt;li&gt;Apps that do not have governance profiles attached&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is to let teams scan a repo and quickly understand:&lt;/p&gt;

&lt;p&gt;“How bad is our logging posture right now?”&lt;/p&gt;

&lt;p&gt;That could be useful during onboarding, audits, migrations, or security reviews.&lt;/p&gt;

&lt;p&gt;It also gives teams a starting point. Instead of guessing which apps need cleanup, they can see the risk directly.&lt;/p&gt;

&lt;p&gt;AI Assistance&lt;/p&gt;

&lt;p&gt;Another roadmap item is AI-assisted governance.&lt;/p&gt;

&lt;p&gt;Not “AI writes magic policies and everyone claps.”&lt;/p&gt;

&lt;p&gt;That is not the goal.&lt;/p&gt;

&lt;p&gt;A better use of AI is helping teams reason over logging patterns and suggest improvements.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suggest required fields based on existing log patterns&lt;/li&gt;
&lt;li&gt;Detect fields that look sensitive&lt;/li&gt;
&lt;li&gt;Recommend governance profile changes&lt;/li&gt;
&lt;li&gt;Explain why a log violates policy&lt;/li&gt;
&lt;li&gt;Help convert messy logs into structured logs&lt;/li&gt;
&lt;li&gt;Generate starter rules for a specific app or framework&lt;/li&gt;
&lt;li&gt;Summarize governance drift across repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is that AI should assist, not silently enforce.&lt;/p&gt;

&lt;p&gt;For enterprise governance, humans still need approval. AI can help identify patterns, but admins should control what becomes policy.&lt;/p&gt;

&lt;p&gt;Multiple Cloud Support&lt;/p&gt;

&lt;p&gt;Cerbi is cloud-aware by design.&lt;/p&gt;

&lt;p&gt;Logs do not live in one place anymore. Companies use Azure, AWS, GCP, hybrid networks, SaaS vendors, queues, blob storage, pipelines, and third-party observability tools.&lt;/p&gt;

&lt;p&gt;The roadmap includes support across multiple cloud destinations and deployment models.&lt;/p&gt;

&lt;p&gt;The goal is to let teams govern logs consistently regardless of where they eventually go.&lt;/p&gt;

&lt;p&gt;That could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure-first deployment support&lt;/li&gt;
&lt;li&gt;AWS support&lt;/li&gt;
&lt;li&gt;GCP support&lt;/li&gt;
&lt;li&gt;Queue-based routing&lt;/li&gt;
&lt;li&gt;Blob or object storage targets&lt;/li&gt;
&lt;li&gt;CI/CD integration&lt;/li&gt;
&lt;li&gt;Client-hosted governance APIs&lt;/li&gt;
&lt;li&gt;Dashboard-based policy deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The larger vision is simple:&lt;/p&gt;

&lt;p&gt;Your logging rules should not disappear just because the destination changed.&lt;/p&gt;

&lt;p&gt;Where Cerbi Fits&lt;/p&gt;

&lt;p&gt;Cerbi is probably not needed for every small project.&lt;/p&gt;

&lt;p&gt;If you have one app, two developers, no sensitive data, and simple console logs, Cerbi might be overkill.&lt;/p&gt;

&lt;p&gt;But once you have multiple teams, multiple apps, multiple environments, and sensitive data, the problem changes.&lt;/p&gt;

&lt;p&gt;At that point, logging becomes an enterprise control.&lt;/p&gt;

&lt;p&gt;Not just a developer convenience.&lt;/p&gt;

&lt;p&gt;Cerbi is aimed at teams that need to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are we logging?&lt;/li&gt;
&lt;li&gt;Are we logging sensitive data?&lt;/li&gt;
&lt;li&gt;Are logs consistent across teams?&lt;/li&gt;
&lt;li&gt;Can we prove governance is being followed?&lt;/li&gt;
&lt;li&gt;Can we stop bad logs before they hit vendors?&lt;/li&gt;
&lt;li&gt;Can we reduce noisy or useless log ingestion?&lt;/li&gt;
&lt;li&gt;Can developers still move fast without memorizing every policy?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where I think logging governance becomes necessary.&lt;/p&gt;

&lt;p&gt;Why I’m Building It&lt;/p&gt;

&lt;p&gt;I have worked around enterprise systems long enough to see the same pattern repeat.&lt;/p&gt;

&lt;p&gt;Logging is treated as an implementation detail until it becomes a security, compliance, cost, or incident response problem.&lt;/p&gt;

&lt;p&gt;Then everyone wants answers.&lt;/p&gt;

&lt;p&gt;But by then the logs are already spread across systems. The standards are inconsistent. The data quality is questionable. And nobody is fully sure what every app is emitting.&lt;/p&gt;

&lt;p&gt;Cerbi is my attempt to move that control earlier.&lt;/p&gt;

&lt;p&gt;Before the sink.&lt;br&gt;
Before the dashboard.&lt;br&gt;
Before the audit panic.&lt;br&gt;
Before the “why is there a token in Datadog?” meeting.&lt;/p&gt;

&lt;p&gt;The Question&lt;/p&gt;

&lt;p&gt;I think logging governance is needed.&lt;/p&gt;

&lt;p&gt;But I am more interested in what other developers, architects, SREs, security engineers, and platform teams think.&lt;/p&gt;

&lt;p&gt;Is logging governance a real problem in your environment?&lt;/p&gt;

&lt;p&gt;Do your teams already enforce logging standards?&lt;/p&gt;

&lt;p&gt;Are sensitive fields caught before logs are emitted, or only after they reach your logging vendor?&lt;/p&gt;

&lt;p&gt;Would a repo scanner help?&lt;/p&gt;

&lt;p&gt;Would AI-assisted policy suggestions be useful, or does that feel like one more noisy tool?&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;Should logging governance live inside the developer workflow, or is downstream detection good enough?&lt;/p&gt;

&lt;p&gt;I would genuinely like to hear how other teams handle this.&lt;/p&gt;

&lt;p&gt;Because my suspicion is that a lot of companies have logging standards.&lt;/p&gt;

&lt;p&gt;But far fewer have logging control.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>programming</category>
      <category>architecture</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Logging Governance in .NET: Enforcing Rules Before Your Logs Leave the Process</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Mon, 25 May 2026 22:10:15 +0000</pubDate>
      <link>https://dev.to/hellocerbi/logging-governance-in-net-enforcing-rules-before-your-logs-leave-the-process-4i8l</link>
      <guid>https://dev.to/hellocerbi/logging-governance-in-net-enforcing-rules-before-your-logs-leave-the-process-4i8l</guid>
      <description>&lt;p&gt;I want to talk about a problem that I suspect is more common than teams admit: sensitive data leaking into logs.&lt;/p&gt;

&lt;p&gt;Not because developers are careless. Because logging is ambient. You instrument something quickly, you log a request object for debugging, and somewhere in that object is a field you didn't mean to expose. It happens at 2am during an incident. It happens in a PR that got minimal review. It happens consistently, across every team I've talked to that handles sensitive data in .NET.&lt;/p&gt;

&lt;p&gt;The standard answer is to handle it at the aggregation layer — write a Datadog pipeline rule, set up Splunk field extraction, redact in your SIEM. I understand why that's the default. It's centralized and doesn't require touching application code.&lt;/p&gt;

&lt;p&gt;But it's too late.&lt;/p&gt;

&lt;p&gt;By the time your log aggregator sees that event, it has already been serialized, handed off by your application, potentially written to a local file, shipped over the network to a collector. The data has left your process. Filtering it downstream doesn't undo the transit.&lt;/p&gt;

&lt;p&gt;That's the problem I built Cerbi to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea: Intercept Before Emission
&lt;/h2&gt;

&lt;p&gt;.NET logging frameworks — Serilog, NLog, Microsoft.Extensions.Logging — all have a pipeline. There's a point in that pipeline, before any sink or appender processes the event, where you can inspect and modify the log event. Cerbi sits at that point.&lt;/p&gt;

&lt;p&gt;This means governance rules execute in-process, in memory, before the event goes anywhere. If a field needs to be masked, it's masked before serialization. If a required schema field is missing, the event can be flagged or blocked before emission. The enforcement is at the source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Install the package for your logging framework:&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;# For Microsoft.Extensions.Logging&lt;/span&gt;
dotnet add package Cerbi.MicrosoftExtensions.Governance

&lt;span class="c"&gt;# For Serilog&lt;/span&gt;
dotnet add package Cerbi.Serilog.Governance

&lt;span class="c"&gt;# For NLog&lt;/span&gt;
dotnet add package Cerbi.NLog.Governance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For MEL (which is what most ASP.NET Core apps use by default), registration looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Program.cs&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddLogging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCerbiGovernance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MaskFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ssn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"creditCardNumber"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnforceSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderService"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requiredFields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"userId"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RouteByLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Critical&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"critical-alerts"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You keep writing logs exactly as you do today. Cerbi intercepts them in the pipeline, applies the governance rules, and then lets them continue to your existing sinks.&lt;/p&gt;

&lt;p&gt;No new logging framework. No changes to how your team instruments code. Just a governance layer on top of what you already have.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Governance Actually Means Here
&lt;/h2&gt;

&lt;p&gt;Three things right now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PII Masking&lt;/strong&gt; — You specify field names that should be masked. Cerbi finds them in structured log properties and replaces the value before emission. You can use built-in patterns (email, SSN, credit card) or define your own regex patterns for domain-specific sensitive fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema Enforcement&lt;/strong&gt; — For structured logging to be useful at scale, log events need consistent fields. You can define required properties per service category, and Cerbi will flag or block events that don't meet the schema. This is especially useful in microservice environments where log consistency tends to decay over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log Routing&lt;/strong&gt; — Route log events to different destinations based on level, category, or custom predicates. Useful for separating audit logs from operational logs without plumbing that through your application logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;If you're building in a regulated environment — HIPAA for healthcare data, PCI DSS for payment data, SOC 2 for SaaS, GDPR for anything touching EU users — the "filter it later" approach puts you in a difficult position during an audit. You need to demonstrate that sensitive data wasn't logged, not just that you removed it from a dashboard.&lt;/p&gt;

&lt;p&gt;Governance at the emission point gives you a defensible answer: the data never left the process in that form.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Is Now
&lt;/h2&gt;

&lt;p&gt;Cerbi launched about a week ago. The NuGet packages are live — &lt;code&gt;Cerbi.Core&lt;/code&gt;, &lt;code&gt;Cerbi.Serilog.Governance&lt;/code&gt;, &lt;code&gt;Cerbi.MicrosoftExtensions.Governance&lt;/code&gt;, &lt;code&gt;Cerbi.NLog.Governance&lt;/code&gt;. About 517 downloads so far, which is encouraging for week one.&lt;/p&gt;

&lt;p&gt;It's early. I'm still working through edge cases in the field masking (deeply nested objects, arrays of sensitive items), and the schema enforcement API will evolve based on how teams actually use it. I'd rather ship something real and iterate with actual feedback than polish it alone.&lt;/p&gt;

&lt;p&gt;Pricing is volume-based on log events per month. No per-seat fees — I think penalizing team growth is the wrong model for infrastructure tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you're working on a .NET project that handles sensitive data and you've been relying on downstream filtering, I'd genuinely encourage you to try Cerbi and see if the before-emission model fits your workflow better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cerbi.io&lt;/strong&gt; — GitHub: &lt;a href="https://github.com/Cerbi-Dev" rel="noopener noreferrer"&gt;github.com/Cerbi-Dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do try it, I'd love to hear what works, what doesn't, and what's missing. Drop a comment here or open an issue on GitHub.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>logging</category>
      <category>security</category>
    </item>
    <item>
      <title>Cerbi Update: Practical Logging Governance That Actually Runs in Your Tenant</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Wed, 14 Jan 2026 05:27:26 +0000</pubDate>
      <link>https://dev.to/hellocerbi/cerbi-update-practical-logging-governance-that-actually-runs-in-your-tenant-3fd7</link>
      <guid>https://dev.to/hellocerbi/cerbi-update-practical-logging-governance-that-actually-runs-in-your-tenant-3fd7</guid>
      <description>&lt;p&gt;I’ve been heads-down building &lt;strong&gt;Cerbi&lt;/strong&gt;, a logging governance layer for teams that are tired of discovering logging problems &lt;em&gt;after&lt;/em&gt; production data is already on fire.&lt;/p&gt;

&lt;p&gt;Cerbi isn’t a new log platform. It doesn’t replace Serilog, NLog, OpenTelemetry, or your existing sinks. It sits &lt;em&gt;next to&lt;/em&gt; your logger and answers a very specific question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Are we logging the right things, the right way, without leaking data or creating chaos?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Cerbi Is (and isn’t)
&lt;/h2&gt;

&lt;p&gt;Cerbi is a &lt;strong&gt;governance and enforcement layer&lt;/strong&gt; for structured logging.&lt;/p&gt;

&lt;p&gt;It gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compile-time validation (Roslyn analyzers)&lt;/li&gt;
&lt;li&gt;Runtime validation (non-blocking, tag-and-score)&lt;/li&gt;
&lt;li&gt;Centralized governance rules (JSON, versioned, deployable)&lt;/li&gt;
&lt;li&gt;Per-tenant deployment (your infra, your data, your control)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proxy or ingest your logs&lt;/li&gt;
&lt;li&gt;Phone home from the hot path&lt;/li&gt;
&lt;li&gt;Charge per GB&lt;/li&gt;
&lt;li&gt;Require replacing your existing logging stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your logs already go to queues, files, or sinks, Cerbi stays out of the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s working today
&lt;/h2&gt;

&lt;p&gt;This isn’t a roadmap post — this is what exists and runs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CerbiStream&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured logging with built-in governance hooks&lt;/li&gt;
&lt;li&gt;Async logging with backpressure handling&lt;/li&gt;
&lt;li&gt;File fallback (including encrypted rotation)&lt;/li&gt;
&lt;li&gt;Zero network dependency in the hot path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Governance Analyzer (compile-time)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enforces required fields, forbidden fields, enums, encryption rules&lt;/li&gt;
&lt;li&gt;Works in IDE + CI&lt;/li&gt;
&lt;li&gt;Same JSON schema used everywhere (no drift)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Runtime Governance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mirrors analyzer rules at runtime&lt;/li&gt;
&lt;li&gt;Never drops logs&lt;/li&gt;
&lt;li&gt;Redacts sensitive values and tags violations instead&lt;/li&gt;
&lt;li&gt;Supports &lt;code&gt;Relax()&lt;/code&gt; scopes (explicit, auditable rule bypass)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CerbiShield (Dashboard + APIs)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON governance profiles with versioning&lt;/li&gt;
&lt;li&gt;RBAC, audit logs, and deployment history&lt;/li&gt;
&lt;li&gt;Per-tenant deployment (Azure Container Apps right now)&lt;/li&gt;
&lt;li&gt;Governance rules deploy to GitHub, filesystem, pipelines, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs in the &lt;strong&gt;customer’s tenant&lt;/strong&gt;. The only thing hosted centrally (later) is optional scoring and analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;Every enterprise team I’ve worked with eventually hits the same problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logging standards exist… somewhere&lt;/li&gt;
&lt;li&gt;Nobody enforces them consistently&lt;/li&gt;
&lt;li&gt;PII sneaks into logs anyway&lt;/li&gt;
&lt;li&gt;Cleanup happens &lt;em&gt;after&lt;/em&gt; incidents&lt;/li&gt;
&lt;li&gt;Governance lives in Confluence instead of code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cerbi treats logging rules like code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defined once&lt;/li&gt;
&lt;li&gt;Versioned&lt;/li&gt;
&lt;li&gt;Validated early&lt;/li&gt;
&lt;li&gt;Enforced continuously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No policy theater.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Core runtime + analyzers: &lt;strong&gt;stable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Dashboard + APIs: &lt;strong&gt;feature-complete for Phase 1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Marketplace prep: &lt;strong&gt;in progress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Multi-language logger plugins (Node / Python / Java / Go): &lt;strong&gt;next&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CerbiStream and the analyzers are free. CerbiShield (the governance control plane) is the licensed piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this sounds useful
&lt;/h2&gt;

&lt;p&gt;I’m actively looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teams who care about logging quality and compliance&lt;/li&gt;
&lt;li&gt;People who want to try governance &lt;em&gt;without&lt;/em&gt; ripping out their stack&lt;/li&gt;
&lt;li&gt;Feedback from folks who’ve been burned by log sprawl before&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docs and repos are public, and I’m sharing progress openly as this hardens.&lt;/p&gt;

&lt;p&gt;Logging shouldn’t be exciting — but broken logging is always exciting in the worst possible way. Cerbi is about making the boring parts correct, predictable, and enforced.&lt;/p&gt;

&lt;p&gt;More updates soon.&lt;/p&gt;

</description>
      <category>codequality</category>
      <category>devops</category>
      <category>dotnet</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Logging Governance (2025-11-07)</title>
      <dc:creator>Hello Cerbi</dc:creator>
      <pubDate>Sat, 08 Nov 2025 04:59:02 +0000</pubDate>
      <link>https://dev.to/hellocerbi/logging-governance-2025-11-07-28ee</link>
      <guid>https://dev.to/hellocerbi/logging-governance-2025-11-07-28ee</guid>
      <description>&lt;p&gt;When dashboards break because fields renamed or types shift, pain spikes for everyone. Cerbi’s stable field names and types keep visualizations reliable sprint after sprint, saving time and keeping insights steady—even during hectic releases. &lt;a href="http://www.cerbi.io" rel="noopener noreferrer"&gt;www.cerbi.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>logging</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
