{ "info": { "author": "KeltonKarboviak", "author_email": "kelton.karboviak@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Topic :: System :: Logging" ], "description": "# slack_log_utils\n\n[![PyPI](https://img.shields.io/pypi/v/slack_log_utils.svg)](https://pypi.org/project/slack-log-utils/)\n[![PyPI](https://img.shields.io/pypi/l/slack_log_utils.svg)](https://pypi.org/project/slack-log-utils/)\n[![PyPI](https://img.shields.io/pypi/pyversions/slack_log_utils.svg)](https://pypi.org/project/slack-log-utils/)\n[![Build Status](https://img.shields.io/travis/KeltonKarboviak/slack_log_utils.svg?logo=travis)](https://travis-ci.org/KeltonKarboviak/slack_log_utils)\n[![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/KeltonKarboviak)\n\nA Python logging handler & formatter for Slack integration.\n\n### How To Install\nTo install slack-log-utils, simply:\n\n```bash\npip install slack-log-utils\n```\n\nor using [pipenv](https://docs.pipenv.org/):\n\n```bash\npipenv install slack-log-utils\n```\n\n\n### Getting Started\nGet an Incoming Webhook URL on [Slack](https://my.slack.com/services/new/incoming-webhook/).\n\nInstantiate manually:\n```python\nimport logging\nfrom slack_log_utils import SlackWebhookFormatter, SlackWebhookHandler\n\nformatter = SlackWebhookFormatter()\nhandler = SlackWebhookHandler('https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX')\nhandler.setFormatter(formatter)\nhandler.setLevel(logging.WARNING)\n\nlogger = logging.getLogger('sample_log')\nlogger.addHandler(handler)\n```\n\nInstantiate using the `logging.config.dictConfig` method:\n```python\nimport logging.config\nfrom slack_log_utils import SlackWebhookFormatter, SlackWebhookHandler\n\nlogging_config = {\n 'version': 1,\n 'formatters': {\n 'slack': {\n '()': SlackWebhookFormatter,\n },\n },\n 'handlers': {\n 'slack': {\n '()': SlackWebhookHandler,\n 'formatter': 'slack',\n 'level': logging.WARNING,\n 'url': 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX',\n },\n },\n 'loggers': {\n 'sample_log': {\n 'level': logging.DEBUG,\n 'handlers': ['slack'], \n },\n },\n}\n\nlogging.config.dictConfig(logging_config)\nlogger = logging.getLogger('sample_log')\n```\n\nRead more about logging configuration in the [Python docs](https://docs.python.org/3/library/logging.config.html).\n\nYou can then use it just like any logger:\n```python\nlogger.info('This will NOT post to Slack') # Since handler's level is set to WARNING\nlogger.error('This will post to Slack')\n\nlogger.error('[%s]: There are %s errors!', 'CRITICAL', 8)\n```\n\nBelow is the logic contained within `SlackWebhookFormatter` on how a logging.LogRecord is formatted: \n```python\nimport json \n\nformatted_msg = super(SlackWebhookFormatter, self).format(record)\n\ncolor = '#36a64f' \\ \n if record.levelno < logging.WARNING \\\n else '#ff0000'\n\nattachment = {\n 'author_name': record.name,\n 'title': getattr(record, 'title', ''),\n 'text': formatted_msg,\n 'fallback': formatted_msg,\n 'color': color,\n}\n\nreturn json.dumps({\n 'attachments': [attachment]\n})\n```\n\nFirst, it uses the `logging.Formatter`'s base `format()` method in order to get the %-style format string.\nThen, the color is decided based on the record's level. If it's less than `logging.WARNING`, it will be Green, else Red.\nThe `author_name` is set from `record.name` which is the name of the logger used to log the call ('sample_log' in this case).\nThe `title` is optionally set by using the key in the `extra` dict argument for the call to the logger:\n\n```python\nlogger.error('Sample Message Attachment!', extra={'title': 'Sample Title'})\n```\n\nAn example of what this will look like can be seen in the [Slack Message Builder](https://api.slack.com/docs/messages/builder?msg=%7B%22attachments%22%3A%5B%7B%22author_name%22%3A%22sample_log%22%2C%22title%22%3A%22Sample%20Title%22%2C%22text%22%3A%22Sample%20Message%20Attachment!%22%2C%22fallback%22%3A%22Sample%20Message%20Attachment!%22%2C%22color%22%3A%22%23ff0000%22%7D%5D%7D).\n\nPlease see the [Python LogRecord docs](https://docs.python.org/3/library/logging.html#logrecord-attributes) for the exact meaning of `record.levelno`, `record.name`, and other attrtibutes.\n\nFor further details on formatting messages, refer to the following Slack API pages:\n* [Message Formatting](https://api.slack.com/docs/message-formatting)\n* [Attachments](https://api.slack.com/docs/message-attachments)\n\nCurrently, all log messages will be sent as an attachment to Slack and it is only possible to send a single attachment at a time.\nFuture releases may make this more configurable.\n\n\n# Release Notes\n\n## 0.1.5 (2018-05-19)\n* Modified .travis.yml\n * Added skip_existing flag to deployments. This will stop parallel builds from failing (see [here](https://stackoverflow.com/questions/46387129/preventing-conflicts-when-deploying-multiple-distros-to-pypi-using-travis-ci)).\n * Made it so all branches will be built, but keeping that only tagged commits on master branch will be deployed to PyPI.\n* Updated README with badges from shields.io.\n\n## 0.1.4 (2018-05-19)\n* Modified .travis.yml to fix issue with Travis-CI skipping deployment although the commit was tagged (see [here](https://stackoverflow.com/questions/30156581/travis-ci-skipping-deployment-although-commit-is-tagged#31282158)).\n\n## 0.1.3 (2018-05-19)\n* Small code style change in slack_webhook_formatter.py.\n\n## 0.1.2 (2018-05-19)\n* Added .travis.yml file for Travis-CI builds.\n\n## 0.1.1 (2018-05-19)\n* Bumped version for README changes to show on PyPI.\n\n## 0.1.0 (2018-05-19)\n* First release on PyPI.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ngafid/slack-log-utils", "keywords": "logging slack slack-webhook", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "slack-log-utils", "package_url": "https://pypi.org/project/slack-log-utils/", "platform": "", "project_url": "https://pypi.org/project/slack-log-utils/", "project_urls": { "Homepage": "https://github.com/ngafid/slack-log-utils", "Say Thanks!": "https://saythanks.io/to/KeltonKarboviak" }, "release_url": "https://pypi.org/project/slack-log-utils/0.1.5/", "requires_dist": [ "requests (>=2.18.0)", "nose; extra == 'test'" ], "requires_python": "", "summary": "A Python logging handler for Slack integration", "version": "0.1.5" }, "last_serial": 3879850, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "5f58094123b4794fabd82e293c78b3be", "sha256": "3bfb1d6996f24e695474e7a8cd9f9216a25ff28c67138e1e363e726dddfb5656" }, "downloads": -1, "filename": "slack_log_utils-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5f58094123b4794fabd82e293c78b3be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 3776, "upload_time": "2018-05-19T18:37:43", "url": "https://files.pythonhosted.org/packages/d9/fb/7321c44e3ca4d53b04bc352eb91ba729b93c8a776b54c75c896d90044fa4/slack_log_utils-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ead1dd584d68306b406151f1d733472f", "sha256": "211d9809e921209ddbad6ceb481045790c7cf7d3bf9af3465a39284aae3683f6" }, "downloads": -1, "filename": "slack_log_utils-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ead1dd584d68306b406151f1d733472f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2311, "upload_time": "2018-05-19T18:37:44", "url": "https://files.pythonhosted.org/packages/b3/e9/4a29cda6c2c241ed7c3d3be71f823e70de7a7f06c0a3883237380cd53257/slack_log_utils-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6f43fbce8d3a74b33cdad01ff3741476", "sha256": "c0778c4b0ffc4c89438d392a53e832a9640e4b8462b16176459b74812d36f834" }, "downloads": -1, "filename": "slack_log_utils-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6f43fbce8d3a74b33cdad01ff3741476", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5230, "upload_time": "2018-05-19T18:43:12", "url": "https://files.pythonhosted.org/packages/86/7a/cacc9ccbc0da2d6438ae74eacc1dde1e71dc31ad0858bff73a95478d005e/slack_log_utils-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e76851074b0f7dd3f5700e6763d75f9c", "sha256": "db88a16807248b724258a2d0989327e65f598404af26e1553437f03eb137a6ed" }, "downloads": -1, "filename": "slack_log_utils-0.1.1.tar.gz", "has_sig": false, "md5_digest": "e76851074b0f7dd3f5700e6763d75f9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3970, "upload_time": "2018-05-19T18:43:13", "url": "https://files.pythonhosted.org/packages/da/7d/8cadb36373d2e31097efc124107a7004558c37cc9e2e23aa07c7a794e2de/slack_log_utils-0.1.1.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "20af07db198aed87a855377ce752abaa", "sha256": "cb0c55859d7c7344e0c55f9bac818285cee9cbb2f08d7ee006cdd0c5d40504a1" }, "downloads": -1, "filename": "slack_log_utils-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "20af07db198aed87a855377ce752abaa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5440, "upload_time": "2018-05-19T20:41:51", "url": "https://files.pythonhosted.org/packages/2c/3a/b73fb526e6745f05e0cd7e89181250b34502e528db9e3351858faeb45576/slack_log_utils-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ba8429f740776923e4db2d9d3e993bf", "sha256": "69d9d8c1de9450f1da6cc95ddbb26ad324113fc89d8778e290c1a53cd7e3496c" }, "downloads": -1, "filename": "slack_log_utils-0.1.4.tar.gz", "has_sig": false, "md5_digest": "2ba8429f740776923e4db2d9d3e993bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4185, "upload_time": "2018-05-19T20:41:52", "url": "https://files.pythonhosted.org/packages/ec/b5/2869783d248c0aad476e8de761f5c74a866c9a9be485df2e7018d41cd847/slack_log_utils-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "18dbeb33d43c7200fb6b9b9301d706c3", "sha256": "af8484dc75d2db4183c0e1e58119f725443761958a1c20ac39484d88c3aa83db" }, "downloads": -1, "filename": "slack_log_utils-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "18dbeb33d43c7200fb6b9b9301d706c3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5740, "upload_time": "2018-05-19T21:06:31", "url": "https://files.pythonhosted.org/packages/8d/40/577fb38069e01a6c05ff23fb166fedb2b4b3e2461b0ed8e140ea64e01871/slack_log_utils-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b24ed1d92effbd3f55591109c5a599c", "sha256": "dc003b49dde57ce1da09174cd55f9065769e1e368664e5f830404e139053195f" }, "downloads": -1, "filename": "slack_log_utils-0.1.5.tar.gz", "has_sig": false, "md5_digest": "2b24ed1d92effbd3f55591109c5a599c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4503, "upload_time": "2018-05-19T21:06:32", "url": "https://files.pythonhosted.org/packages/c8/7d/24c49112b671bcf2235402314043983f495686cd8aa73172147cee5b536b/slack_log_utils-0.1.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "18dbeb33d43c7200fb6b9b9301d706c3", "sha256": "af8484dc75d2db4183c0e1e58119f725443761958a1c20ac39484d88c3aa83db" }, "downloads": -1, "filename": "slack_log_utils-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "18dbeb33d43c7200fb6b9b9301d706c3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5740, "upload_time": "2018-05-19T21:06:31", "url": "https://files.pythonhosted.org/packages/8d/40/577fb38069e01a6c05ff23fb166fedb2b4b3e2461b0ed8e140ea64e01871/slack_log_utils-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b24ed1d92effbd3f55591109c5a599c", "sha256": "dc003b49dde57ce1da09174cd55f9065769e1e368664e5f830404e139053195f" }, "downloads": -1, "filename": "slack_log_utils-0.1.5.tar.gz", "has_sig": false, "md5_digest": "2b24ed1d92effbd3f55591109c5a599c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4503, "upload_time": "2018-05-19T21:06:32", "url": "https://files.pythonhosted.org/packages/c8/7d/24c49112b671bcf2235402314043983f495686cd8aa73172147cee5b536b/slack_log_utils-0.1.5.tar.gz" } ] }