Skip to main content

paperctl

PyPI Python Version License: MPL 2.0 CI

Download logs from SolarWinds Observability. Built with Typer, httpx, and Pydantic.

Installation

Using uv (recommended):

uv tool install paperctl

Or with pip:

pip install paperctl

From source:

git clone https://github.com/jwmossmoz/paperctl.git
cd paperctl
uv pip install -e .

Quick Start

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 -24h

Search logs across all hosts or a specific host:

paperctl search "error AND timeout" --since -1h
paperctl search --system web-1 "startup finished" --since -24h

List available hosts via the entities API:

paperctl entities list --type Host
paperctl entities list --name web-1 --output json

What It Does

  • 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 -1h and ISO timestamps
  • Outputs as text, JSON, or CSV

Migration From 1.x

Version 2.x is a breaking change:

  • Auth header changed from X-Papertrail-Token to Authorization: Bearer
  • API base URL changed from papertrailapp.com to SolarWinds Observability
  • systems/groups/archives commands were replaced by entities
  • PAPERTRAIL_API_TOKEN is only a legacy env-var alias now; the token itself must be valid for SWO

Commands

pull

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 filter

Examples:

paperctl pull web-1
paperctl pull vm-abc123 --since -24h
paperctl pull web-1,web-2 --output logs/

search

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 file

tail

Tail logs. This is currently an alias for search --follow.

entities

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-types

config

Manage configuration.

paperctl config show
paperctl config init

Configuration

Configuration is loaded from highest to lowest priority:

  1. CLI arguments
  2. SWO_API_TOKEN
  3. PAPERTRAIL_API_TOKEN as a legacy alias
  4. Local config: ./paperctl.toml
  5. Home config: ~/.paperctl.toml
  6. 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.0

Time Formats

Relative 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

Rate Limiting

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.

Development

# 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 install

License

Mozilla Public License 2.0 - see LICENSE for details.

Links

Author

Jonathan Moss (jmoss@mozilla.com)

Metadata

Release files for paperctl 2.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for paperctl 2.0.2
File Size Uploaded Provenance
paperctl-2.0.2.tar.gz 18.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for paperctl 2.0.2
File Interpreter ABI Platform
paperctl-2.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 47.2 kB

Release files / paperctl-2.0.2.tar.gz

Download URL paperctl-2.0.2.tar.gz
Size 18.1 kB
Tags Source
SHA-256 checksum
How to use checksums
99459c37ba4342b203adb4c3b48187d07e04237e17a957be1850a9e8fee26cad
BLAKE2b-256 checksum
How to use checksums
102b91db976b13ce14449990a963b25522a1efe269b8df2f5f9cec03e0da1f25
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 15, 2026.

Transparency log

Release files / paperctl-2.0.2-py3-none-any.whl

Download URL paperctl-2.0.2-py3-none-any.whl
Size 29.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
55e614f1a0a10b03a66dd594666a605a5068509fbe61c7275f3f5062194ba4ce
BLAKE2b-256 checksum
How to use checksums
ffd2fa028c50e009b3d37bf412ac2846c0373b2f1e18df92b9dd60c6bce0db19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 15, 2026.

Transparency log

Security for paperctl 2.0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for paperctl-2.0.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page