diff --git a/lbrynet/__init__.py b/lbrynet/__init__.py index 1221c6c56..bded44fe3 100644 --- a/lbrynet/__init__.py +++ b/lbrynet/__init__.py @@ -1,10 +1,4 @@ -import logging -from lbrynet.custom_logger import install_logger - - __name__ = "lbrynet" __version__ = "0.30.5" version = tuple(__version__.split('.')) -install_logger() -logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/lbrynet/custom_logger.py b/lbrynet/custom_logger.py deleted file mode 100644 index 8e3499e42..000000000 --- a/lbrynet/custom_logger.py +++ /dev/null @@ -1,109 +0,0 @@ -import os -import sys -import inspect -import logging -TRACE = 5 - - -#### -# This code is copied from logging/__init__.py in the python source code -#### -# -# _srcfile is used when walking the stack to check when we've got the first -# caller stack frame. -# -if hasattr(sys, 'frozen'): # support for py2exe - _srcfile = "logging{}__init__{}".format(os.sep, __file__[-4:]) -elif __file__[-4:].lower() in ['.pyc', '.pyo']: - _srcfile = __file__[:-4] + '.py' -else: - _srcfile = __file__ -_srcfile = os.path.normcase(_srcfile) - - -def findCaller(srcfile=None): - """Returns the filename, line number and function name of the caller""" - srcfile = srcfile or _srcfile - f = inspect.currentframe() - # On some versions of IronPython, currentframe() returns None if - # IronPython isn't run with -X:Frames. - if f is not None: - f = f.f_back - rv = "(unknown file)", 0, "(unknown function)" - while hasattr(f, "f_code"): - co = f.f_code - filename = os.path.normcase(co.co_filename) - # ignore any function calls that are in this file - if filename == srcfile: - f = f.f_back - continue - rv = (filename, f.f_lineno, co.co_name) - break - return rv - - -### - -class Logger(logging.Logger): - """A logger that has an extra `fail` method useful for handling twisted failures.""" - - def fail(self, callback=None, *args, **kwargs): - """Returns a function to log a failure from an errback. - - The returned function appends the error message and extracts - the traceback from `err`. - - Example usage: - d.addErrback(log.fail(), 'This is an error message') - - Although odd, making the method call is necessary to extract - out useful filename and line number information; otherwise the - reported values are from inside twisted's deferred handling - code. - - Args: - callback: callable to call after making the log. The first argument - will be the `err` from the deferred - args: extra arguments to pass into `callback` - - Returns: a function that takes the following arguments: - err: twisted.python.failure.Failure - msg: the message to log, using normal logging string iterpolation. - msg_args: the values to substitute into `msg` - msg_kwargs: set `level` to change from the default ERROR severity. Other - keywoards are treated as normal log kwargs. - """ - fn, lno, func = findCaller() - - def _fail(err, msg, *msg_args, **msg_kwargs): - level = msg_kwargs.pop('level', logging.ERROR) - msg += ": %s" - msg_args += (err.getErrorMessage(),) - exc_info = (err.type, err.value, err.getTracebackObject()) - record = self.makeRecord( - self.name, level, fn, lno, msg, msg_args, exc_info, func, msg_kwargs) - self.handle(record) - if callback: - try: - return callback(err, *args, **kwargs) - except Exception: - # log.fail is almost always called within an - # errback. If callback fails and we didn't catch - # the exception we would need to attach a second - # errback to deal with that, which we will almost - # never do and then we end up with an unhandled - # error that will get swallowed by twisted - self.exception('Failed to run callback') - - return _fail - - def trace(self, msg, *args, **kwargs): - if self.isEnabledFor(TRACE): - self._log(TRACE, msg, args, **kwargs) - - -def install_logger(): - current = logging.getLoggerClass() - if current is not Logger: - logging.setLoggerClass(Logger) - logging.addLevelName(TRACE, 'TRACE') diff --git a/lbrynet/extras/cli.py b/lbrynet/extras/cli.py index 1273890df..785ba565d 100644 --- a/lbrynet/extras/cli.py +++ b/lbrynet/extras/cli.py @@ -36,6 +36,7 @@ from lbrynet.extras.daemon.DaemonConsole import main as daemon_console, LBRYAPIC from lbrynet.extras.system_info import get_platform log = logging.getLogger(lbrynet_name) +log.addHandler(logging.NullHandler()) optional_path_getter_type = typing.Optional[typing.Callable[[], str]] diff --git a/tests/unit/test_customLogger.py b/tests/unit/test_customLogger.py deleted file mode 100644 index 66c4aa572..000000000 --- a/tests/unit/test_customLogger.py +++ /dev/null @@ -1,53 +0,0 @@ -from io import StringIO -import logging -from unittest import mock -from unittest import skipIf - -from twisted.internet import defer -from twisted.trial import unittest - -from lbrynet import custom_logger -from tests.test_utils import is_android - - -class TestLogger(unittest.TestCase): - def raiseError(self): - raise Exception('terrible things happened') - - def triggerErrback(self, callback=None): - d = defer.Deferred() - d.addCallback(lambda _: self.raiseError()) - d.addErrback(self.log.fail(callback), 'My message') - d.callback(None) - return d - - def setUp(self): - self.log = custom_logger.Logger('test') - self.stream = StringIO() - handler = logging.StreamHandler(self.stream) - handler.setFormatter(logging.Formatter("%(filename)s:%(lineno)d - %(message)s")) - self.log.addHandler(handler) - - @skipIf(is_android(), - 'Test cannot pass on Android because the tests package is compiled ' - 'which results in a different method call stack') - def test_can_log_failure(self): - def output_lines(): - return self.stream.getvalue().split('\n') - - # the line number could change if this file gets refactored - expected_first_line = 'test_customLogger.py:20 - My message: terrible things happened' - - # testing the entirety of the message is futile as the - # traceback will depend on the system the test is being run on - # but hopefully these two tests are good enough - d = self.triggerErrback() - d.addCallback(lambda _: self.assertEquals(expected_first_line, output_lines()[0])) - d.addCallback(lambda _: self.assertEqual(10, len(output_lines()))) - return d - - def test_can_log_failure_with_callback(self): - callback = mock.Mock() - d = self.triggerErrback(callback) - d.addCallback(lambda _: callback.assert_called_once_with(mock.ANY)) - return d