Skip to main content

nulog

Fast, serverless logger built on Nu, for infinite-scale streams

Powered by Nu PyPI - Python Version PyPI Package


nulog demo

  • Append-only logs and metric series in one library.
  • Serverless and in-process - no daemon, no extra service to run.
  • Billions of entries per stream, reads stay fast at any size.
  • Live browser dashboard, zero setup.
  • Filter and sample any stream from the UI.

Installation

Requires Python 3.10+.

pip install nulog

Usage

Two flavors of the same store - pick whichever fits the call site.

Plain Python

import nulog

log = nulog.init("logs.db")  # `with nulog.init() as log:` works too.

log.info("server started", stream="app", extra={"port": 8080})
log.warning("cache miss", stream="app", extra={"key": "user:42"})
log.error("request failed", stream="app", extra={"path": "/checkout"})
log.observe("cpu_load", 0.42)

print(log.tail("app", 3))
print(log.sample("cpu_load", 10))

log.close()

Native Nu

import nu, nustd, nulog

app = nulog.getLogger("app")

tree = nu.With(nulog.store(),
    body=nustd.kv.Transaction(
        app.info("server started", extra={"port": 8080})
        >> app.warning("cache miss", extra={"key": "user:42"})
        >> app.error("request failed", extra={"path": "/checkout"})
        >> nulog.observe("cpu_load", 0.42),
    )
    >> nustd.kv.Snapshot(nu.print("tail:", nulog.messages.tail("app", 3)))
    >> nustd.kv.Snapshot(nu.print("cpu:", nulog.metrics.sample("cpu_load", 10))),
)

nu.run(tree)

Read atoms both flavors expose:

  • Messages: tail(stream, n), slice(stream, start, stop, step=1).
  • Metrics: range(name, begin_us, end_us), sample(name, n, begin_us=None, end_us=None).

Log rows: {"ts_us": int, "level": str, "msg": str, "fields": dict}. Metric rows: {"ts_us": int, "ts": float, "value": float}.

UI

A live browser dashboard: filter logs by stream, level, and text, and chart any metric over the last minute, five minutes, hour, and up. New streams and series show up on their own, no restart.

Open any nulog file

nulog view logs.db

Then open http://127.0.0.1:8080. Safe on a file another process is writing.

Serve alongside your Nu app

Add the viewer next to your writes - one process, one port:

import asyncio, nu, nulog

tree = nu.With(
    nulog.store("logs.db"),
    nulog.ui(port=8080),
    body=your_app_body,
)
asyncio.run(nu.arun(tree))

Metadata

Release files for nulog 0.1.8

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

Source distribution (sdist)

Source distribution for nulog 0.1.8
File Size Uploaded
nulog-0.1.8.tar.gz 35.0 kB Details

Built distribution (wheel)

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

Total release size: 68.3 kB

Release files / nulog-0.1.8.tar.gz

Download URL nulog-0.1.8.tar.gz
Size 35.0 kB
Tags Source
SHA-256 checksum
How to use checksums
169ed3452a3641af1a36e3abbb41b8257c2ce317fbaab9dd80db7a5d63211200
BLAKE2b-256 checksum
How to use checksums
805ef346f88c112c9aec6407c9b0feadd7f9956bc928d8de117862c04ba56387
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 15, 2026.

Transparency log

Release files / nulog-0.1.8-py3-none-any.whl

Download URL nulog-0.1.8-py3-none-any.whl
Size 33.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a20a0cb0a122ce397b9f90899567c7d4d54585b2d18055f4d00194bedd763f46
BLAKE2b-256 checksum
How to use checksums
d9ff3c64e41ffe35c4f656d89284fc5155ac1ad217b02cb0b0d1c60412e22d00
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 15, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.9

2 release files

This release

0.1.8 This release

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

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