{ "info": { "author": "Preston Landers", "author_email": "planders@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Apache Software License", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Logging" ], "description": "Overview\n========\nThis package provides an additional log handler for Python's standard logging\npackage (PEP 282). This handler will write log events to a log file which is\nrotated when the log file reaches a certain size. Multiple processes can\nsafely write to the same log file concurrently. Rotated logs can be gzipped\nif enabled. Both Windows and POSIX systems are supported. An optional threaded\nqueue logging handler is provided to perform logging in the background.\n\nThis is a fork from Lowell Alleman's version with updates for Windows and\nrecent versions of Python. It should be a drop-in replacement for users\nof the old version, except for changing the package name from\n`cloghandler` to `concurrent_log_handler`.\n\nDetails\n=======\n.. _portalocker: http://code.activestate.com/recipes/65203/\n\nThe ``ConcurrentRotatingFileHandler`` class is a drop-in replacement for\nPython's standard log handler ``RotatingFileHandler``. This module uses file\nlocking so that multiple processes can concurrently log to a single file without\ndropping or clobbering log events. This module provides a file rotation scheme\nlike with ``RotatingFileHanler``. Extra care is taken to ensure that logs\ncan be safely rotated before the rotation process is started. (This module works\naround the file rename issue with ``RotatingFileHandler`` on Windows, where a\nrotation failure means that all subsequent log events are dropped).\n\nThis module attempts to preserve log records at all cost. This means that log\nfiles will grow larger than the specified maximum (rotation) size. So if disk\nspace is tight, you may want to stick with ``RotatingFileHandler``, which will\nstrictly adhere to the maximum file size.\n\nIf you have multiple instances of a script (or multiple scripts) all running at\nthe same time and writing to the same log file, then *all* of the scripts should\nbe using ``ConcurrentRotatingFileHandler``. You should not attempt to mix\nand match ``RotatingFileHandler`` and ``ConcurrentRotatingFileHandler``.\n\nThis package bundles `portalocker`_ to deal with file locking.\n\nInstallation\n============\nUse the following command to download and install this package::\n\n pip install concurrent-log-handler\n\nIf you are installing from source, you can use::\n\n python setup.py install\n\n\nExamples\n========\n\nSimple Example\n--------------\nHere is a example demonstrating how to use this module directly (from within\nPython code)::\n\n from logging import getLogger, INFO\n from concurrent_log_handler import ConcurrentRotatingFileHandler\n import os\n\n log = getLogger()\n # Use an absolute path to prevent file rotation trouble.\n logfile = os.path.abspath(\"mylogfile.log\")\n # Rotate log after reaching 512K, keep 5 old copies.\n rotateHandler = ConcurrentRotatingFileHandler(logfile, \"a\", 512*1024, 5)\n log.addHandler(rotateHandler)\n log.setLevel(INFO)\n\n log.info(\"Here is a very exciting log message, just for you\")\n\n\nAutomatic fallback example\n--------------------------\nIf you are distributing your code and you are unsure if the\n`concurrent_log_handler` package has been installed everywhere your code will run,\nPython makes it easy to gracefully fallback to the built in\n`RotatingFileHandler`, here is an example::\n\n try:\n from concurrent_log_handler import ConcurrentRotatingFileHandler as RFHandler\n except ImportError:\n # Next 2 lines are optional: issue a warning to the user\n from warnings import warn\n warn(\"concurrent_log_handler package not installed. Using builtin log handler\")\n from logging.handlers import RotatingFileHandler as RFHandler\n\n log = getLogger()\n rotateHandler = RFHandler(\"/path/to/mylogfile.log\", \"a\", 1048576, 15)\n log.addHandler(rotateHandler)\n\n\n\nConfig file example\n-------------------\nThis example shows you how to use this log handler with the logging config file\nparser. This allows you to keep your logging configuration code separate from\nyour application code.\n\nExample config file: ``logging.ini``::\n\n [loggers]\n keys=root\n\n [handlers]\n keys=hand01\n\n [formatters]\n keys=form01\n\n [logger_root]\n level=NOTSET\n handlers=hand01\n\n [handler_hand01]\n class=handlers.ConcurrentRotatingFileHandler\n level=NOTSET\n formatter=form01\n args=(\"rotating.log\", \"a\", 512*1024, 5)\n\n [formatter_form01]\n format=%(asctime)s %(levelname)s %(message)s\n\nExample Python code: ``app.py``::\n\n import logging, logging.config\n import concurrent_log_handler\n\n logging.config.fileConfig(\"logging.ini\")\n log = logging.getLogger()\n log.info(\"Here is a very exciting log message, just for you\")\n\n\nChange Log\n==========\n- 0.9.16: Fix publishing issue with incorrect code included in the wheel\n Affects Python 2 mainly - see Issue #21\n\n- 0.9.15: Fix bug from last version on Python 2. (Issue #21) Thanks @condontrevor\n Also, on Python 2 and 3, apply unicode_error_policy (default: ignore) to convert\n a log message to the output stream's encoding. I.e., by default it will filter\n out (remove) any characters in a log message which cannot be converted to the\n output logfile's encoding.\n\n- 0.9.14: Fix writing LF line endings on Windows when encoding is specified.\n Added newline and terminator kwargs to allow customizing line ending behavior.\n Thanks to @vashek\n\n- 0.9.13: Fixes Crashes with ValueError: I/O operation on closed file (issue #16)\n Also should fix issue #13 with crashes related to Windows file locking.\n Big thanks to @terencehonles, @nsmcan, @wkoot, @dismine for doing the hard parts\n\n- 0.9.12: Add umask option (thanks to @blakehilliard)\n This adds the ability to control the permission flags when creating log files.\n\n- 0.9.11: Fix issues with gzip compression option (use buffering)\n\n- 0.9.10: Fix inadvertent lock sharing when forking\n Thanks to @eriktews for this fix\n\n- 0.9.9: Fix Python 2 compatibility broken in last release\n\n- 0.9.8: Bug fixes and permission features\n * Fix for issue #4 - AttributeError: 'NoneType' object has no attribute 'write'\n This error could be caused if a rollover occurred inside a logging statement\n that was generated from within another logging statement's format() call.\n * Fix for PyWin32 dependency specification (explicitly require PyWin32)\n * Ability to specify owner and permissions (mode) of rollover files [Unix only]\n\n- 0.9.7 / 0.9.6: Fix platform specifier for PyPi\n\n- 0.9.5: Add `use_gzip` option to compress rotated logs. Add an optional threaded\nlogging queue handler based on the standard library's `logging.QueueHandler`.\n\n- 0.9.4: Fix setup.py to not include tests in distribution.\n\n- 0.9.3: Refactoring release\n * For publishing fork on pypi as `concurrent-log-handler` under new package name.\n * NOTE: PyWin32 is required on Windows but is not an explicit dependency because\n the PyWin32 package is not currently installable through pip.\n * Fix lock behavior / race condition\n\n- 0.9.2: Initial release of fork by Preston Landers.\n * Fixes deadlocking issue with recent versions of Python\n * Puts `.__` prefix in front of lock file name\n * Use `secrets` or `SystemRandom` if available.\n * Add/fix Windows support\n\n.. _Red Hat Bug #858912: https://bugzilla.redhat.com/show_bug.cgi?id=858912\n.. _Python Bug #15960: http://bugs.python.org/issue15960\n.. _LP Bug 1199332: https://bugs.launchpad.net/python-concurrent-log-handler/+bug/1199332\n.. _LP Bug 1199333: https://bugs.launchpad.net/python-concurrent-log-handler/+bug/1199333\n\n\n- 0.9.1: Bug fixes - `LP Bug 1199332`_ and `LP Bug 1199333`_.\n * More gracefully handle out of disk space scenarios. Prevent release() from\n throwing an exception.\n * Handle logging.shutdown() in Python 2.7+. Close the lock file stream via\n close().\n * Big thanks to Dan Callaghan for forwarding these issues and patches.\n\n- 0.9.0: Now requires Python 2.6+\n * Revamp file opening/closing and file-locking internals (inspired by\n feedback from Vinay Sajip.)\n * Add the 'delay' parameter (delayed log file opening) to better match the\n core logging functionality in more recent version of Python.\n * For anyone still using Python 2.3-2.5, please use the latest 0.8.x release\n\n- 0.8.6: Fixed packaging bug with test script\n * Fix a small packaging bug from the 0.8.5 release. (Thanks to Bj\u00f6rn H\u00e4user\n for bringing this to my attention.)\n * Updated stresstest.py to always use the correct python version when\n launching sub-processes instead of the system's default \"python\".\n\n- 0.8.5: Fixed ValueError: I/O operation on closed file\n * Thanks to Vince Carney, Arif Kasim, Matt Drew, Nick Coghlan, and\n Dan Callaghan for bug reports. Bugs can now be filled here:\n https://bugs.launchpad.net/python-concurrent-log-handler. Bugs resolved\n `Red Hat Bug #858912`_ and `Python Bug #15960`_\n * Updated ez_setup.py to 0.7.7\n * Updated portalocker to 0.3 (now maintained by Rick van Hattem)\n * Initial Python 3 support (needs more testing)\n * Fixed minor spelling mistakes\n\n- 0.8.4: Fixed lock-file naming issue\n * Resolved a minor issue where lock-files would be improperly named if the\n log file contained \".log\" in the middle of the log name. For example, if\n you log file was \"/var/log/mycompany.logging.mysource.log\", the lock file\n would be named \"/var/log/mycompany.ging.mysource.lock\", which is not correct.\n Thanks to Dirk Rothe for pointing this out. Since this introduce a slight\n lock-file behavior difference, make sure all concurrent writers are updated\n to 0.8.4 at the same time if this issue effects you.\n * Updated ez_setup.py to 0.6c11\n\n- 0.8.3: Fixed a log file rotation bug and updated docs\n * Fixed a bug that happens after log rotation when multiple processes are\n witting to the same log file. Each process ends up writing to their own\n log file (\"log.1\" or \"log.2\" instead of \"log\"). The fix is simply to reopen\n the log file and check the size again. I do not believe this bug results in\n data loss; however, this certainly was not the desired behavior. (A big\n thanks goes to Oliver Tonnhofer for finding, documenting, and providing a\n patch for this bug.)\n * Cleanup the docs. (aka \"the page you are reading right now\") I fixed some\n silly mistakes and typos... who writes this stuff?\n\n- 0.8.2: Minor bug fix release (again)\n * Found and resolved another issue with older logging packages that do not\n support encoding.\n\n- 0.8.1: Minor bug fix release\n * Now importing \"codecs\" directly; I found some slight differences in the\n logging module in different Python 2.4.x releases that caused the module to\n fail to load.\n\n- 0.8.0: Minor feature release\n * Add better support for using ``logging.config.fileConfig()``. This class\n is now available using ``class=handlers.ConcurrentRotatingFileHandler``.\n * Minor changes in how the ``filename`` parameter is handled when given a\n relative path.\n\n- 0.7.4: Minor bug fix\n * Fixed a typo in the package description (incorrect class name)\n * Added a change log; which you are reading now.\n * Fixed the ``close()`` method to no longer assume that stream is still\n open.\n\nTo-do\n=====\n* This module has had minimal testing in a multi-threaded process. I see no\n reason why this should be an issue, but no stress-testing has been done in a\n threaded situation. If this is important to you, you could always add\n threading support to the ``stresstest.py`` script and send me the patch.\n\n* Update: this works in a multi-process concurrency environment but I have\n not tested it extensively with threads or async, but that should be handled\n by the parent logging class.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Preston-Landers/concurrent-log-handler", "keywords": "logging,windows,linux,unix,rotate,QueueHandler,QueueListener,portalocker", "license": "http://www.apache.org/licenses/LICENSE-2.0", "maintainer": "", "maintainer_email": "", "name": "concurrent-log-handler", "package_url": "https://pypi.org/project/concurrent-log-handler/", "platform": "", "project_url": "https://pypi.org/project/concurrent-log-handler/", "project_urls": { "Homepage": "https://github.com/Preston-Landers/concurrent-log-handler" }, "release_url": "https://pypi.org/project/concurrent-log-handler/0.9.16/", "requires_dist": null, "requires_python": "", "summary": "RotatingFileHandler replacement with concurrency, gzip and Windows support", "version": "0.9.16" }, "last_serial": 5240523, "releases": { "0.9.10": [ { "comment_text": "", "digests": { "md5": "6fdbbea6bbd105385809283e7b6a4298", "sha256": "11140c9f9c9624b866a329061fe7464b67e305fa6f3950bf169c3d5295661020" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6fdbbea6bbd105385809283e7b6a4298", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41412, "upload_time": "2018-07-01T15:08:52", "url": "https://files.pythonhosted.org/packages/78/13/e0eda46760b8bb46f33b1cb3723e6b36d728489139fbeacf4e4c4a47bb09/concurrent_log_handler-0.9.10-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afbf9ad2078bc52eecd5e2d1c3c39ea0", "sha256": "9bfe63e06fa17d02d8bc29883b720e14d9a532735955423ad52a86951ff0a322" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.10.tar.gz", "has_sig": false, "md5_digest": "afbf9ad2078bc52eecd5e2d1c3c39ea0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22810, "upload_time": "2018-07-01T15:08:40", "url": "https://files.pythonhosted.org/packages/b0/fc/f8390abd12a46de0158fd492a152d556fefcef038d686c7726d36dbbb7e8/concurrent-log-handler-0.9.10.tar.gz" } ], "0.9.11": [ { "comment_text": "", "digests": { "md5": "190fb88021d039ee4e773d6b0f06c7b5", "sha256": "904fdc731545435e7ede3080f76adbe0e6c52edfe3310aff0675086de8bd754c" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "190fb88021d039ee4e773d6b0f06c7b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41526, "upload_time": "2018-07-01T20:43:05", "url": "https://files.pythonhosted.org/packages/74/40/b3b6a0859d6d167d9bb282f7c320e15a5e13b8f96a6028b177e294894f72/concurrent_log_handler-0.9.11-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "037a850abd7ede5e713a0878408a099d", "sha256": "b9dcc70f7905460886d5f4a4996b1e920875a9964ba2b4daa0953f50a5c08b06" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.11.tar.gz", "has_sig": false, "md5_digest": "037a850abd7ede5e713a0878408a099d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22885, "upload_time": "2018-07-01T20:42:53", "url": "https://files.pythonhosted.org/packages/f0/67/b9198abb3424b75f25232c7b473f252a212f21df2f4c933a7f058dfb6a85/concurrent-log-handler-0.9.11.tar.gz" } ], "0.9.12": [ { "comment_text": "", "digests": { "md5": "3b318704ee8cb13e239f6e699bf5a675", "sha256": "ba870eeeccdde7c83537e156c71707c78e63aa9d82f68bac41340af18b9e194e" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.12-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3b318704ee8cb13e239f6e699bf5a675", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41884, "upload_time": "2018-08-11T15:30:32", "url": "https://files.pythonhosted.org/packages/b5/70/dfea3952f48b63457bb17fc63761628446914d72bdc5c888b8ebe21b18d0/concurrent_log_handler-0.9.12-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "23cb7601d30c0350c98c30e916b9a23f", "sha256": "dc3eb523b3080001edc3b61dc4114a2e7d84d6859cd8303dcd87c80ce0d269cc" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.12.tar.gz", "has_sig": false, "md5_digest": "23cb7601d30c0350c98c30e916b9a23f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23294, "upload_time": "2018-08-11T15:30:53", "url": "https://files.pythonhosted.org/packages/e4/3e/08f79eb6ccd06e2947cc4df09b34ab2f0f5bc21fdd2ee329d29d6bc10f67/concurrent-log-handler-0.9.12.tar.gz" } ], "0.9.13": [ { "comment_text": "", "digests": { "md5": "94663c4018092464248613b35b7801c6", "sha256": "6ea2b332b14ac46be01bd46b113d13d7692345fc6193cf2b593d80a1a61b0643" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.13-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "94663c4018092464248613b35b7801c6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32412, "upload_time": "2019-04-28T19:18:57", "url": "https://files.pythonhosted.org/packages/c8/15/94591c7e73317fc4d5ca2ad375725f71e316152f5fa479707c0105661c15/concurrent_log_handler-0.9.13-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c5b99183851d3e64ae5395d3b41b8b4a", "sha256": "f8a0681d95fe5742884a54e000f57c86d67f9757da0f5d60082e4b0999a1059b" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.13.tar.gz", "has_sig": false, "md5_digest": "c5b99183851d3e64ae5395d3b41b8b4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19888, "upload_time": "2019-04-28T19:18:36", "url": "https://files.pythonhosted.org/packages/23/2f/88c152f2721ea6b27f53def79b86cdc1947c0a107ef4af233ab7c1bfc38b/concurrent-log-handler-0.9.13.tar.gz" } ], "0.9.14": [ { "comment_text": "", "digests": { "md5": "e1bb4d6466dde10bb2ead17125bb53cc", "sha256": "4dbd79814bb49cbfdf52a921ab2e80fa3bd8f476e736ba545889c5665da1ee7b" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.14-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e1bb4d6466dde10bb2ead17125bb53cc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 32702, "upload_time": "2019-04-29T22:08:26", "url": "https://files.pythonhosted.org/packages/ce/fe/74e97fa937eb4c8252035712e7e3f9d33318424b9cb3edf49ac7c47fb2f0/concurrent_log_handler-0.9.14-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9284bada8fe88cf37cdfbe44b3825201", "sha256": "4e1d2349ace4664060a0e9a6c2cdebb14000e37afd13d3fb2036598de698d6de" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.14.tar.gz", "has_sig": false, "md5_digest": "9284bada8fe88cf37cdfbe44b3825201", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20169, "upload_time": "2019-04-29T22:08:10", "url": "https://files.pythonhosted.org/packages/71/f1/b00c3a3491fcd4336174e1896f23cfb1a1bb6a1e05eb45d7dc05bcc2da61/concurrent-log-handler-0.9.14.tar.gz" } ], "0.9.15": [ { "comment_text": "", "digests": { "md5": "fcfe8ab7303779e002cca538c704cea6", "sha256": "e3d16000b1f521fa4446568a4d44e33e02750c4e3830d4de1d1bff24f074bcc4" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.15-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fcfe8ab7303779e002cca538c704cea6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 34603, "upload_time": "2019-05-06T00:55:57", "url": "https://files.pythonhosted.org/packages/e5/6e/e0689ae9aa2376095c9e4e84f96b769e312987696f491f7ff16efa92faae/concurrent_log_handler-0.9.15-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "01f364731636d1a36912e7784a4429b2", "sha256": "6c34576b20086cd8d5022c7f3ef02070217356223bd5698ecb4f6f35a8f3af40" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.15.tar.gz", "has_sig": false, "md5_digest": "01f364731636d1a36912e7784a4429b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21098, "upload_time": "2019-05-06T00:55:44", "url": "https://files.pythonhosted.org/packages/e7/85/c805ac9043a292b419cfa20dd3b914428c7078866ed4148df7238d01d333/concurrent-log-handler-0.9.15.tar.gz" } ], "0.9.16": [ { "comment_text": "", "digests": { "md5": "34b8845aabdb4ec4a200563feeadd7dc", "sha256": "1a42eab8648ca038eeeb948abc7d63baf15e8adbf9bee591f977f19e14b43724" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.16-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "34b8845aabdb4ec4a200563feeadd7dc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19730, "upload_time": "2019-05-07T22:37:40", "url": "https://files.pythonhosted.org/packages/c1/56/4c0b70a529840267861fa82d83715db77778403222d889b9f9b4a7f33d2c/concurrent_log_handler-0.9.16-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e745dee1603a3ff5185b7ec8088b5939", "sha256": "189dd29542b8431e26a0484ae0f3735bd2f4330e26742cc48f7d2fddff8eb94e" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.16.tar.gz", "has_sig": false, "md5_digest": "e745dee1603a3ff5185b7ec8088b5939", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21186, "upload_time": "2019-05-07T22:37:11", "url": "https://files.pythonhosted.org/packages/0b/ad/b793abfa02315fdb70cc1fcfd0fde2eccdf991580be53c9aeabf8c12af25/concurrent-log-handler-0.9.16.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "bba88ce39c4d9d982001f1f251ae5dfa", "sha256": "9df53e9918d3b7118134c49e057ed1404f8336075714d70f3b705ec736c28f8b" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bba88ce39c4d9d982001f1f251ae5dfa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 46547, "upload_time": "2017-07-26T15:23:52", "url": "https://files.pythonhosted.org/packages/b9/2b/ba68a813c3701efd74e03d575206b80b54e5f9c4bc91d3519da24ec28913/concurrent_log_handler-0.9.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e9acae866a51261768534561ec0a2612", "sha256": "b3af17f86d1b20b60fe861a162f6ba570b99cc9d7abf8628cb6b6370a5d53077" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.3.tar.gz", "has_sig": false, "md5_digest": "e9acae866a51261768534561ec0a2612", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26269, "upload_time": "2017-07-26T15:26:44", "url": "https://files.pythonhosted.org/packages/c8/37/a2ac8fadb99cac718e26311782cf20e5f89370afe4ec3431c8f25a65e9dd/concurrent-log-handler-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "cef87286bff461a935bd9ce8d6e5859f", "sha256": "b0430f27f78d825a1aa021e48d521653261cf7fc50d769b1d0c4885983d011cb" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cef87286bff461a935bd9ce8d6e5859f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 37313, "upload_time": "2017-07-26T15:40:07", "url": "https://files.pythonhosted.org/packages/03/46/edcf76314717908b447d782aa9da47e485a6b04281a5957e482b811c6b62/concurrent_log_handler-0.9.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3b07efc3c053067014c54e9f6a2e7605", "sha256": "98b9b1a3193e830599a0aa721968561373e89f0532cfcea055d7aa88580cb123" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.4.tar.gz", "has_sig": false, "md5_digest": "3b07efc3c053067014c54e9f6a2e7605", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26342, "upload_time": "2017-07-26T15:40:09", "url": "https://files.pythonhosted.org/packages/4c/c1/fae64aacfd945af555152a1dc728360489b5c05e642c19d9b63a1442be2a/concurrent-log-handler-0.9.4.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "28bb2951b76cba026401e531d5fe1626", "sha256": "4c8df24dbfd0fed7ea67abc63433a2669c6151b3c7fe8fdd0191a0b4f8878a13" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "28bb2951b76cba026401e531d5fe1626", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41111, "upload_time": "2017-07-29T18:00:51", "url": "https://files.pythonhosted.org/packages/e9/70/1c064e24421a6f2d6865473b32f532aa36f0671991005b0c792c346efb70/concurrent_log_handler-0.9.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bab17740b2248f42934196125d5f655c", "sha256": "8cefd167862d91de0e5bf75019313d823c7e0bf3d6667f7a89469c7997c89246" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.6.tar.gz", "has_sig": false, "md5_digest": "bab17740b2248f42934196125d5f655c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28996, "upload_time": "2017-07-29T18:00:52", "url": "https://files.pythonhosted.org/packages/9d/cb/4418adb09886273b59817fe64472621ae87934ba09cd4dfee4eb961dba93/concurrent-log-handler-0.9.6.tar.gz" } ], "0.9.7": [ { "comment_text": "", "digests": { "md5": "c0502b0d55a63cec8fd834de2b1eb3bf", "sha256": "ded88c14b6c3f7bd698277bfa89b8204ec513cc43c971dc03249a8ff62dd358c" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c0502b0d55a63cec8fd834de2b1eb3bf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41156, "upload_time": "2017-07-29T18:08:55", "url": "https://files.pythonhosted.org/packages/53/4d/28e7bd6953501d9207c5949fa97778d1657fa840a4f8137f0e4d785b0023/concurrent_log_handler-0.9.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4eaa388a1028f29161b785a06e67f52a", "sha256": "7870fb87ffa1aa919e3cf961728ed8731d0ef8ff6692fa6a811000060140444e" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.7.tar.gz", "has_sig": false, "md5_digest": "4eaa388a1028f29161b785a06e67f52a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29049, "upload_time": "2017-07-29T18:08:56", "url": "https://files.pythonhosted.org/packages/7d/09/c86b9104c771047e603898ab56319627260f397c286bc735e421e5ee3219/concurrent-log-handler-0.9.7.tar.gz" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "02fa6fd99118c5051da623ee9fd3b299", "sha256": "b660292c0fb588fe9bcc6b9811e86daf5cf27991cc6ee7a7a3eacf4c3b08ec9f" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "02fa6fd99118c5051da623ee9fd3b299", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41644, "upload_time": "2018-03-02T17:46:11", "url": "https://files.pythonhosted.org/packages/43/57/83cf3f600bc9957e8e901e244375e8ea803044689d2f6098a4ea430c2f46/concurrent_log_handler-0.9.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12c78973689d10cabc6161f35dfff94e", "sha256": "d81a109852d1df2b698875cd4942ea3809eea18cd5a312580d08236df7b4a48f" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.8.tar.gz", "has_sig": false, "md5_digest": "12c78973689d10cabc6161f35dfff94e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22573, "upload_time": "2018-03-02T17:45:56", "url": "https://files.pythonhosted.org/packages/bf/3a/07ebc8acc1ffc846503a2fe97d18b98a38083af20a09bd66cf546dabacfe/concurrent-log-handler-0.9.8.tar.gz" } ], "0.9.9": [ { "comment_text": "", "digests": { "md5": "9d103da0c667c4cd5b3bef45c92d0cfe", "sha256": "bc7bace6e2074772af9ab70f1a145829b5490b0313266acb5f731c5d6dd6c2c7" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9d103da0c667c4cd5b3bef45c92d0cfe", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41719, "upload_time": "2018-03-10T15:39:07", "url": "https://files.pythonhosted.org/packages/4d/c2/53a56a1fcf48cd540a0663acf33915bbc69154042b581746d0bbe9c7fd66/concurrent_log_handler-0.9.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "de7da01720cc8eafff52d725086aa7bc", "sha256": "6b3dd389e71bc29c5a02e5fdfa1b5bedf7856f6ce5797217955ca2858193c713" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.9.tar.gz", "has_sig": false, "md5_digest": "de7da01720cc8eafff52d725086aa7bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22643, "upload_time": "2018-03-10T15:38:52", "url": "https://files.pythonhosted.org/packages/38/d9/96a24fa043315293ae1adf73eafc7e58afe1e98c51641aeb3ee54d5beeff/concurrent-log-handler-0.9.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "34b8845aabdb4ec4a200563feeadd7dc", "sha256": "1a42eab8648ca038eeeb948abc7d63baf15e8adbf9bee591f977f19e14b43724" }, "downloads": -1, "filename": "concurrent_log_handler-0.9.16-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "34b8845aabdb4ec4a200563feeadd7dc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19730, "upload_time": "2019-05-07T22:37:40", "url": "https://files.pythonhosted.org/packages/c1/56/4c0b70a529840267861fa82d83715db77778403222d889b9f9b4a7f33d2c/concurrent_log_handler-0.9.16-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e745dee1603a3ff5185b7ec8088b5939", "sha256": "189dd29542b8431e26a0484ae0f3735bd2f4330e26742cc48f7d2fddff8eb94e" }, "downloads": -1, "filename": "concurrent-log-handler-0.9.16.tar.gz", "has_sig": false, "md5_digest": "e745dee1603a3ff5185b7ec8088b5939", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21186, "upload_time": "2019-05-07T22:37:11", "url": "https://files.pythonhosted.org/packages/0b/ad/b793abfa02315fdb70cc1fcfd0fde2eccdf991580be53c9aeabf8c12af25/concurrent-log-handler-0.9.16.tar.gz" } ] }