)]}'
{"oslo_log/_options.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71fd21b2c55d8de61d1a854fde109f695ec9625c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                    \u0027rate_limit_interval.\u0027),"},{"line_number":156,"context_line":"    cfg.StrOpt(\u0027rate_limit_except_level\u0027,"},{"line_number":157,"context_line":"               default\u003d\u0027CRITICAL\u0027,"},{"line_number":158,"context_line":"               help\u003d\u0027Log level name used by rate liming: CRITICAL, ERROR, \u0027"},{"line_number":159,"context_line":"                    \u0027INFO, WARNING, DEBUG or empty string. Logs with level \u0027"},{"line_number":160,"context_line":"                    \u0027greater or equal to rate_limit_except_level are not \u0027"},{"line_number":161,"context_line":"                    \u0027filtered. An empty string means that all levels are \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_f80aa578","line":158,"range":{"start_line":158,"start_character":49,"end_line":158,"end_character":55},"updated":"2016-06-02 13:21:04.000000000","message":"nit limiting","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"bc7cb9740f5c5b365592dec85f7b7ac9bcec4f9c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                    \u0027rate_limit_interval.\u0027),"},{"line_number":156,"context_line":"    cfg.StrOpt(\u0027rate_limit_except_level\u0027,"},{"line_number":157,"context_line":"               default\u003d\u0027CRITICAL\u0027,"},{"line_number":158,"context_line":"               help\u003d\u0027Log level name used by rate liming: CRITICAL, ERROR, \u0027"},{"line_number":159,"context_line":"                    \u0027INFO, WARNING, DEBUG or empty string. Logs with level \u0027"},{"line_number":160,"context_line":"                    \u0027greater or equal to rate_limit_except_level are not \u0027"},{"line_number":161,"context_line":"                    \u0027filtered. An empty string means that all levels are \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_9ef617d5","line":158,"range":{"start_line":158,"start_character":49,"end_line":158,"end_character":55},"in_reply_to":"9abb7d3a_f80aa578","updated":"2016-06-14 14:12:45.000000000","message":"Done","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"}],"oslo_log/rate_limit.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71fd21b2c55d8de61d1a854fde109f695ec9625c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self.counter \u003c\u003d self.burst:"},{"line_number":54,"context_line":"            return True"},{"line_number":55,"context_line":"        if self.emit_warn:"},{"line_number":56,"context_line":"            return True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        if self.counter \u003d\u003d self.burst + 1:"},{"line_number":59,"context_line":"            self.emit_warn \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_ca6b7984","line":56,"updated":"2016-06-02 13:21:04.000000000","message":"I don\u0027t get emit_warn? L58 is enough to protect you from issuing multiple warnings, unless you\u0027re worried about reentrance? In which case you need to take a local copy of self.counter and use a real lock","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"bc7cb9740f5c5b365592dec85f7b7ac9bcec4f9c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if self.counter \u003c\u003d self.burst:"},{"line_number":54,"context_line":"            return True"},{"line_number":55,"context_line":"        if self.emit_warn:"},{"line_number":56,"context_line":"            return True"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        if self.counter \u003d\u003d self.burst + 1:"},{"line_number":59,"context_line":"            self.emit_warn \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_feef5be6","line":56,"in_reply_to":"9abb7d3a_ca6b7984","updated":"2016-06-14 14:12:45.000000000","message":"emit_warm is requires to be able to log the warning emited below, since self.logger also uses this filter. I added a comment.","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71fd21b2c55d8de61d1a854fde109f695ec9625c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    \u0027INFO\u0027: logging.INFO,"},{"line_number":89,"context_line":"    \u0027WARNING\u0027: logging.WARNING,"},{"line_number":90,"context_line":"    \u0027DEBUG\u0027: logging.DEBUG,"},{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def install_filter(burst, interval, except_level\u003d\u0027CRITICAL\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_eabd9dd8","line":91,"updated":"2016-06-02 13:21:04.000000000","message":"can we get this from \u0027logging\u0027? What happens if TRACE makes a comeback?","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"bc7cb9740f5c5b365592dec85f7b7ac9bcec4f9c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    \u0027INFO\u0027: logging.INFO,"},{"line_number":89,"context_line":"    \u0027WARNING\u0027: logging.WARNING,"},{"line_number":90,"context_line":"    \u0027DEBUG\u0027: logging.DEBUG,"},{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def install_filter(burst, interval, except_level\u003d\u0027CRITICAL\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_1e94e734","line":91,"in_reply_to":"9abb7d3a_eabd9dd8","updated":"2016-06-14 14:12:45.000000000","message":"I failed to find such directionary from the logging module.\n\nI don\u0027t see the point of using except_level\u003d\u0027TRACE\u0027, since it\u0027s the lowest level. So it doesn\u0027t matter to put TRACE in this dictionary. If it really matters, it might be added later.\n\nI expect more except_level\u003d\u0027ERROR\u0027 at least.","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71fd21b2c55d8de61d1a854fde109f695ec9625c","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def install_filter(burst, interval, except_level\u003d\u0027CRITICAL\u0027):"},{"line_number":95,"context_line":"    \"\"\"Install a rate limit filter an existing and future loggers."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Limit logs to *burst* messages every *interval* seconds, except of levels"},{"line_number":98,"context_line":"    \u003e\u003d *except_level*. *except_level* is a log level name like \u0027CRITICAL\u0027. If"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_f8e625af","line":95,"range":{"start_line":95,"start_character":35,"end_line":95,"end_character":37},"updated":"2016-06-02 13:21:04.000000000","message":"nit on","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"bc7cb9740f5c5b365592dec85f7b7ac9bcec4f9c","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"def install_filter(burst, interval, except_level\u003d\u0027CRITICAL\u0027):"},{"line_number":95,"context_line":"    \"\"\"Install a rate limit filter an existing and future loggers."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    Limit logs to *burst* messages every *interval* seconds, except of levels"},{"line_number":98,"context_line":"    \u003e\u003d *except_level*. *except_level* is a log level name like \u0027CRITICAL\u0027. If"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_3eb8c3c7","line":95,"range":{"start_line":95,"start_character":35,"end_line":95,"end_character":37},"in_reply_to":"9abb7d3a_f8e625af","updated":"2016-06-14 14:12:45.000000000","message":"Done","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71fd21b2c55d8de61d1a854fde109f695ec9625c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            self.addFilter(log_filter)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":123,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # Setup our own logger class to automatically add the filter"},{"line_number":126,"context_line":"    # to new loggers."}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_4aaae986","line":123,"updated":"2016-06-02 13:21:04.000000000","message":"what if someone has already installed their own logger_class? Need to form a chain","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"bc7cb9740f5c5b365592dec85f7b7ac9bcec4f9c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            self.addFilter(log_filter)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":123,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    # Setup our own logger class to automatically add the filter"},{"line_number":126,"context_line":"    # to new loggers."}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_1ee227d5","line":123,"in_reply_to":"9abb7d3a_4aaae986","updated":"2016-06-14 14:12:45.000000000","message":"I changed the code to use the current logger class.","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"8ff9aa2900381351152815977d3cbce86ff1fb5b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    from monotonic import monotonic as monotonic_clock   # noqa"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class _LogRateLimit(logging.Filter):"},{"line_number":25,"context_line":"    def __init__(self, burst, interval, except_level\u003dNone):"},{"line_number":26,"context_line":"        logging.Filter.__init__(self)"},{"line_number":27,"context_line":"        self.burst \u003d burst"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_a00e4238","line":24,"updated":"2016-06-14 16:37:33.000000000","message":"I agree with making this a private class to start. Do you ever foresee making it public to allow deployers who use the logging config file to use it?","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2f59e866fc4e40bc403d79249adeb6c92d97b18b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    from monotonic import monotonic as monotonic_clock   # noqa"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class _LogRateLimit(logging.Filter):"},{"line_number":25,"context_line":"    def __init__(self, burst, interval, except_level\u003dNone):"},{"line_number":26,"context_line":"        logging.Filter.__init__(self)"},{"line_number":27,"context_line":"        self.burst \u003d burst"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_e8f5afed","line":24,"in_reply_to":"7aa08908_10f03d66","updated":"2016-06-15 09:56:23.000000000","message":"You can\u0027t apply filters from a logging config file: https://docs.python.org/2/library/logging.config.html?highlight\u003dlogging.config#configuration-file-format (see the note).","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7421077330d65d7783aee8435a5b0b8bca44cfba","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    from monotonic import monotonic as monotonic_clock   # noqa"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class _LogRateLimit(logging.Filter):"},{"line_number":25,"context_line":"    def __init__(self, burst, interval, except_level\u003dNone):"},{"line_number":26,"context_line":"        logging.Filter.__init__(self)"},{"line_number":27,"context_line":"        self.burst \u003d burst"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_10f03d66","line":24,"in_reply_to":"7aa08908_a00e4238","updated":"2016-06-14 20:09:28.000000000","message":"Sorry, I don\u0027t know the syntax of the logging configuration. I proposed to use oslo configuration options.\n\nThe technical issue is to register the filter before the creation of the first logger. install_filter() is a little bit ugly, but I wrote it to be able to call it anytime, especially after the creation of some loggers.\n\nIf using a different way to configure this logger fixes all issues, I would be very happy to make this class public and remove install_filter()!","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"18deaf09c09fd07b5779e8bcc9512d29450c0755","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class _LogRateLimit(logging.Filter):"},{"line_number":25,"context_line":"    def __init__(self, burst, interval, except_level\u003dNone):"},{"line_number":26,"context_line":"        logging.Filter.__init__(self)"},{"line_number":27,"context_line":"        self.burst \u003d burst"},{"line_number":28,"context_line":"        self.interval \u003d interval"},{"line_number":29,"context_line":"        self.except_level \u003d except_level"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_a52c1702","line":26,"updated":"2016-06-16 17:09:56.000000000","message":"Does this need to be a old-style __init__ call?","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"8ff9aa2900381351152815977d3cbce86ff1fb5b","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    log_filter \u003d _LogRateLimit(burst, interval, except_levelno)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":120,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    class RateLimitLogger(install_filter.logger_class):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_e3b7b437","line":119,"updated":"2016-06-14 16:37:33.000000000","message":"These two lines deserve comments about why you\u0027re storing values on this function.","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7421077330d65d7783aee8435a5b0b8bca44cfba","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    log_filter \u003d _LogRateLimit(burst, interval, except_levelno)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":120,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    class RateLimitLogger(install_filter.logger_class):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_b0f5e951","line":119,"in_reply_to":"7aa08908_e3b7b437","updated":"2016-06-14 20:09:28.000000000","message":"Hum, it\u0027s a way to \"hide\" global variables. Do you prefer a private global variable? I have no preference.","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"8ff9aa2900381351152815977d3cbce86ff1fb5b","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":120,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    class RateLimitLogger(install_filter.logger_class):"},{"line_number":123,"context_line":"        def __init__(self, *args, **kw):"},{"line_number":124,"context_line":"            logging.Logger.__init__(self, *args, **kw)"},{"line_number":125,"context_line":"            self.addFilter(log_filter)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_e36a1480","line":122,"updated":"2016-06-14 16:37:33.000000000","message":"Does every logger actually need its own rate limiter? Or is it sufficient to add the filter to the logger that has the handler? Because under our default configuration there should only be one of those, and with the filter class private we don\u0027t need to support using this filter from a configuration file.","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"9e10d3ef99c58fe3e33e0cf83ed88ddc04625ecd","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":120,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    class RateLimitLogger(install_filter.logger_class):"},{"line_number":123,"context_line":"        def __init__(self, *args, **kw):"},{"line_number":124,"context_line":"            logging.Logger.__init__(self, *args, **kw)"},{"line_number":125,"context_line":"            self.addFilter(log_filter)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_cbef26e7","line":122,"in_reply_to":"7aa08908_cb8e0678","updated":"2016-06-14 20:10:40.000000000","message":"Short example: the filter is not inherted by the child logger.\n\n  import logging\n  \n  class MyFilter(logging.Filter):\n      def filter(self, record):\n          print(\"filter!\", record)\n          return True\n  \n  log_filter \u003d MyFilter()\n  \n  root \u003d logging.getLogger()\n  root.addFilter(log_filter)\n  root.error(\"root\")\n  \n  child \u003d logging.getLogger(\u0027mod.sub\u0027)\n  child.error(\"child\")","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"2f59e866fc4e40bc403d79249adeb6c92d97b18b","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":120,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    class RateLimitLogger(install_filter.logger_class):"},{"line_number":123,"context_line":"        def __init__(self, *args, **kw):"},{"line_number":124,"context_line":"            logging.Logger.__init__(self, *args, **kw)"},{"line_number":125,"context_line":"            self.addFilter(log_filter)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_83ab2c75","line":122,"in_reply_to":"7aa08908_cbef26e7","updated":"2016-06-15 09:56:23.000000000","message":"Good find. I am aghast. How about we use this routine to apply a GlobalFilter, to which routines can be added? I\u0027d like some ordering on that, EG supply an int with each routine and higher numbers go later? SystemV style.","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"7421077330d65d7783aee8435a5b0b8bca44cfba","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    install_filter.log_filter \u003d log_filter"},{"line_number":120,"context_line":"    install_filter.logger_class \u003d logging.getLoggerClass()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    class RateLimitLogger(install_filter.logger_class):"},{"line_number":123,"context_line":"        def __init__(self, *args, **kw):"},{"line_number":124,"context_line":"            logging.Logger.__init__(self, *args, **kw)"},{"line_number":125,"context_line":"            self.addFilter(log_filter)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_cb8e0678","line":122,"in_reply_to":"7aa08908_e36a1480","updated":"2016-06-14 20:09:28.000000000","message":"I tried to put the filter only on the root logger, but it looks like filters are not \"inherited\" :-/\n\nI\u0027m not sure that this doc is accurate:\nhttps://docs.python.org/dev/library/logging.html#logging.Logger.propagate\n\n\"propate: (...) Messages are passed directly to the ancestor loggers’ handlers - neither the level nor filters of the ancestor loggers in question are considered.\"\n\nIt would be nice to not have to register a filter manually to all existing loggers and then have to register a custom logger class to install the filter on future new loggers...\n\nIt would be very happy to see a simpler method to implement that! But logging filters don\u0027t seem very well documented, nor widely used :-(","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"8ff9aa2900381351152815977d3cbce86ff1fb5b","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    for logger in _iter_loggers():"},{"line_number":133,"context_line":"        logger.addFilter(log_filter)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"install_filter.log_filter \u003d None"},{"line_number":136,"context_line":"install_filter.logger_class \u003d None"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa08908_839350a2","line":135,"updated":"2016-06-14 16:37:33.000000000","message":"These 2 lines also could use comments.","commit_id":"424c052005ccded7f1cc857c1ca9c0e5577cbb4f"}],"oslo_log/tests/unit/test_rate_limit.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71fd21b2c55d8de61d1a854fde109f695ec9625c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for handler in list(logger.handlers):"},{"line_number":41,"context_line":"            logger.removeHandler(handler)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # install our handler written logs into a StringIO"},{"line_number":44,"context_line":"        stream \u003d six.StringIO()"},{"line_number":45,"context_line":"        handler \u003d logging.StreamHandler(stream)"},{"line_number":46,"context_line":"        logger.addHandler(handler)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_8a25f10b","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":37},"updated":"2016-06-02 13:21:04.000000000","message":"nit writing","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"bc7cb9740f5c5b365592dec85f7b7ac9bcec4f9c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        for handler in list(logger.handlers):"},{"line_number":41,"context_line":"            logger.removeHandler(handler)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # install our handler written logs into a StringIO"},{"line_number":44,"context_line":"        stream \u003d six.StringIO()"},{"line_number":45,"context_line":"        handler \u003d logging.StreamHandler(stream)"},{"line_number":46,"context_line":"        logger.addHandler(handler)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_2bc36039","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":37},"in_reply_to":"9abb7d3a_8a25f10b","updated":"2016-06-14 14:12:45.000000000","message":"oops, fixed","commit_id":"e221bf5018073627f5118614c1b65defc6bf1f14"}]}
