Developer Guides
How to Share Log Files and Crash Dumps Without Slack Limits
Share logs and crash dumps when Slack and Discord reject the file. Redact secrets, zip dumps, and hand off to QA cleanly.

The bug is only reproducible on one laptop. QA asks for logs. You drag `debug.log` into Slack and the client refuses the upload. Or it accepts the file and strips context because the dump is huge. Discord is the same story with a different megabyte number. The outage is still happening, and you are now debugging the chat app instead of the product.
Log files and crash dumps are awkward to share because they are large, sensitive, and useless without metadata. This guide covers how to package them, what to redact, how to get around chat attachment limits without inventing unsafe workarounds, and how to hand the bundle to QA so they can actually use it.
Why chat apps bounce your logs
Slack, Discord, Microsoft Teams, and email were built for conversation, not for core dumps.
Typical constraints you will hit:
- Free Slack workspaces have a small per-file cap (commonly on the order of a few megabytes on older free plans; paid workspaces are higher, still finite).
- Discord attachments have a low limit on free accounts and a higher but still modest cap with Nitro.
- Email often sits around 20–25 MB for the whole message.
- Many clients block unusual extensions or scan archives and fail closed.
Exact numbers change with plan and year, so do not memorize a marketing page. Measure the file, then pick a path that is honest about size. Renaming `crash.dmp` to `crash.dmp.txt` to sneak past a filter is a bad idea: you lose tool support and you train people to bypass security scanners.
What "the logs" should include
A single truncated `console.log` paste is not a dump. For a useful QA or on-call handoff, collect:
- Application logs for the time window of the incident, not the entire month.
- Process identifier, host or device name, OS, app version, and commit SHA.
- Crash dump or minidump if the process died.
- Relevant config without secrets (feature flags, replica role, build channel).
- Steps to reproduce and the UTC timestamps of the failure.
- For mobile: OS version, device model, and whether it is a debug or store build.
Do not send the whole `logs/` directory from 2019. Bigger is not kinder. Bigger is more secrets and a slower download on a phone.
Redact before you zip
Logs are where tokens go to hide in plain sight. Search the files before they leave your disk.
Redact or drop:
- `Authorization` headers, session cookies, and JWT strings
- Password reset links and magic-login URLs
- API keys, cloud access keys, and webhook URLs
- Personal data: emails, phone numbers, home addresses, government IDs
- Customer message bodies if you are not allowed to export them
- Full request payloads that contain card data or health information
- Internal hostnames if your security policy treats them as sensitive (replace with roles: `payments-api-1`)
A simple first pass is a scripted replace for known patterns (`sk_live_`, `Bearer `, `eyJ`, `AKIA`). A second pass is a human glance at the first and last 200 lines. If the product handles regulated data, use the official export and redaction path your company already approved—not a personal Discord DM.
Crash dumps can contain memory fragments. That means passwords typed into forms, tokens sitting in RAM, and snippets of other requests. Treat dumps as more sensitive than info logs. Share them with the smallest group that can analyze them, and delete extra copies when the incident closes.
Zip the right way
Compression is the difference between "Slack said no" and "QA opened it."
- Prefer `zip` or `tar.gz` of already rotated files, not one 4 GB text file if you can split by hour.
- Name the archive with ticket id, service, and timestamp: `INC-1842-api-2026-08-04T14Z.zip`.
- Put a `README.txt` in the zip: version, host, how logs were captured, time zone.
- Include checksums for dumps so people can confirm the download.
- Avoid nested zips of zips. One archive, one README.
If a single uncompressed log is multi-gigabyte, do not email it. Slice to the incident window with `grep` or your log CLI, or upload the object to the store your observability vendor already uses.
Delivery paths that survive size limits
Match the tool to how soon the other person will download, and to how secret the dump is.
- Your existing log vendor (Datadog, CloudWatch, Grafana, Sentry). Share a time-bounded query or event link when both sides have accounts. This is the best default inside a company.
- Ticket attachment on the issue tracker if the file is small and the tracker is the system of record.
- Object storage with a signed URL (minutes or hours of life) for large dumps. Put the URL in the ticket, not in a public Slack channel.
- A temporary browser room when an external QA person cannot get a vendor seat today. [PeerPizza](/) is one no-account option: room code, optional PIN, chat plus files in the browser, chunked uploads without a fixed per-file size cap, and automatic cleanup after about two hours of inactivity. Keep your own copy of the dump. When the room expires, the shared copy is gone.
- Same-desk USB for air-gapped or legally locked environments.
Do not paste multi-megabyte logs into the chat composer. You will hit message limits, lose formatting, and spray secrets into search indexes that keep messages longer than your log retention policy.
QA handoff that does not waste a cycle
QA and on-call engineers should not have to reverse-engineer your laptop. In the ticket or chat message, include:
- Ticket or incident id
- Exact app version and git SHA
- Environment (prod, staging, local)
- UTC time of first and last error
- What you already tried
- Whether the dump is from a crash, a hang, or a wrong answer
- How long the download link or room remains valid
- What was redacted, so they do not hunt for a token you already removed
If they need to reproduce, attach the smallest failing input, not the production database. If they need to symbolicate a crash, send matching debug symbols or a mapping file through the same controlled path, and note the exact build they belong to. A dump without symbols is a paperweight.
Honest limits
Temporary rooms and signed URLs are not an archive. Chat search is not an archive either, even when the file luckily fits. If the dump matters for a postmortem, store it in the incident bucket or the vendor that already has retention rules. If the dump contains customer data, follow deletion rules after the incident; do not leave it in a contractor's Downloads folder forever.
Also be honest with yourself about volume. If every bug requires a 2 GB zip, instrument the product so QA can pull a correlation id from a dashboard instead.
Troubleshooting log and dump sharing
Slack or Discord rejects the upload
- Check the file size against your plan. Compress or trim to the incident window.
- Some workspaces block executables and dumps by extension. Zip them and tell security what is inside; do not spoof the extension.
- If only images are allowed in a channel, you are in the wrong channel. Use the incident thread or a file room.
The zip opens but QA says it is empty
- You zipped a path that was still being written and produced a partial copy. Copy logs to a staging folder first, then archive.
- macOS resource-fork noise or a single hidden file. Confirm they opened the inner folder.
- They downloaded an expired link and saved an error HTML page as `logs.zip`. Compare size to what you uploaded.
"I cannot reproduce from these logs"
- Time zones differ. Label everything UTC.
- You sent info-level logs and the error is at debug, or the opposite: you sent a full trace with no summary.
- Multiple instances sat behind a load balancer and you exported the wrong host. Include instance id.
You already posted a secret in Slack
- Rotate the credential. Then delete the Slack file and the message if your plan allows.
- Treat mirrors (email notifications, mobile downloads, thread copies) as compromised too.
- Add the pattern to the redaction script so the next incident is cleaner.
Mobile testers cannot download the dump
- A 800 MB minidump is a desktop job. Say that in the handoff.
- Cellular connections drop. Prefer a room or signed URL that can be retried, not a one-shot email attachment.
- Give them a filtered log first, and only request the full dump if the filtered file is not enough.
Chat vs dedicated handoff
| Path | Typical size pain | Secret sprawl | Best use |
|---|---|---|---|
| Slack / Discord / Teams attach | Hits plan caps fast | High (search, guests, retention) | Tiny redacted snippets |
| Paste into chat | Worse | Highest | Stack traces under a screen |
| Issue tracker attachment | Medium | Medium | Files that belong on the ticket |
| Signed URL or temp room | Low if chunked | Lower if short-lived and PIN-gated | Large logs and dumps |
| Observability vendor share | None for raw files | Controlled by vendor ACL | Default inside the company |
Final thoughts
When Slack or Discord refuses a log, the fix is not a clever filename. Trim to the incident, redact tokens and personal data, zip with a README, and send the archive through a path that expects large binaries: a vendor share, a signed URL, or a short-lived room. Tell QA the version, the UTC window, and when the download expires. Keep your own copy until the ticket closes, then store or delete according to policy. The goal is a dump someone can analyze—not a second incident in the chat logs.
Try PeerPizza: free temporary rooms to chat and share files — no signup, room codes, optional PIN, auto cleanup. Open home