mirror of https://github.com/borgbackup/borg.git
Merge pull request #1513 from ThomasWaldmann/improve-error-logging
improve error logging, fixes #1440
This commit is contained in:
commit
ab96c6496c
|
@ -2381,37 +2381,51 @@ def main(): # pragma: no cover
|
||||||
sys.stderr = ErrorIgnoringTextIOWrapper(sys.stderr.buffer, sys.stderr.encoding, 'replace', line_buffering=True)
|
sys.stderr = ErrorIgnoringTextIOWrapper(sys.stderr.buffer, sys.stderr.encoding, 'replace', line_buffering=True)
|
||||||
setup_signal_handlers()
|
setup_signal_handlers()
|
||||||
archiver = Archiver()
|
archiver = Archiver()
|
||||||
msg = None
|
msg = tb = None
|
||||||
|
tb_log_level = logging.ERROR
|
||||||
try:
|
try:
|
||||||
args = archiver.get_args(sys.argv, os.environ.get('SSH_ORIGINAL_COMMAND'))
|
args = archiver.get_args(sys.argv, os.environ.get('SSH_ORIGINAL_COMMAND'))
|
||||||
except Error as e:
|
except Error as e:
|
||||||
msg = e.get_message()
|
msg = e.get_message()
|
||||||
if e.traceback:
|
tb_log_level = logging.ERROR if e.traceback else logging.DEBUG
|
||||||
msg += "\n%s\n%s" % (traceback.format_exc(), sysinfo())
|
tb = '%s\n%s' % (traceback.format_exc(), sysinfo())
|
||||||
# we might not have logging setup yet, so get out quickly
|
# we might not have logging setup yet, so get out quickly
|
||||||
print(msg, file=sys.stderr)
|
print(msg, file=sys.stderr)
|
||||||
|
if tb_log_level == logging.ERROR:
|
||||||
|
print(tb, file=sys.stderr)
|
||||||
sys.exit(e.exit_code)
|
sys.exit(e.exit_code)
|
||||||
try:
|
try:
|
||||||
exit_code = archiver.run(args)
|
exit_code = archiver.run(args)
|
||||||
except Error as e:
|
except Error as e:
|
||||||
msg = e.get_message()
|
msg = e.get_message()
|
||||||
if e.traceback:
|
tb_log_level = logging.ERROR if e.traceback else logging.DEBUG
|
||||||
msg += "\n%s\n%s" % (traceback.format_exc(), sysinfo())
|
tb = "%s\n%s" % (traceback.format_exc(), sysinfo())
|
||||||
exit_code = e.exit_code
|
exit_code = e.exit_code
|
||||||
except RemoteRepository.RPCError as e:
|
except RemoteRepository.RPCError as e:
|
||||||
msg = '%s\n%s' % (str(e), sysinfo())
|
msg = "%s %s" % (e.remote_type, e.name)
|
||||||
|
important = e.remote_type not in ('LockTimeout', )
|
||||||
|
tb_log_level = logging.ERROR if important else logging.DEBUG
|
||||||
|
tb = sysinfo()
|
||||||
exit_code = EXIT_ERROR
|
exit_code = EXIT_ERROR
|
||||||
except Exception:
|
except Exception:
|
||||||
msg = 'Local Exception.\n%s\n%s' % (traceback.format_exc(), sysinfo())
|
msg = 'Local Exception'
|
||||||
|
tb_log_level = logging.ERROR
|
||||||
|
tb = '%s\n%s' % (traceback.format_exc(), sysinfo())
|
||||||
exit_code = EXIT_ERROR
|
exit_code = EXIT_ERROR
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
msg = 'Keyboard interrupt.\n%s\n%s' % (traceback.format_exc(), sysinfo())
|
msg = 'Keyboard interrupt'
|
||||||
|
tb_log_level = logging.DEBUG
|
||||||
|
tb = '%s\n%s' % (traceback.format_exc(), sysinfo())
|
||||||
exit_code = EXIT_ERROR
|
exit_code = EXIT_ERROR
|
||||||
except SIGTERMReceived:
|
except SIGTERMReceived:
|
||||||
msg = 'Received SIGTERM.'
|
msg = 'Received SIGTERM'
|
||||||
|
tb_log_level = logging.DEBUG
|
||||||
|
tb = '%s\n%s' % (traceback.format_exc(), sysinfo())
|
||||||
exit_code = EXIT_ERROR
|
exit_code = EXIT_ERROR
|
||||||
if msg:
|
if msg:
|
||||||
logger.error(msg)
|
logger.error(msg)
|
||||||
|
if tb:
|
||||||
|
logger.log(tb_log_level, tb)
|
||||||
if args.show_rc:
|
if args.show_rc:
|
||||||
rc_logger = logging.getLogger('borg.output.show-rc')
|
rc_logger = logging.getLogger('borg.output.show-rc')
|
||||||
exit_msg = 'terminating with %s status, rc %d'
|
exit_msg = 'terminating with %s status, rc %d'
|
||||||
|
|
|
@ -6,6 +6,7 @@ import select
|
||||||
import shlex
|
import shlex
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import traceback
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
import msgpack
|
import msgpack
|
||||||
|
@ -101,12 +102,21 @@ class RepositoryServer: # pragma: no cover
|
||||||
f = getattr(self.repository, method)
|
f = getattr(self.repository, method)
|
||||||
res = f(*args)
|
res = f(*args)
|
||||||
except BaseException as e:
|
except BaseException as e:
|
||||||
|
if isinstance(e, (Repository.DoesNotExist, Repository.AlreadyExists, PathNotAllowed)):
|
||||||
# These exceptions are reconstructed on the client end in RemoteRepository.call_many(),
|
# These exceptions are reconstructed on the client end in RemoteRepository.call_many(),
|
||||||
# and will be handled just like locally raised exceptions. Suppress the remote traceback
|
# and will be handled just like locally raised exceptions. Suppress the remote traceback
|
||||||
# for these, except ErrorWithTraceback, which should always display a traceback.
|
# for these, except ErrorWithTraceback, which should always display a traceback.
|
||||||
if not isinstance(e, (Repository.DoesNotExist, Repository.AlreadyExists, PathNotAllowed)):
|
pass
|
||||||
logging.exception('Borg %s: exception in RPC call:', __version__)
|
else:
|
||||||
logging.error(sysinfo())
|
if isinstance(e, Error):
|
||||||
|
tb_log_level = logging.ERROR if e.traceback else logging.DEBUG
|
||||||
|
msg = e.get_message()
|
||||||
|
else:
|
||||||
|
tb_log_level = logging.ERROR
|
||||||
|
msg = '%s Exception in RPC call' % e.__class__.__name__
|
||||||
|
tb = '%s\n%s' % (traceback.format_exc(), sysinfo())
|
||||||
|
logging.error(msg)
|
||||||
|
logging.log(tb_log_level, tb)
|
||||||
exc = "Remote Exception (see remote log for the traceback)"
|
exc = "Remote Exception (see remote log for the traceback)"
|
||||||
os.write(stdout_fd, msgpack.packb((1, msgid, e.__class__.__name__, exc)))
|
os.write(stdout_fd, msgpack.packb((1, msgid, e.__class__.__name__, exc)))
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue