You hit an error, you have a stack trace, and you want to put it in a bug report, a forum thread, a pastebin or an AI chat. Here is what is actually in that text, what an automated scrubber can and cannot take out of it, and the one step people skip.
The short version. Logs leak far more than the error you are trying to fix. Assume the text contains at least one credential, one email address and one internal hostname until you have looked.
And the step people skip: if a live credential was in the log, redacting your copy does nothing about it. Redaction protects the next reader. Only rotating the credential protects you. Do that first, then paste.
The ladder is why the order matters. Redacting decides what the next reader sees; it does nothing about the copies that already left. If a live credential was in that text, rotate it first, then paste.
Every option below leaks the same text. They differ in who reads it and in whether deleting it afterwards accomplishes anything.
| Where | Who can read it | Does deleting help? |
|---|---|---|
| Private ticket | Your org now, plus everyone who joins later, plus anyone who exports the tracker. | Partly. Edit history and search indexes often keep the original. |
| Public issue or forum |
Everyone, plus crawlers and mirror sites within minutes, plus every subscriber who got an email copy of your post. | No. The email notifications already went out with the full text. |
| Gist or paste, “unlisted” |
Anyone with the link. Unlisted is not private, and public paste sites are continuously scraped by people looking for exactly this. | No. It removes the page, not the copies. |
| AI chat | The vendor, under whatever retention and training settings your account has. Worth checking those settings once rather than guessing each time. | Assume the message was stored the moment you sent it. |
| CI log | On a public repository, everyone. Build logs are indexed and archived. | No, and re-running the job does not remove the old run. |
In every row, the remedy for a leaked credential is the same, and it is not deletion. It is rotation.
Each example below is a real log shape. The badge says whether an automated redactor — specifically the one on this site, which runs offline in your browser — catches it, and every badge on this page is verified by a test that runs the example through the actual detectors before publishing.
fatal: could not read Password for https://github.com: ghp_A1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6Q7r8
Prefixed tokens are the easy case: ghp_, AKIA,
sk_live_, xoxb-. They are easy for a scrubber to find and equally
easy for someone scanning public pastes to find. If you want to know what a particular prefix
lets an attacker do, that is the field guide.
java.sql.SQLException: jdbc:postgresql://reporting:Tr0ub4dor3@db-prod-3:5432/analytics
mysql -h db-prod-3 -u reporting --password=Tr0ub4dor3 analytics
This is the category people under-estimate. A password inside a connection string, a
password on a command line captured by a shell trace, an
Authorization: Basic header whose base64 decodes to
user:password. None of these have a memorable prefix, and all three appear in
ordinary crash output without anyone deciding to log a secret.
session=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MjciLCJ0ZW5hbnQiOiJub3J0aHdpbmQiLCJyb2xlIjoiYWRtaW4ifQ.QW5vdGhlclNpZ25hdHVyZUhlcmU
A JWT is signed, not encrypted. The middle section is plain base64 and anyone can read it
without any key at all — here it says user 427, tenant northwind, role
admin. So “it is expired, it is fine” is only half true: the token
may no longer authenticate, but it still publishes your internal id scheme, your tenant
names and your role names.
File "/home/rmalone/src/billing/app.py", line 214, in charge DEBUG notify: sending receipt to rachel.malone@northwind-logistics.com
Stack traces carry the developer's username in every file path, and application logs carry the customer's email in every notification line. The first tells a stranger who works there and what the internal project layout is; the second is somebody else's personal data, which your organisation probably has rules about.
PaymentError: card 4242424242424242 declined
Card numbers and social security numbers turn up in payment-path exceptions surprisingly often, because the failing request body gets logged whole. A good redactor checks the Luhn digit rather than matching any sixteen digits, so order numbers survive and cards do not.
ConnectionRefusedError: connect to redis-sessions-prod-2.internal:6379 failed AccessDenied: s3://northwind-invoices-prod/2026/08/batch-441.csv sqs consumer error on queue billing-retries-prod-dlq
Hostnames, bucket names, queue names, database names, service names. No scrubber can find
these, because they are indistinguishable from ordinary words — only you know that
northwind-invoices-prod is a bucket rather than a variable. Individually they are
harmless. Collectively they are a map of your infrastructure with the production systems
helpfully labelled, and that is what makes the next phishing attempt convincing.
This is the part you have to do by hand. It is the single biggest reason not to treat “I ran it through a redactor” as finished.
ConnectionRefusedError: [Errno 111] connect to 10.4.19.203:6379 failed
The redactor on this site skips RFC1918 ranges — 10.x,
192.168.x, 172.16–31.x, 127.x — because
redacting every internal address makes a network log unreadable while hiding nothing an
attacker could route to. Public addresses like 203.0.113.44 are redacted. If
your internal addressing is itself sensitive, that is a decision only you can make, and you
make it by reading the output.
Python 3.11.4 / Django 4.2.1 / psycopg2 2.9.6 / nginx 1.24.0
The banner at the top of a traceback is an exact inventory of what you run. No tool will ever flag it, because it is indistinguishable from the information you are asking for help with. Usually you should post it anyway — people cannot help you without it. Just know that you are also publishing a list someone can check against known vulnerabilities, and weigh that if your stack is behind on patches.
Automated scrubbing is worth doing and is not sufficient. The honest limits:
Order of operations, and the order matters:
If you are the one designing the API whose keys keep showing up in other people's logs, the format is a lever. A distinctive prefix makes a leak findable by automated scanners, and a short checksum lets a scanner reject a fake without a network call. How to design an API token covers both, with tested reference code in JavaScript and Python.
If it is already out there — committed, pushed, pasted — then this page is the wrong one and the clock has started. Do these things, in this order.