Metadata-Version: 2.0
Name: scopedlog
Version: 0.1.3
Summary: library for scoped logging on top of structlog (or similar sinks)
Home-page: https://github.com/kshpytsya/scopedlog
Author: Kyrylo Shpytsya
Author-email: kshpitsa@gmail.com
License: MIT
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Requires-Python: >=3.6, <=3.7
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
Provides-Extra: structlog
Provides-Extra: structlog
Requires-Dist: structlog (<19,>=18.1.0); extra == 'structlog'

[![linux test status](https://img.shields.io/travis/kshpytsya/scopedlog.svg?label=Linux)](https://travis-ci.org/kshpytsya/scopedlog)

# scopedlog
A library for scoped logging on top of [structlog](http://www.structlog.org) (or similar sinks), inspired by the idea of an apparently defunct [lithoxyl](https://github.com/mahmoud/lithoxyl). Note that I ([kshpytsya](https://github.com/kshpytsya)) have deliberatly not looked into actual lithoxyl's implementation to keep a fresh mind.

Here is an example:

```python
import contextlib                                                                                                                         import structlog
import structlog.stdlib
import structlog.dev
import structlog.processors
import scopedlog
import scopedlog.sink_structlog
import scopedlog.idgen_seq

structlog.configure(processors=[
    structlog.stdlib.add_log_level,
    structlog.processors.ExceptionPrettyPrinter(),
    structlog.dev.ConsoleRenderer()
])

slog = scopedlog.ScopedLog(
    sink=scopedlog.sink_structlog.StructlogSink(structlog.get_logger()),
    id_gen=scopedlog.idgen_seq.GlobalSeqScopeIdGenenerator()
)

with contextlib.suppress(RuntimeError):
    with slog.info("scope1", k1=1) as sl:
        sl.debug("state1", k2=2, k3=3)
        sl.info("state1", k4=4)
        sl.warn("state1", k5=5)
        raise RuntimeError("bad one")

with contextlib.suppress(RuntimeError):
    with slog.debug("scope2", k1=1) as sl:
        sl.debug("state1", k2=2, k3=3)
        sl.info("state1", k4=4)
        sl.warn("state1", k5=5)
        raise RuntimeError("bad too ;)")

with slog.debug("scope3") as sl:
    sl.fail()

with slog.debug("scope4") as sl:
    sl.exit_kw["k1"] = 1
```
And expected output:
![](https://scopedlog-screenshot.surge.sh/scopedlog-screenshot.png)

See [tests](tests) for more examples.


