aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/output.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-12-20 05:49:11 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2025-12-20 05:49:11 -0500
commitc586ea4b3c871f5696626f9820e8c88a4e78f4a6 (patch)
treee6d7bae96282c3d147159f091d451e53bdaa2efe /gallery_dl/output.py
parent01a2bf622c31072d1322884584404b9bd59b28cc (diff)
parenta24ec1647aeac35a63b744ea856011ad6e06be3b (diff)
Update upstream source from tag 'upstream/1.31.1'
Update to upstream version '1.31.1' with Debian dir b5d91c25143175f933b1c69c7e82249cd7e145ab
Diffstat (limited to 'gallery_dl/output.py')
-rw-r--r--gallery_dl/output.py56
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)