The same observability contract in Node.js, Python and .NET
Not three libraries that look alike. One specification, implemented idiomatically in each language — and proven by the same test fixture running in all of them.
Your stack speaks three languages. Your logs speak three dialects.
A request crosses your Node gateway, your Python worker and your .NET service.
Three loggers. Three ways of masking a credit card. Three names for the same correlation id. Three answers to “what happens when the log sink goes down”.
Correlating that request means reconciling three different truths — by hand, at 3 a.m., while someone waits.
SyntropyLog
Declarative PII masking, context that survives async boundaries, and a logging path that never throws — in the languages your stack already uses.
| Language | Package | Version | Notes |
|---|---|---|---|
| Node.js | syntropylog · npm | 2.1.0 | Native Rust engine |
| Python | slpy-log · PyPI | 2.0.0 | CPython 3.7+ · optional Rust engine |
| .NET | sl4n · NuGet | 1.1.0 | net8.0 · Native AOT |
| Java | — | — | In development |
How we think about observability
Four decisions that are already in the code. They are why the implementations agree — and why, where they don't, they don't by choice.
The logging path never throws
If your logger can crash your request handler, it is not an observability tool — it is a new failure mode. A failure goes to a hook and a counter. Never to your caller.
A masking strategy is data, not code
Adding a strategy shouldn't mean writing the same function in four languages. It is a spec the engine interprets — which is why the output can be identical everywhere.
Wire names belong to your services, not to us
Your gateway calls it x-request-id and the legacy service calls it X-Correlation. Each service declares its own map and the id survives the translation. Headers don't have to agree.
Parity is proven by a test, not by a document
The same seventeen masking cases — literally the same file, byte for byte — run in the Node, Python and Java suites. If an implementation drifts, its build turns red.
Start with your language
Install it, and the defaults already mask passwords, tokens, emails and card numbers.
Node.js
npm install syntropylogPython
pip install slpy-log.NET
dotnet add package sl4nEvery implementation is Apache 2.0 and has zero required runtime dependencies.
Built by developers, for developers
Our passion is solving real problems. We build high-quality software with a strong commitment to open source and to the community.
Open source commitment
- Permissive license:Everything we publish is licensed under Apache 2.0.
- Contributions welcome:We believe in the power of collaboration.
- Support us on GitHub:A star on our repositories helps us grow.
Other ways to support
Star on GitHub
Help more developers discover SyntropyLog.
Go to GitHubReport Issues
Help improve the project by reporting bugs or suggestions.
View IssuesShare
Share SyntropyLog with your team and community.
Share on X