# tiny-json-log
Compact and easy to use json logging lib
## Usage
To write logs in json simply pass an instance of `JSONFormatter` class to your handler
```
import logging
from tiny_json_log import JSONFormatter
#You can use any other handler
#for example FileHandler
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
#Here we use root logger but
#you can use any logger you wish
root = logging.getLogger()
root.addHandler(handler)
root.setLevel("INFO")
root.info("informative message")
```
this will print to stderr
```
{"severity": "INFO", "logger": "root", "message": "informative message"}
```
## Json message
If your message string is in json format, library will convert it to json and nest it under `message` key
```
import logging
import json
import uuid
from tiny_json_log import JSONFormatter
log_dict = {
"src": "module.some_class",
"userid": f"{uuid.uuid4()}",
"nested": {
"some_nested_attr": 123
}
}
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
root = logging.getLogger()
root.addHandler(handler)
root.setLevel("DEBUG")
root.info(json.dumps(log_dict))
```
this will print to stderr something like
```
{"severity": "INFO", "logger": "root", "message": {"src": "module.some_class", "userid": "32b8bf63-3958-4caa-b566-a500c898e429", "nested": {"some_nested_attr": 123}}}
```
you can also pass `merge_message=True` to `JSONFormatter` constructor and it will merge you JSON message with other logRecord attributes
```
import logging
import json
import uuid
from tiny_json_log import JSONFormatter
log_dict = {
"src": "module.some_class",
"userid": f"{uuid.uuid4()}",
"nested": {
"some_nested_attr": 123
}
}
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter(merge_message=True))
root = logging.getLogger()
root.addHandler(handler)
root.setLevel("DEBUG")
root.info(json.dumps(log_dict))
```
will print
```
{"severity": "INFO", "logger": "root", "src": "module.some_class", "userid": "f10a8b6a-86c1-4280-8685-421ceea58811", "nested": {"some_nested_attr": 123}}
```
## Formatting
You can also pass a format string to control what [logRecord attributes](https://docs.python.org/3/library/logging.html#logrecord-attributes) are printed. Format string is a space separated list of logRecord attrs enclosed in `{}`. For example
```
import logging
from tiny_json_log import JSONFormatter
fmt = "{levelname} {message} {name}"
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter(fmt))
root = logging.getLogger()
root.addHandler(handler)
root.setLevel("DEBUG")
root.error("informative message")
```
this will print to stderr
```
{"levelname": "ERROR", "message": "informative message", "name": "root"}
```
By default log key names are equal to logRecord attribute names. You can change this behaviour by specifing `<custom attr key>={<some logRecord attr>}` for example
```
import logging
import sys
from tiny_json_log import JSONFormatter
fmt = "lvl={levelname} {message} logger={name}"
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(JSONFormatter(fmt))
root = logging.getLogger()
root.addHandler(handler)
root.setLevel("DEBUG")
root.info("informative message")
```
this will print to stdout
```
{"lvl": "INFO", "message": "informative message", "logger": "root"}
```
**Default format string is** `severity={levelname} logger={name} {message}`
Raw data
{
"_id": null,
"home_page": "https://github.com/ggramal/tiny-json-log",
"name": "tiny-json-log",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": null,
"author": "gramal",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/7a/27/b2312c97b7f2fb1314f6bc6b0f39b8283d209b3cf5650eb9f4c5d192c8c9/tiny_json_log-0.1.0.tar.gz",
"platform": null,
"description": "# tiny-json-log\n\nCompact and easy to use json logging lib\n\n## Usage\n\nTo write logs in json simply pass an instance of `JSONFormatter` class to your handler\n\n\n```\nimport logging\nfrom tiny_json_log import JSONFormatter\n\n#You can use any other handler \n#for example FileHandler\nhandler = logging.StreamHandler()\nhandler.setFormatter(JSONFormatter())\n\n#Here we use root logger but\n#you can use any logger you wish\nroot = logging.getLogger()\nroot.addHandler(handler)\nroot.setLevel(\"INFO\")\n\nroot.info(\"informative message\")\n```\n\nthis will print to stderr\n\n```\n{\"severity\": \"INFO\", \"logger\": \"root\", \"message\": \"informative message\"}\n\n```\n\n## Json message\n\nIf your message string is in json format, library will convert it to json and nest it under `message` key\n\n```\nimport logging\nimport json\nimport uuid\nfrom tiny_json_log import JSONFormatter\n\nlog_dict = {\n \"src\": \"module.some_class\",\n \"userid\": f\"{uuid.uuid4()}\",\n \"nested\": {\n \"some_nested_attr\": 123\n }\n}\n\nhandler = logging.StreamHandler()\nhandler.setFormatter(JSONFormatter())\nroot = logging.getLogger()\nroot.addHandler(handler)\nroot.setLevel(\"DEBUG\")\n\nroot.info(json.dumps(log_dict))\n```\n\nthis will print to stderr something like\n\n```\n{\"severity\": \"INFO\", \"logger\": \"root\", \"message\": {\"src\": \"module.some_class\", \"userid\": \"32b8bf63-3958-4caa-b566-a500c898e429\", \"nested\": {\"some_nested_attr\": 123}}}\n```\n\nyou can also pass `merge_message=True` to `JSONFormatter` constructor and it will merge you JSON message with other logRecord attributes\n\n```\nimport logging\nimport json\nimport uuid\nfrom tiny_json_log import JSONFormatter\n\nlog_dict = {\n \"src\": \"module.some_class\",\n \"userid\": f\"{uuid.uuid4()}\",\n \"nested\": {\n \"some_nested_attr\": 123\n }\n}\n\nhandler = logging.StreamHandler()\nhandler.setFormatter(JSONFormatter(merge_message=True))\nroot = logging.getLogger()\nroot.addHandler(handler)\nroot.setLevel(\"DEBUG\")\n\nroot.info(json.dumps(log_dict))\n```\n\nwill print\n\n```\n{\"severity\": \"INFO\", \"logger\": \"root\", \"src\": \"module.some_class\", \"userid\": \"f10a8b6a-86c1-4280-8685-421ceea58811\", \"nested\": {\"some_nested_attr\": 123}}\n```\n\n## Formatting \n\nYou can also pass a format string to control what [logRecord attributes](https://docs.python.org/3/library/logging.html#logrecord-attributes) are printed. Format string is a space separated list of logRecord attrs enclosed in `{}`. For example \n\n\n```\nimport logging\nfrom tiny_json_log import JSONFormatter\n\n\nfmt = \"{levelname} {message} {name}\" \n\nhandler = logging.StreamHandler()\nhandler.setFormatter(JSONFormatter(fmt))\n\nroot = logging.getLogger()\nroot.addHandler(handler)\nroot.setLevel(\"DEBUG\")\n\nroot.error(\"informative message\")\n```\n\nthis will print to stderr\n\n```\n{\"levelname\": \"ERROR\", \"message\": \"informative message\", \"name\": \"root\"}\n```\n\nBy default log key names are equal to logRecord attribute names. You can change this behaviour by specifing `<custom attr key>={<some logRecord attr>}` for example\n\n```\nimport logging\nimport sys\nfrom tiny_json_log import JSONFormatter\n\n\nfmt = \"lvl={levelname} {message} logger={name}\"\n\nhandler = logging.StreamHandler(sys.stdout)\nhandler.setFormatter(JSONFormatter(fmt))\n\nroot = logging.getLogger()\nroot.addHandler(handler)\nroot.setLevel(\"DEBUG\")\n\nroot.info(\"informative message\")\n```\n\nthis will print to stdout\n\n```\n{\"lvl\": \"INFO\", \"message\": \"informative message\", \"logger\": \"root\"}\n```\n\n**Default format string is** `severity={levelname} logger={name} {message}`\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Compact/easy to use json formatter",
"version": "0.1.0",
"project_urls": {
"Homepage": "https://github.com/ggramal/tiny-json-log",
"Repository": "https://github.com/ggramal/tiny-json-log"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7514dae80f8f66c011e32d869203d9a8a87016e2ccab1271ed41cb39e7078694",
"md5": "e18cfd05f4d81c95b3762d9cf7ec8403",
"sha256": "fe1a4e9b56d83c14b45ba0ae18bdd811b202de91cf7c388fc777d9aad6bbde46"
},
"downloads": -1,
"filename": "tiny_json_log-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e18cfd05f4d81c95b3762d9cf7ec8403",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 4619,
"upload_time": "2024-08-23T14:40:47",
"upload_time_iso_8601": "2024-08-23T14:40:47.194302Z",
"url": "https://files.pythonhosted.org/packages/75/14/dae80f8f66c011e32d869203d9a8a87016e2ccab1271ed41cb39e7078694/tiny_json_log-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7a27b2312c97b7f2fb1314f6bc6b0f39b8283d209b3cf5650eb9f4c5d192c8c9",
"md5": "55307c8513324b0c4d06a6542e797bfc",
"sha256": "c3cf1ae8ab119461cd4db801d7c8957707b1a0e51845cc1c74f1a48224550314"
},
"downloads": -1,
"filename": "tiny_json_log-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "55307c8513324b0c4d06a6542e797bfc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 4166,
"upload_time": "2024-08-23T14:40:48",
"upload_time_iso_8601": "2024-08-23T14:40:48.707772Z",
"url": "https://files.pythonhosted.org/packages/7a/27/b2312c97b7f2fb1314f6bc6b0f39b8283d209b3cf5650eb9f4c5d192c8c9/tiny_json_log-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-08-23 14:40:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ggramal",
"github_project": "tiny-json-log",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "tiny-json-log"
}