From 4d7a52d8e0bf7c5cd4ebb36bf1e454d70046978a Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Sat, 6 Aug 2016 22:37:44 +0200 Subject: [PATCH] --debug-topic for granular debug logging Especially: disables file-compression logging by default --- src/borg/archive.py | 3 ++- src/borg/archiver.py | 13 +++++++++++++ src/borg/helpers.py | 4 +++- src/borg/logger.py | 5 +++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index 13f596c33..9a4936326 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -254,6 +254,7 @@ class Archive: self.consider_part_files = consider_part_files self.pipeline = DownloadPipeline(self.repository, self.key) if create: + self.file_compression_logger = create_logger('borg.debug.file-compression') self.items_buffer = CacheChunkBuffer(self.cache, self.key, self.stats) self.chunker = Chunker(self.key.chunk_seed, *chunker_params) self.compression_decider1 = CompressionDecider1(compression or CompressionSpec('none'), @@ -818,7 +819,7 @@ Number of files: {0.stats.nfiles}'''.format( item.chunks = chunks else: compress = self.compression_decider1.decide(path) - logger.debug('%s -> compression %s', path, compress['name']) + self.file_compression_logger.debug('%s -> compression %s', path, compress['name']) with backup_io(): fh = Archive._open_rb(path) with os.fdopen(fh, 'rb') as fd: diff --git a/src/borg/archiver.py b/src/borg/archiver.py index aab9ff58e..e107da839 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1225,6 +1225,10 @@ class Archiver: common_group.add_argument('--debug', dest='log_level', action='store_const', const='debug', default='warning', help='enable debug output, work on log level DEBUG') + common_group.add_argument('--debug-topic', dest='debug_topics', + action='append', metavar='TOPIC', default=[], + help='enable TOPIC debugging (can be specified multiple times). ' + 'The logger path is borg.debug. if TOPIC is not fully qualified.') common_group.add_argument('--lock-wait', dest='lock_wait', type=int, metavar='N', default=1, help='wait for the lock, but max. N seconds (default: %(default)d).') common_group.add_argument('--show-version', dest='show_version', action='store_true', default=False, @@ -2202,11 +2206,20 @@ class Archiver: if args.get(option, False): logging.getLogger(logger_name).setLevel('INFO') + def _setup_topic_debugging(self, args): + """Turn on DEBUG level logging for specified --debug-topics.""" + for topic in args.debug_topics: + if '.' not in topic: + topic = 'borg.debug.' + topic + logger.debug('Enabling debug topic %s', topic) + logging.getLogger(topic).setLevel('DEBUG') + def run(self, args): os.umask(args.umask) # early, before opening files self.lock_wait = args.lock_wait setup_logging(level=args.log_level, is_serve=args.func == self.do_serve) # do not use loggers before this! self._setup_implied_logging(vars(args)) + self._setup_topic_debugging(args) if args.show_version: logging.getLogger('borg.output.show-version').info('borgbackup version %s' % __version__) self.prerun_checks(logger) diff --git a/src/borg/helpers.py b/src/borg/helpers.py index db345f419..bc0fc6926 100644 --- a/src/borg/helpers.py +++ b/src/borg/helpers.py @@ -1527,6 +1527,8 @@ class CompressionDecider1: class CompressionDecider2: + logger = create_logger('borg.debug.file-compression') + def __init__(self, compression): self.compression = compression @@ -1556,7 +1558,7 @@ class CompressionDecider2: # that marks such data as uncompressible via compression-type metadata. compr_spec = CompressionSpec('none') compr_args.update(compr_spec) - logger.debug("len(data) == %d, len(lz4(data)) == %d, choosing %s", data_len, cdata_len, compr_spec) + self.logger.debug("len(data) == %d, len(lz4(data)) == %d, choosing %s", data_len, cdata_len, compr_spec) return compr_args, Chunk(data, **meta) diff --git a/src/borg/logger.py b/src/borg/logger.py index c75aaef75..20510bb2e 100644 --- a/src/borg/logger.py +++ b/src/borg/logger.py @@ -149,8 +149,13 @@ def create_logger(name=None): if not configured: raise Exception("tried to call a logger before setup_logging() was called") self.__real_logger = logging.getLogger(self.__name) + if self.__name.startswith('borg.debug.') and self.__real_logger.level == logging.NOTSET: + self.__real_logger.setLevel('WARNING') return self.__real_logger + def getChild(self, suffix): + return LazyLogger(self.__name + '.' + suffix) + def setLevel(self, *args, **kw): return self.__logger.setLevel(*args, **kw)