diff options
| author | 2025-12-20 05:49:04 -0500 | |
|---|---|---|
| committer | 2025-12-20 05:49:04 -0500 | |
| commit | a24ec1647aeac35a63b744ea856011ad6e06be3b (patch) | |
| tree | ae94416de786aeddd05d99559098f7f16bb103a6 /gallery_dl/output.py | |
| parent | 33f8a8a37a9cba738ef25fb99955f0730da9eb48 (diff) | |
New upstream version 1.31.1.upstream/1.31.1
Diffstat (limited to 'gallery_dl/output.py')
| -rw-r--r-- | gallery_dl/output.py | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/gallery_dl/output.py b/gallery_dl/output.py index 9e0888b..fe7235e 100644 --- a/gallery_dl/output.py +++ b/gallery_dl/output.py @@ -89,6 +89,11 @@ class LoggerAdapter(): self.logger = logger self.extra = job._logger_extra + def traceback(self, exc): + if self.logger.isEnabledFor(logging.DEBUG): + self.logger._log( + logging.DEBUG, "", None, exc_info=exc, extra=self.extra) + def debug(self, msg, *args, **kwargs): if self.logger.isEnabledFor(logging.DEBUG): kwargs["extra"] = self.extra @@ -171,6 +176,48 @@ class Formatter(logging.Formatter): return msg +class FileHandler(logging.StreamHandler): + def __init__(self, path, mode, encoding, delay=True): + self.path = path + self.mode = mode + self.errors = None + self.encoding = encoding + + if delay: + logging.Handler.__init__(self) + self.stream = None + self.emit = self.emit_delayed + else: + logging.StreamHandler.__init__(self, self._open()) + + def close(self): + with self.lock: + try: + if self.stream: + try: + self.flush() + self.stream.close() + finally: + self.stream = None + finally: + logging.StreamHandler.close(self) + + def _open(self): + try: + return open(self.path, self.mode, + encoding=self.encoding, errors=self.errors) + except FileNotFoundError: + os.makedirs(os.path.dirname(self.path)) + return open(self.path, self.mode, + encoding=self.encoding, errors=self.errors) + + def emit_delayed(self, record): + if self.mode != "w" or not self._closed: + self.stream = self._open() + self.emit = logging.StreamHandler.emit.__get__(self) + self.emit(record) + + def initialize_logging(loglevel): """Setup basic logging functionality before configfiles have been loaded""" # convert levelnames to lowercase @@ -242,7 +289,8 @@ def configure_logging(loglevel): root.setLevel(minlevel) -def setup_logging_handler(key, fmt=LOG_FORMAT, lvl=LOG_LEVEL, mode="w"): +def setup_logging_handler(key, fmt=LOG_FORMAT, lvl=LOG_LEVEL, mode="w", + defer=False): """Setup a new logging handler""" opts = config.interpolate(("output",), key) if not opts: @@ -253,12 +301,10 @@ def setup_logging_handler(key, fmt=LOG_FORMAT, lvl=LOG_LEVEL, mode="w"): path = opts.get("path") mode = opts.get("mode", mode) encoding = opts.get("encoding", "utf-8") + delay = opts.get("defer", defer) try: path = util.expand_path(path) - handler = logging.FileHandler(path, mode, encoding) - except FileNotFoundError: - os.makedirs(os.path.dirname(path)) - handler = logging.FileHandler(path, mode, encoding) + handler = FileHandler(path, mode, encoding, delay) except (OSError, ValueError) as exc: logging.getLogger("gallery-dl").warning( "%s: %s", key, exc) |
