Skip to main content

contextual logging library, no patch, no logging module replacement

Project description

https://travis-ci.org/podhmo/nejimaki.svg?branch=master

contextual logging library, no patch, no logging module replacement

features

  • structured logging

  • contextual logging (via logger.bind)

  • (no conflicts (stdlib’s logging module))

example

main.py

from monokaki import basic_config, get_logger
import logging

logger = get_logger(__name__)


def run(log):
    log.info("hello")
    log.debug("hmm..")


def main():
    log = logger.bind(name="foo")
    run(log)
    logger.info("bye")

    # normal stdlib's logger
    normallogger = logging.getLogger("stdlib's")
    normallogger.info("hai")


if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--logging", choices=list(sorted(logging._nameToLevel.keys())), default="INFO"
    )
    args = parser.parse_args()
    basic_config(level=logging._nameToLevel[args.logging])
    main()
$ python examples/readme/main.py
{"level": "INFO", "logger": "__main__", "msg": "hello", "name": "foo", "time": "2017-05-21 16:03:44,306"}
{"level": "INFO", "logger": "__main__", "msg": "bye", "time": "2017-05-21 16:03:44,307"}
INFO:stdlib's:hai

$ python examples/readme/main.py --logging=DEBUG
{"level": "INFO", "logger": "__main__", "msg": "hello", "name": "foo", "time": "2017-05-21 16:03:44,427"}
{"level": "DEBUG", "logger": "__main__", "msg": "hmm..", "name": "foo", "time": "2017-05-21 16:03:44,427"}
{"level": "INFO", "logger": "__main__", "msg": "bye", "time": "2017-05-21 16:03:44,428"}
INFO:stdlib's:hai

output customization

renderer.py

import json
from collections import OrderedDict


def ordered_json_render(data, record, formatter):
    kwargs = OrderedDict()
    # see: https://docs.python.org/3/library/logging.html#formatter-objects
    kwargs["time"] = formatter.formatTime(record)

    # see: https://docs.python.org/3/library/logging.html#logrecord-attributes
    kwargs["level"] = record.levelname
    kwargs["meg"] = record.msg
    kwargs["caller"] = "{}:{}".format(record.pathname, record.lineno)
    kwargs["source"] = record.name

    # support exc_info or stack_info
    if "stack" in data:
        kwargs["stack"] = data["stack"]

    # extra data
    kwargs.update(record.kwargs)
    return json.dumps(kwargs, indent=2)

main.py

from monokaki import get_logger, basic_config
logger = get_logger(__name__)


def main():
    logger.bind(name="foo").info("hello", age=20)
    logger.bind(name="foo").info("bye", age=21)


if __name__ == "__main__":
    import logging
    from renderer import ordered_json_render
    basic_config(level=logging.INFO, renderer=ordered_json_render)
    main()
$ python examples/customize-renderer/main.py
{
  "time": "2017-05-21 16:03:44,645",
  "level": "INFO",
  "meg": "hello",
  "caller": "examples/customize-renderer/main.py:6",
  "source": "__main__",
  "name": "foo",
  "age": 20
}
{
  "time": "2017-05-21 16:03:44,646",
  "level": "INFO",
  "meg": "bye",
  "caller": "examples/customize-renderer/main.py:7",
  "source": "__main__",
  "name": "foo",
  "age": 21
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

monokaki-0.1.1.tar.gz (3.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

monokaki-0.1.1-py2.py3-none-any.whl (5.6 kB view details)

Uploaded Python 2Python 3

File details

Details for the file monokaki-0.1.1.tar.gz.

File metadata

  • Download URL: monokaki-0.1.1.tar.gz
  • Upload date:
  • Size: 3.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for monokaki-0.1.1.tar.gz
Algorithm Hash digest
SHA256 4bb4ac182dbe8cb20b7ce1270e47d3393e6885e2d57b5a0f72e8314526638eb6
MD5 d08f027904f98a665ccf0a383f763660
BLAKE2b-256 fd7652a8416b20863f3c2423fd338f5bcbe0d637b39220616d1356dca854acb9

See more details on using hashes here.

File details

Details for the file monokaki-0.1.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for monokaki-0.1.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 a816e60581e167af8c5e6c0bccf60e76a56c003f0ae224bc97202df7592731dc
MD5 aa00e1626ec3098f91c04d8e964d90c9
BLAKE2b-256 eb6fb54f3f5677ddbf751a464e49589a0a56900e0b33518109564f4e352e82b2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page