Skip to main content

Logging

BugPin uses structured logging with different outputs depending on your deployment method. Logs are accessible through Docker's built-in log commands or the systemd journal. This guide covers viewing logs in real time, filtering by log level, configuring log rotation, and common patterns for diagnosing issues.

Log Levels​

BugPin supports four log levels (configurable via LOG_LEVEL environment variable):

LevelDescriptionUse Case
debugVerbose diagnostic informationDevelopment, troubleshooting
infoGeneral informational messagesProduction (default)
warnWarning messages for potential issuesProduction
errorError messages for failuresProduction

Default log levels:

  • Development: debug
  • Production: info

Set custom log level:

See deployment-specific configuration below (Docker or systemd).


Log Format​

All logs follow this structured format:

[2026-01-05T16:00:00.000Z] [INFO] Server started on port 7300
[2026-01-05T16:00:01.123Z] [DEBUG] [req-abc123] GET /api/reports
[2026-01-05T16:00:01.456Z] [ERROR] Database connection failed {"error": "ECONNREFUSED"}

Format:

  • [timestamp] - ISO 8601 timestamp
  • [level] - Log level (DEBUG, INFO, WARN, ERROR)
  • [requestId] - Optional request correlation ID
  • message - Log message
  • {context} - Optional JSON context with additional data

Deployment Methods​

BugPin can be deployed in two ways, each with its own logging system:

MethodPlatformSetup RequiredLogs Location
DockerAnyDocker setupDocker logs (docker compose logs)
systemdLinuxsystemd setupsystemd journal (journalctl)

Choose your deployment:

info

systemd is a process manager that must be configured before you can view logs. Follow the systemd setup guide first.


Docker Logging​

View Logs​

# View all logs
docker compose logs

# Follow logs in real-time
docker compose logs -f

# Last 100 lines
docker compose logs --tail=100

# Logs from specific time
docker compose logs --since "2026-01-05T15:00:00"
docker compose logs --since "1h"
docker compose logs --since "30m"

# Show timestamps
docker compose logs -t

Log Storage​

Docker stores logs in JSON format at:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

Configure Log Rotation​

Add to docker-compose.yml:

services:
bugpin:
image: registry.arantic.cloud/bugpin/bugpin:latest
logging:
driver: "json-file"
options:
max-size: "10m" # Max size per log file
max-file: "3" # Keep 3 rotated files
compress: "true" # Compress rotated logs

Alternative Log Drivers​

Local File Driver​

logging:
driver: "local"
options:
max-size: "10m"
max-file: "5"

Syslog​

logging:
driver: "syslog"
options:
syslog-address: "tcp://localhost:514"
tag: "bugpin"

Fluentd​

logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "bugpin"

Export Docker Logs​

# Export to file
docker compose logs > bugpin-logs.txt

# Export with timestamps
docker compose logs -t > bugpin-logs-$(date +%Y%m%d).txt

# Export specific time range
docker compose logs --since "2026-01-05" --until "2026-01-06" > bugpin-logs-jan5.txt

systemd Logging​

View Logs​

# View all logs
sudo journalctl -u bugpin

# Follow logs in real-time
sudo journalctl -u bugpin -f

# Last 100 lines
sudo journalctl -u bugpin -n 100

# Logs since specific time
sudo journalctl -u bugpin --since "2026-01-05 15:00:00"
sudo journalctl -u bugpin --since "1 hour ago"
sudo journalctl -u bugpin --since today
sudo journalctl -u bugpin --since yesterday

# Logs with specific priority
sudo journalctl -u bugpin -p err # Errors only
sudo journalctl -u bugpin -p warning # Warnings and above

# Show timestamps
sudo journalctl -u bugpin -o short-iso

# Show with full details
sudo journalctl -u bugpin -o verbose

# JSON format
sudo journalctl -u bugpin -o json

Log Storage​

systemd stores logs in the journal:

/var/log/journal/

Export systemd Logs​

# Export to file
sudo journalctl -u bugpin > bugpin-logs.txt

# Export with timestamps
sudo journalctl -u bugpin -o short-iso > bugpin-$(date +%Y%m%d).txt

# Export specific time range
sudo journalctl -u bugpin --since "2026-01-05" --until "2026-01-06" > bugpin-jan5.txt

# Export as JSON
sudo journalctl -u bugpin -o json > bugpin-logs.json

Log Rotation​

systemd journal rotates automatically based on:

# /etc/systemd/journald.conf
SystemMaxUse=500M # Max disk space for journal
SystemKeepFree=1G # Keep 1GB free on disk
SystemMaxFileSize=50M # Max size per journal file
MaxRetentionSec=1month # Keep logs for 1 month

Apply changes:

sudo systemctl restart systemd-journald

Vacuum Old Logs​

# Remove logs older than 7 days
sudo journalctl --vacuum-time=7d

# Limit total journal size to 500MB
sudo journalctl --vacuum-size=500M

# Remove all but last 10 journal files
sudo journalctl --vacuum-files=10

Development Logging​

When running with bun run dev, logs output directly to your terminal (stdout/stderr).

Custom Log Level​

# Verbose debugging
LOG_LEVEL=debug bun run dev

# Production-like logging
LOG_LEVEL=info bun run dev

# Only errors
LOG_LEVEL=error bun run dev

Save Development Logs​

# Save to file
bun run dev > dev.log 2>&1

# Save with timestamps
bun run dev 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' > dev.log

# Tee to both terminal and file
bun run dev 2>&1 | tee dev.log

Log Analysis​

Common Patterns​

Find Errors​

# Docker
docker compose logs | grep ERROR

# systemd
sudo journalctl -u bugpin -p err

Find Slow Requests​

# Search for requests taking > 1000ms
docker compose logs | grep -E "duration.*[0-9]{4,}ms"

Count Log Levels​

# Docker
docker compose logs | grep -oP '\[(DEBUG|INFO|WARN|ERROR)\]' | sort | uniq -c

# systemd
sudo journalctl -u bugpin | grep -oP '\[(DEBUG|INFO|WARN|ERROR)\]' | sort | uniq -c

Find Specific Request​

# Search by request ID
docker compose logs | grep "req-abc123"

Log Monitoring Tools​

# Install
sudo apt install lnav # Ubuntu/Debian
brew install lnav # macOS

# View Docker logs
docker compose logs -f | lnav

# View systemd logs
sudo journalctl -u bugpin -f | lnav

Troubleshooting​

No Logs Appearing​

Docker:

# Check if container is running
docker compose ps

# Check log driver
docker inspect bugpin | grep LogConfig

# Check logs location
docker inspect bugpin | grep LogPath

systemd:

# Check service status
sudo systemctl status bugpin

# Check journal is running
sudo systemctl status systemd-journald

# Check disk space
df -h /var/log/

Log Files Too Large​

Docker:

# Add log rotation in docker-compose.yml
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

systemd:

# Limit journal size
sudo journalctl --vacuum-size=500M

Logs Missing Context​

Check LOG_LEVEL environment variable:

# Docker
docker compose exec bugpin env | grep LOG_LEVEL

# systemd
sudo systemctl show bugpin -p Environment

Set to debug for more details:

# Docker: Add to docker-compose.yml
environment:
- LOG_LEVEL=debug

# systemd: Add to bugpin.service
Environment=LOG_LEVEL=debug

We use cookies for analytics to improve our website. More information in our Privacy Policy.