Get started with VirtualLog

Subscribe, deploy to your AWS account, and start shipping logs in under 30 minutes.

Not ready to deploy? Play with a live instance first at demo.virtuallog.io — no AWS account required.

Subscribe on AWS Marketplace

Open the VirtualLog listing on AWS Marketplace, click Continue to Subscribe, and accept the offer.

The Free plan is free forever, and the Enterprise plan is free throughout 2026 — no credit card required. After you accept, AWS redirects you to our registration page to kick off the deployment.

Register and launch the CloudFormation stack

On the registration page at app.virtuallog.io/aws-marketplace/register, enter the email address you want tied to this VirtualLog deployment. We use it to send you a Launch Stack URL, pre-populated with your customer ID and a provisioning key.

Click the button; AWS CloudFormation opens in your account with the template pre-filled. Keep the default stack name (virtuallog) and click through to create the stack.

One stack deploys everything VirtualLog needs — VPC, OpenSearch, S3 archive bucket, ECS Fargate service, Network Load Balancer, DynamoDB, and IAM roles. Typical deploy time is around 15 minutes, most of it spent on the OpenSearch domain.

Note

Deleting this stack deletes your logs. If you need to redeploy without losing data, reach out to support@virtuallog.io — a split-stack option that retains data is on the roadmap.

Open VirtualLog from the CloudFormation Outputs

Once the stack finishes, that’s where your VirtualLog URL lives — it’s easy to miss on the first deploy.

  1. Open the AWS Console and go to CloudFormation → Stacks.
  2. Select your virtuallog stack.
  3. Switch to the Outputs tab.
  4. Copy the NLBEndpoint value. It’s an AWS load balancer DNS name, looking like virtuallog-nlb-abc123.elb.eu-central-1.amazonaws.com.

Open that endpoint in a browser as http://<NLBEndpoint> (the default stack uses a plain HTTP listener; you’ll add TLS in the custom domain step — coming soon). You’ll land on the VirtualLog sign-in screen.

Sign in with the built-in admin account:

Username: admin
Password: admin
Warning

Change the admin password immediately after your first sign-in. The default credentials are identical for every fresh install.

Create an API key

API keys authenticate log ingestion and (optionally) read access. To create one, open Settings → API Keys in the sidebar, then click Create API Key.

Give the key a name you’ll recognise (for example my-app-prod) and pick a role:

  • INGESTION — can push logs only. Best for application code.
  • READ_ONLY — can query logs only. Good for dashboards or exporters.
  • FULL — can read and write. Use sparingly.

Click Create. VirtualLog shows the full key exactly once — it starts with vl_ followed by 64 hex characters.

Warning

Copy the key now and store it somewhere safe (a secrets manager, your CI vault, etc.). Once you close the dialog, only the prefix is displayed in the API Keys list — the full value is never shown again.

Send your first log

Logs are sent to POST /logs on your VirtualLog endpoint. Authenticate with your API key in the x-api-key header, and put a JSON object (or an array of them for a batch) in the body.

Using curl:

curl -X POST http://<your-nlb-endpoint>/logs \
  -H "Content-Type: application/json" \
  -H "x-api-key: vl_your_api_key_here" \
  -d '{
    "level": "info",
    "message": "Hello, VirtualLog!",
    "service": "getting-started",
    "userId": "user-42"
  }'

A successful request returns HTTP 201 with a JSON body like { "status": "success", "count": 1 }.

What the payload can contain:

  • Any JSON object. level, message, and timestamp are the conventional fields but not enforced.
  • Every other field is stored and becomes a filterable attribute in the Search UI.
  • To send a batch, post a JSON array: [{ … }, { … }]. The whole request is limited to 6 MB.

The same endpoint from Node.js:

await fetch(`${process.env.VIRTUALLOG_URL}/logs`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": process.env.VIRTUALLOG_API_KEY,
  },
  body: JSON.stringify({
    level: "info",
    message: "Hello, VirtualLog!",
    service: "getting-started",
  }),
});

…and from Python:

import os, requests

requests.post(
    f"{os.environ['VIRTUALLOG_URL']}/logs",
    headers={"x-api-key": os.environ["VIRTUALLOG_API_KEY"]},
    json={
        "level": "info",
        "message": "Hello, VirtualLog!",
        "service": "getting-started",
    },
)

View your log in the Search UI

Go back to VirtualLog and open the Search page (the home page). You should see the log you just sent, within a second or two.

The layout:

  • Chart at the top — a bar per bucket with event counts. Click any bar to zoom in; drag to box-select a custom range.
  • Logs table below the chart. Columns: timestamp, level (colour-coded), message. Click any row to expand the full JSON payload.
  • Attributes and Values panels on the left. Pick a field (for example service), then pick a value to add it as a filter.

Use the time-range picker at the top of the page to scope the view: 10m, 1h, 1d, 7d, or a custom range. Active filters appear as removable chips just below the search bar.

That’s it — you’re up and running. Wire the same POST /logs call into your application, your CI, or a log shipper, and the logs will show up here as they arrive.

Next steps

Configure a custom domain

Put VirtualLog behind logs.yourcompany.com instead of the raw NLB hostname.

Coming soon

Play with the demo

Explore filtering, charts, and expanded log rows against a live VirtualLog.

Get in touch

Stuck on deployment or have a question we didn’t cover here? Email support@virtuallog.io.