Obervability
Services
AudiTrace
Resources▾
Contact
Book a free audit
From the audit · Pipelines
Personal data in logs: 50 sources, about 30.7 million records a day
Not a breach. An exposure — email addresses arriving in cleartext into a queryable store, at a rate nobody had measured, with no masking rule in front of them.
Published 16 September 2026
The quiet version of a privacy problem
Nothing was leaked. No attacker was involved, no bucket was public, and every access was authenticated and logged. What the audit found was narrower and more ordinary: 50 log sources were sending records containing email addresses in cleartext, roughly 30.7 million records a day, into a store that anyone with query access could search.
That is not a headline. It is, however, personal data processed without anyone having decided to process it, retained for as long as the bucket says, and searchable by a population wider than anybody had thought about — which is the definition of the problem that regulators actually encounter.
Why it is almost always the default
Application logs are written for debugging, and an email address is the single most useful debugging key there is. Nobody adds it to a log line as a data-processing decision; they add it because the alternative is a support ticket that cannot be traced to an account.
Ingest is where that becomes a platform decision rather than a developer one — and ingest configuration is usually set up once, for the first few sources, and then inherited by every source added afterwards without review.
What the check does and does not do
It counts pattern matches per source and reports the source and the rate. It does not extract the matched values, does not store them, does not transmit them, and the report quotes none of them. A finding that had to quote the data in order to prove the data existed would be a worse problem than the one it describes.
It also does not tell you whether you have a legal problem. We are not lawyers and the report does not offer an opinion; it establishes what is arriving, where, and at what rate, which is the input your privacy counsel needs and currently does not have.
The shape of the query
Counting matches per source without reading them — this is the logic behind the finding:
DQL
fetch logs, from: -24h
| filter matchesPhrase(content, "@")
| filter matchesValue(content, "*@*.*")
| summarize records = count(), by: {dt.source_entity}
| sort records desc
The fix is upstream, and it is cheap
A masking rule at ingest stops new personal data landing in queryable storage, and it applies from the moment it is saved. It is the cheapest control in the platform and the one most often missing, because it protects against something that has never visibly gone wrong.
What masking does not do is anything about the records already stored — that is a retention question, and it lands in a different domain of the audit with a different, harder decision attached. Fix the inflow first; it is the half you can fix today.
The finding behind this piece
Log sources with email addresses in cleartext
Scale
50 sources · ~30.7M/day
Impact
GDPR exposure
The takeaway
Personal data in logs is not usually a failure of care. It is the absence of a rule that nobody was ever prompted to write.
More from the series
The $91,576 question: Full-Stack hosts with nothing monitored on them
From the audit · FinOps
The Grail bucket nobody chose: 462 days of retention
From the audit · Grail
1,617 maintenance windows: how alerting goes quiet without anyone deciding
From the audit · Alerting
What actually lands on a DPS invoice
From the audit · FinOps
Find out what your own tenant says.
One read-only run, 71 checks, and the source behind every finding. You keep the report either way.
Book a free audit
AudiTrace
Find out what your Obervability is actually doing.
An audit takes one run. The findings take one meeting. What you do with them is up to you.
Certified Dynatrace experts
+1
Obervability
Dynatrace implementation, managed services and support. Every finding comes with the source behind it.
Services
Services
AudiTrace
Case study
Guides
Dynatrace audit
Dynatrace cost optimization
Audit case study
Articles
Reach us
Contact
hello@obzervability.com
© 2026 Obervability · All rights reserved.
Privacy
Terms of use
Accessibility
Obervability
{{ t.navServices }}
AudiTrace
{{ resLabel }}▾
{{ t.navContact }}
{{ footGuideAudit }}
{{ footGuideCost }}
{{ footGuideCase }}
{{ footGuideArticles }}
{{ langLabel }} ▾
English
{{ altLabel }}
{{ t.heroKicker }}
{{ t.heroTitle }}
{{ t.heroSub }}
{{ t.heroCta1 }}
{{ t.heroCta2 }}
{{ t.badge }}
71
{{ t.stripChecks }}
19
{{ t.stripDomains }}
21
{{ t.stripRem }}
0
{{ t.stripWrite }}
{{ t.svcTitle }}
{{ t.s1t }}
{{ t.s1d }}
{{ t.s2t }}
{{ t.s2d }}
{{ t.s3t }}
{{ t.s3d }}
{{ t.caseKicker }}
{{ t.caseTitle }}
{{ t.caseCtx }}
{{ t.caseNote }}
{{ t.svcKick }}
{{ t.svcTitle2 }}
{{ t.svcSub }}
{{ t.heroCta1 }}
{{ t.svcCta2 }}
71
{{ t.svcL1 }}
$114–178k
{{ t.svcL2 }}
0
{{ t.svcL3 }}
{{ t.svcTracksT }}
{{ t.svcTracksD }}
{{ k.t }}
{{ k.g }}
{{ k.d }}
{{ t.fcTitle }}
{{ t.svcFindD }}
{{ f.t }}
{{ f.d }}
{{ t.svcEngT }}
{{ t.colEng }}
{{ t.colTrack }}
{{ t.colShape }}
{{ e.n }}
{{ e.k }}
{{ e.s }}
{{ t.svcCtaT }}
{{ t.svcCtaD }}
{{ g.kicker }}
{{ g.title }}
{{ g.sub }}
{{ g.cta1 }}
{{ g.cta2 }}
{{ g.s1h }}
{{ p.t }}
{{ g.s2h }}
{{ g.s2sub }}
{{ c.t }}
{{ c.d }}
{{ g.s3h }}
{{ g.s3sub }}
{{ g.s4h }}
{{ g.s4sub }}
{{ g.tableNote }}
{{ g.s5h }}
{{ g.s5sub }}
{{ k.t }}
{{ k.d }}
{{ g.s6h }}
{{ c.t }}
{{ c.d }}
{{ g.faqH }}
{{ f.q }}
{{ f.a }}
{{ g.closerT }}
{{ g.closerD }}
{{ g.cta1 }}
{{ g.closerCta }}
{{ g.kicker }}
{{ g.title }}
{{ g.sub }}
{{ g.cta1 }}
{{ g.cta2 }}
{{ g.s1h }}
{{ p.t }}
{{ g.s2h }}
{{ g.s2sub }}
{{ g.tableNote }}
{{ g.s3h }}
{{ c.t }}
{{ c.d }}
{{ g.s4h }}
{{ c.t }}
{{ c.d }}
{{ g.faqH }}
{{ f.q }}
{{ f.a }}
{{ g.closerT }}
{{ g.closerD }}
{{ g.cta1 }}
{{ g.closerCta }}
{{ dom.kicker }}
{{ dom.title }}
{{ dom.lede }}
{{ dom.ctaBook }}
{{ dom.ctaChecks }}
{{ dom.hReads }}
{{ r.t }}
{{ r.d }}
{{ dom.hWhy }}
{{ p.t }}
{{ dom.findLabel }}
{{ dom.findName }}
{{ dom.lblScale }}
{{ dom.findScale }}
{{ dom.lblImpact }}
{{ dom.findImpact }}
{{ dom.findNote }}
{{ dom.hFaqs }}
{{ f.q }}
{{ f.a }}
{{ dom.hOther }}
{{ dom.otherSub }}
{{ dom.closerT }}
{{ dom.closerD }}
{{ dom.ctaBook }}
{{ dom.closerCta }}
{{ c.kicker }}
{{ c.title }}
{{ c.sub }}
{{ c.cta1 }}
{{ c.cta2 }}
{{ f.n }}
{{ f.l }}
{{ c.s1h }}
{{ c.s1sub }}
{{ c.tableNote }}
{{ c.s2h }}
{{ p.t }}
{{ c.s3h }}
{{ a.t }}
{{ a.d }}
{{ c.s4h }}
{{ f.q }}
{{ f.a }}
{{ c.closerT }}
{{ c.closerD }}
{{ c.cta1 }}
{{ c.closerCta }}
{{ art.kicker }}
{{ art.title }}
{{ art.dek }}
{{ art.dateLine }}
{{ s.h }}
{{ p.t }}
DQL
{{ s.code }}
{{ art.findLabel }}
{{ art.findName }}
{{ art.scaleLabel }}
{{ art.findScale }}
{{ art.impactLabel }}
{{ art.findImpact }}
{{ art.takeawayLabel }}
{{ art.takeaway }}
{{ art.moreLabel }}
{{ art.ctaTitle }}
{{ art.ctaSub }}
{{ art.ctaBtn }}
AudiTrace
{{ artIndexKicker }}
{{ artIndexTitle }}
{{ artIndexSub }}
{{ t.privTitle }}
{{ t.privUpdated }}
{{ s.h }}
{{ s.b }}
{{ t.termsTitle }}
{{ t.termsUpdated }}
{{ s.h }}
{{ s.b }}
{{ t.a11yTitle }}
{{ t.a11yUpdated }}
{{ s.h }}
{{ s.b }}
{{ c.t }}
{{ c.d }}
{{ t.pTitle }}
{{ p.t }}
{{ p.d }}
{{ p.fig }}
{{ t.hTitle }}
{{ s.n }}
{{ s.t }}
{{ s.d }}
{{ t.way1k }}
{{ t.way1t }}
{{ t.way1d }}
{{ t.way2k }}
{{ t.way2t }}
{{ t.way2d }}
{{ t.waysNote }}
{{ t.fcTitle }}
{{ i.t }}
{{ i.d }}
{{ t.prDelTitle }}
{{ d.t }}
{{ d.d }}
{{ t.dTitle }}
{{ t.dSub }}
{{ t.secTitle }}
{{ b.t }}
{{ b.d }}
{{ n.t }}
{{ t.oTitle }}
{{ o.k }}
{{ o.t }}
{{ o.d }}
{{ o.p }}
{{ t.faqTitle }}
{{ q.q }}
{{ q.a }}
{{ t.cTitle }}
{{ t.cSub }}
{{ t.badge }}
{{ t.fSentT }}
{{ t.fSentD }}
{{ ccDial }}
{{ formErrMsg }}
{{ t.footColServices }}
{{ t.navServices }}
AudiTrace
{{ t.navCase }}
{{ t.footColGuides }}
{{ footGuideAudit }}
{{ footGuideCost }}
{{ footGuideCase }}
{{ footGuideArticles }}
{{ t.footColReach }}
{{ t.navContact }}
hello@obzervability.com
© 2026 Obzervability · {{ t.footRights }}
{{ t.navPrivacy }}
{{ t.navTerms }}
{{ t.navA11y }}