{ "info": { "author": "podhmo", "author_email": "", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python", "Programming Language :: Python :: Implementation :: CPython" ], "description": "nejimaki\n========================================\n\n.. image:: https://travis-ci.org/podhmo/nejimaki.svg?branch=master\n :target: https://travis-ci.org/podhmo/nejimaki\n\n\ncontextual logging library, no patch, no logging module replacement\n\n\nfeatures\n----------------------------------------\n\n- structured logging\n- contextual logging (via `logger.bind`)\n- (no conflicts (stdlib's logging module))\n\nexample\n----------------------------------------\n\nmain.py\n\n.. code-block:: python\n\n from monokaki import basic_config, get_logger\n import logging\n \n logger = get_logger(__name__)\n \n \n def run(log):\n log.info(\"hello\")\n log.debug(\"hmm..\")\n \n \n def main():\n log = logger.bind(name=\"foo\")\n run(log)\n logger.info(\"bye\")\n \n # normal stdlib's logger\n normallogger = logging.getLogger(\"stdlib's\")\n normallogger.info(\"hai\")\n \n \n if __name__ == \"__main__\":\n import argparse\n parser = argparse.ArgumentParser()\n parser.add_argument(\n \"--logging\", choices=list(sorted(logging._nameToLevel.keys())), default=\"INFO\"\n )\n args = parser.parse_args()\n basic_config(level=logging._nameToLevel[args.logging])\n main()\n\n\n.. code-block:: bash\n\n $ python examples/readme/main.py\n {\"level\": \"INFO\", \"logger\": \"__main__\", \"msg\": \"hello\", \"name\": \"foo\", \"time\": \"2017-05-21 16:03:44,306\"}\n {\"level\": \"INFO\", \"logger\": \"__main__\", \"msg\": \"bye\", \"time\": \"2017-05-21 16:03:44,307\"}\n INFO:stdlib's:hai\n \n $ python examples/readme/main.py --logging=DEBUG\n {\"level\": \"INFO\", \"logger\": \"__main__\", \"msg\": \"hello\", \"name\": \"foo\", \"time\": \"2017-05-21 16:03:44,427\"}\n {\"level\": \"DEBUG\", \"logger\": \"__main__\", \"msg\": \"hmm..\", \"name\": \"foo\", \"time\": \"2017-05-21 16:03:44,427\"}\n {\"level\": \"INFO\", \"logger\": \"__main__\", \"msg\": \"bye\", \"time\": \"2017-05-21 16:03:44,428\"}\n INFO:stdlib's:hai\n \n\n\noutput customization\n----------------------------------------\n\nrenderer.py\n\n.. code-block:: python\n\n import json\n from collections import OrderedDict\n \n \n def ordered_json_render(data, record, formatter):\n kwargs = OrderedDict()\n # see: https://docs.python.org/3/library/logging.html#formatter-objects\n kwargs[\"time\"] = formatter.formatTime(record)\n \n # see: https://docs.python.org/3/library/logging.html#logrecord-attributes\n kwargs[\"level\"] = record.levelname\n kwargs[\"meg\"] = record.msg\n kwargs[\"caller\"] = \"{}:{}\".format(record.pathname, record.lineno)\n kwargs[\"source\"] = record.name\n \n # support exc_info or stack_info\n if \"stack\" in data:\n kwargs[\"stack\"] = data[\"stack\"]\n \n # extra data\n kwargs.update(record.kwargs)\n return json.dumps(kwargs, indent=2)\n\nmain.py\n\n.. code-block:: python\n\n from monokaki import get_logger, basic_config\n logger = get_logger(__name__)\n \n \n def main():\n logger.bind(name=\"foo\").info(\"hello\", age=20)\n logger.bind(name=\"foo\").info(\"bye\", age=21)\n \n \n if __name__ == \"__main__\":\n import logging\n from renderer import ordered_json_render\n basic_config(level=logging.INFO, renderer=ordered_json_render)\n main()\n\n\n.. code-block:: bash\n\n $ python examples/customize-renderer/main.py\n {\n \"time\": \"2017-05-21 16:03:44,645\",\n \"level\": \"INFO\",\n \"meg\": \"hello\",\n \"caller\": \"examples/customize-renderer/main.py:6\",\n \"source\": \"__main__\",\n \"name\": \"foo\",\n \"age\": 20\n }\n {\n \"time\": \"2017-05-21 16:03:44,646\",\n \"level\": \"INFO\",\n \"meg\": \"bye\",\n \"caller\": \"examples/customize-renderer/main.py:7\",\n \"source\": \"__main__\",\n \"name\": \"foo\",\n \"age\": 21\n }\n \n\n\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/podhmo/monokaki", "keywords": "logging structured-logging contextual-logging", "license": "", "maintainer": "", "maintainer_email": "", "name": "monokaki", "package_url": "https://pypi.org/project/monokaki/", "platform": "", "project_url": "https://pypi.org/project/monokaki/", "project_urls": { "Homepage": "https://github.com/podhmo/monokaki" }, "release_url": "https://pypi.org/project/monokaki/0.1.1/", "requires_dist": null, "requires_python": "", "summary": "contextual logging library, no patch, no logging module replacement", "version": "0.1.1" }, "last_serial": 2888477, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d456131f5daebf9cecbe3a8c7745519f", "sha256": "80ccd547bbdac706b3de65274591fc738a3eadc79ec4e0b05acca3e478318148" }, "downloads": -1, "filename": "monokaki-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d456131f5daebf9cecbe3a8c7745519f", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 5114, "upload_time": "2017-05-21T06:50:39", "url": "https://files.pythonhosted.org/packages/cc/97/a2a25e5e33e88378e71dbb81da457714556cb3ef81e6013bf285b0b5cea6/monokaki-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "511da66b1e6eb394a6920aca6d14ae5f", "sha256": "d866a65c5c14c7d7be71f1009c4ff9f2ea306ebc770c1d205f224556099ae86e" }, "downloads": -1, "filename": "monokaki-0.1.0.tar.gz", "has_sig": false, "md5_digest": "511da66b1e6eb394a6920aca6d14ae5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3317, "upload_time": "2017-05-21T06:50:36", "url": "https://files.pythonhosted.org/packages/20/e9/80dcb4f9d44ad36348f245bf6c9b195c67e59528363c5c09069854f88d53/monokaki-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "aa00e1626ec3098f91c04d8e964d90c9", "sha256": "a816e60581e167af8c5e6c0bccf60e76a56c003f0ae224bc97202df7592731dc" }, "downloads": -1, "filename": "monokaki-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa00e1626ec3098f91c04d8e964d90c9", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 5631, "upload_time": "2017-05-21T07:04:57", "url": "https://files.pythonhosted.org/packages/eb/6f/b54f3f5677ddbf751a464e49589a0a56900e0b33518109564f4e352e82b2/monokaki-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d08f027904f98a665ccf0a383f763660", "sha256": "4bb4ac182dbe8cb20b7ce1270e47d3393e6885e2d57b5a0f72e8314526638eb6" }, "downloads": -1, "filename": "monokaki-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d08f027904f98a665ccf0a383f763660", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3640, "upload_time": "2017-05-21T07:04:55", "url": "https://files.pythonhosted.org/packages/fd/76/52a8416b20863f3c2423fd338f5bcbe0d637b39220616d1356dca854acb9/monokaki-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aa00e1626ec3098f91c04d8e964d90c9", "sha256": "a816e60581e167af8c5e6c0bccf60e76a56c003f0ae224bc97202df7592731dc" }, "downloads": -1, "filename": "monokaki-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa00e1626ec3098f91c04d8e964d90c9", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 5631, "upload_time": "2017-05-21T07:04:57", "url": "https://files.pythonhosted.org/packages/eb/6f/b54f3f5677ddbf751a464e49589a0a56900e0b33518109564f4e352e82b2/monokaki-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d08f027904f98a665ccf0a383f763660", "sha256": "4bb4ac182dbe8cb20b7ce1270e47d3393e6885e2d57b5a0f72e8314526638eb6" }, "downloads": -1, "filename": "monokaki-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d08f027904f98a665ccf0a383f763660", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3640, "upload_time": "2017-05-21T07:04:55", "url": "https://files.pythonhosted.org/packages/fd/76/52a8416b20863f3c2423fd338f5bcbe0d637b39220616d1356dca854acb9/monokaki-0.1.1.tar.gz" } ] }