From 44565f624a63ded04df36e2ff1c09a3f1d924d8b Mon Sep 17 00:00:00 2001 From: Kevin Glisson Date: Mon, 12 Feb 2018 17:41:45 -0800 Subject: [PATCH 1/2] Adding support for child loggers --- docs/breadcrumbs.rst | 4 +--- hooks/pre-commit.flake8 | 46 -------------------------------------- raven/breadcrumbs.py | 20 ++++++++++++++--- tests/breadcrumbs/tests.py | 33 +++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 52 deletions(-) delete mode 100755 hooks/pre-commit.flake8 diff --git a/docs/breadcrumbs.rst b/docs/breadcrumbs.rst index 642005dcb..c8ffa18d4 100644 --- a/docs/breadcrumbs.rst +++ b/docs/breadcrumbs.rst @@ -60,9 +60,7 @@ the :py:func:`~raven.breadcrumbs.ignore_logger` and with given arguments: `logger`, `level`, `msg`, `args` and `kwargs` which are the values passed to the logging system. If the callback returns true value the default handling is disabled. Only one callback - can be registered per one logger name. Logger tree is not traversed - so calling this method with `spammy_module` argument will not silence - messages from `spammy_module.child`. + can be registered per one logger name. Typically it makes sense to invoke :py:func:`~raven.breadcrumbs.record` from it unless you want to silence diff --git a/hooks/pre-commit.flake8 b/hooks/pre-commit.flake8 deleted file mode 100755 index 7abe558e4..000000000 --- a/hooks/pre-commit.flake8 +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -import glob -import os -import sys - -os.environ['PYFLAKES_NODOCTEST'] = '1' - -# pycodestyle.py uses sys.argv to find setup.cfg -sys.argv = [os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)] - -# git usurbs your bin path for hooks and will always run system python -if 'VIRTUAL_ENV' in os.environ: - site_packages = glob.glob( - '%s/lib/*/site-packages' % os.environ['VIRTUAL_ENV'])[0] - sys.path.insert(0, site_packages) - - -def main(): - from flake8.main import USER_CONFIG - from flake8.engine import get_style_guide - from flake8.hooks import run - - gitcmd = "git diff-index --cached --name-only HEAD" - - _, files_modified, _ = run(gitcmd) - - try: - text_type = unicode - except NameError: - text_type = str - - files_modified = [text_type(x) for x in files_modified] - - # remove non-py files and files which no longer exist - files_modified = filter( - lambda x: x.endswith('.py') and os.path.exists(x), - files_modified) - - flake8_style = get_style_guide(parse_argv=True, config_file=USER_CONFIG) - report = flake8_style.check_files(files_modified) - - return report.total_errors - -if __name__ == '__main__': - sys.exit(main()) diff --git a/raven/breadcrumbs.py b/raven/breadcrumbs.py index 13987f133..33b4ed8d3 100644 --- a/raven/breadcrumbs.py +++ b/raven/breadcrumbs.py @@ -257,6 +257,17 @@ def install_logging_hook(): _patch_logger() +def resolve_child_loggers(name): + """Resolves children logger. Resolution will only work for loggers + that are registered before this function is called. + """ + children = [] + for n in logging.Logger.manager.loggerDict.keys(): + if n.startswith(name): + children.append(n) + return children + + def ignore_logger(name_or_logger, allow_level=None): """Ignores a logger during breadcrumb recording. """ @@ -273,14 +284,17 @@ def register_special_log_handler(name_or_logger, callback): with given arguments: `logger`, `level`, `msg`, `args` and `kwargs` which are the values passed to the logging system. If the callback returns true value the default handling is disabled. Only one callback - can be registered per one logger name. Logger tree is not traversed - so calling this method with `spammy_module` argument will not silence - messages from `spammy_module.child`. + can be registered per one logger name. """ if isinstance(name_or_logger, string_types): name = name_or_logger else: name = name_or_logger.name + + for c in resolve_child_loggers(name): + special_logger_handlers[c] = callback + + # always add parent logger special_logger_handlers[name] = callback diff --git a/tests/breadcrumbs/tests.py b/tests/breadcrumbs/tests.py index da291e5bd..b48515b33 100644 --- a/tests/breadcrumbs/tests.py +++ b/tests/breadcrumbs/tests.py @@ -152,6 +152,39 @@ def handler(logger, level, msg, args, kwargs): crumbs = client.context.breadcrumbs.get_buffer() assert len(crumbs) == 0 + # test child resolution + name = __name__ + logger = logging.getLogger(name) + + def handler(logger, level, msg, args, kwargs): + assert logger.name == name + assert msg == 'aha!' + return True + + breadcrumbs.register_special_log_handler(name, handler) + + client = Client('http://foo:bar@example.com/0') + with client.context: + logger.debug('aha!') + crumbs = client.context.breadcrumbs.get_buffer() + assert len(crumbs) == 0 + + logger = logging.getLogger('superspecial') + + # test positive case + def handler(logger, level, msg, args, kwargs): + assert logger.name == name + assert msg == 'aha!' + return True + + breadcrumbs.register_special_log_handler(name, handler) + + client = Client('http://foo:bar@example.com/0') + with client.context: + logger.debug('aha!') + crumbs = client.context.breadcrumbs.get_buffer() + assert len(crumbs) == 1 + def test_logging_handlers(self): name = __name__ + '.superspecial2' logger = logging.getLogger(name) From 7b2d75c9244c320de78f5e7e9255808b09478343 Mon Sep 17 00:00:00 2001 From: Kevin Glisson Date: Mon, 12 Feb 2018 17:55:56 -0800 Subject: [PATCH 2/2] adding pre-commit hook back --- hooks/pre-commit.flake8 | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 hooks/pre-commit.flake8 diff --git a/hooks/pre-commit.flake8 b/hooks/pre-commit.flake8 new file mode 100755 index 000000000..7abe558e4 --- /dev/null +++ b/hooks/pre-commit.flake8 @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +import glob +import os +import sys + +os.environ['PYFLAKES_NODOCTEST'] = '1' + +# pycodestyle.py uses sys.argv to find setup.cfg +sys.argv = [os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)] + +# git usurbs your bin path for hooks and will always run system python +if 'VIRTUAL_ENV' in os.environ: + site_packages = glob.glob( + '%s/lib/*/site-packages' % os.environ['VIRTUAL_ENV'])[0] + sys.path.insert(0, site_packages) + + +def main(): + from flake8.main import USER_CONFIG + from flake8.engine import get_style_guide + from flake8.hooks import run + + gitcmd = "git diff-index --cached --name-only HEAD" + + _, files_modified, _ = run(gitcmd) + + try: + text_type = unicode + except NameError: + text_type = str + + files_modified = [text_type(x) for x in files_modified] + + # remove non-py files and files which no longer exist + files_modified = filter( + lambda x: x.endswith('.py') and os.path.exists(x), + files_modified) + + flake8_style = get_style_guide(parse_argv=True, config_file=USER_CONFIG) + report = flake8_style.check_files(files_modified) + + return report.total_errors + +if __name__ == '__main__': + sys.exit(main())