forked from LBRYCommunity/lbry-sdk
remove custom logging
This commit is contained in:
parent
5971be5bef
commit
bf8e32ebd2
4 changed files with 1 additions and 168 deletions
|
@ -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())
|
||||
|
|
|
@ -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')
|
|
@ -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]]
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in a new issue