Download logs from SolarWinds Observability. Built with Typer, httpx, and Pydantic.
Using uv (recommended):
uv tool install paperctlOr with pip:
pip install paperctlFrom source:
git clone https://github.com/jwmossmoz/paperctl.git
cd paperctl
uv pip install -e .paperctl 2.x talks to the SolarWinds Observability logs API.
Set your API token:
export SWO_API_TOKEN="your_token_here"For easier upgrades from 1.x, PAPERTRAIL_API_TOKEN is also accepted as a legacy
environment-variable alias. The token itself still needs to be valid for the SWO API.
Pull logs from a single host:
paperctl pull web-1
paperctl pull web-1 --output logs.txt
paperctl pull web-1 --since -24hSearch logs across all hosts or a specific host:
paperctl search "error AND timeout" --since -1h
paperctl search --system web-1 "startup finished" --since -24hList available hosts via the entities API:
paperctl entities list --type Host
paperctl entities list --name web-1 --output json- Queries SolarWinds Observability logs with automatic pagination
- Pulls logs from one or more hosts, with parallel downloads for multi-host pulls
- Resolves partial hostnames such as Taskcluster VM IDs
- Parses relative times like
-1hand ISO timestamps - Outputs as text, JSON, or CSV
Version 2.x is a breaking change:
- Auth header changed from
X-Papertrail-TokentoAuthorization: Bearer - API base URL changed from
papertrailapp.comto SolarWinds Observability systems/groups/archivescommands were replaced byentitiesPAPERTRAIL_API_TOKENis only a legacy env-var alias now; the token itself must be valid for SWO
Download logs from one or more hosts.
paperctl pull <system>[,<system>...] [OPTIONS]
Arguments:
<system> System name(s), comma-separated
Options:
-o, --output PATH Output file (single system) or directory (multiple)
--since TEXT Start time (default: all logs)
--until TEXT End time (default: now)
-f, --format TEXT Output format: text|json|csv (default: text)
-q, --query TEXT Search query filterExamples:
paperctl pull web-1
paperctl pull vm-abc123 --since -24h
paperctl pull web-1,web-2 --output logs/Search logs with optional host filtering.
paperctl search [QUERY] [OPTIONS]
Options:
-s, --system TEXT Filter by system name
--since TEXT Start time
--until TEXT End time
-n, --limit INTEGER Maximum events
-o, --output TEXT Output format
-F, --file PATH Write output to fileTail logs. This is currently an alias for search --follow.
List and inspect entities such as hosts.
paperctl entities list
paperctl entities list --type Host --output json
paperctl entities show <entity-id>
paperctl entities list-typesManage configuration.
paperctl config show
paperctl config initConfiguration is loaded from highest to lowest priority:
- CLI arguments
SWO_API_TOKENPAPERTRAIL_API_TOKENas a legacy alias- Local config:
./paperctl.toml - Home config:
~/.paperctl.toml - XDG config:
~/.config/paperctl/config.toml
Create ~/.paperctl.toml:
api_token = "your_token_here"
api_url = "https://api.na-01.cloud.solarwinds.com"
timeout = 30.0Relative times:
-1h,-30m,-7d(ago)1h,2d(future)
Natural language:
1 hour ago,2 days ago
ISO 8601:
2024-01-01T00:00:00Z
Special:
now
Papertrail's API allows 25 requests per 5 seconds. When pulling from multiple systems, paperctl automatically:
- Runs downloads in parallel
- Tracks requests across all systems
- Throttles to stay under the limit
- Retries with backoff on 429 errors
You don't need to worry about rate limits or pagination. Just specify what you want and paperctl handles the rest.
# Install with dev dependencies
uv pip install -e ".[dev]"
# Run tests
uv run pytest
# Run linters
uv run ruff check .
uv run mypy src
# Format code
uv run ruff format .
# Build package
uv build
# Install pre-commit hooks
uv run prek installMozilla Public License 2.0 - see LICENSE for details.
- GitHub: https://github.com/jwmossmoz/paperctl
- PyPI: https://pypi.org/project/paperctl/
- SolarWinds Observability: https://documentation.solarwinds.com/en/success_center/observability/default.htm
Jonathan Moss (jmoss@mozilla.com)