From 720c4f06e523f6188bf335b983ae7301ecf7cde5 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Fri, 18 Sep 2026 03:42:36 +0000 Subject: [PATCH] logging: add opt-in quiet_vips_logging() helper pyvips redirects all GLib messages ("VIPS: threadpool completed ..." per operation) onto the 'pyvips' logger at INFO. The helper caps that logger at WARNING while keeping 'pyvips.voperation' (deprecated-argument notices) at INFO. Library import remains free of logging side effects; the CLI and worker entry points call the helper instead of their old bare setLevel, which also hid the deprecation notices. --- mediapreview/__main__.py | 5 ++--- mediapreview/util/logformat.py | 15 +++++++++++++++ mediapreview/worker.py | 5 ++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/mediapreview/__main__.py b/mediapreview/__main__.py index 8a89c51..1447b03 100644 --- a/mediapreview/__main__.py +++ b/mediapreview/__main__.py @@ -32,15 +32,14 @@ from docopt import docopt from mediapreview.backends import dispatch from mediapreview.exceptions import PreviewError -from mediapreview.util.logformat import EmojiFormatter +from mediapreview.util.logformat import EmojiFormatter, quiet_vips_logging def _configure_logging() -> None: handler = logging.StreamHandler(sys.stderr) handler.setFormatter(EmojiFormatter()) logging.basicConfig(level=logging.INFO, handlers=[handler]) - # pyvips is chatty at INFO ("threadpool completed ..." per operation). - logging.getLogger("pyvips").setLevel(logging.WARNING) + quiet_vips_logging() def _oosetup(name: str) -> None: diff --git a/mediapreview/util/logformat.py b/mediapreview/util/logformat.py index 140d3cb..a3afaf6 100644 --- a/mediapreview/util/logformat.py +++ b/mediapreview/util/logformat.py @@ -31,3 +31,18 @@ class EmojiFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: return format_level_prefix(record.levelno) + record.getMessage() + + +def quiet_vips_logging() -> None: + """Silence libvips per-operation chatter without hiding deprecations. + + pyvips redirects every GLib message ("VIPS: threadpool completed ...") + onto the ``pyvips`` logger at INFO; cap that logger at WARNING. pyvips's + own diagnostics (e.g. deprecated-argument notices) are logged on the + ``pyvips.voperation`` child logger and stay at the default INFO. + + Opt-in: applications that want quiet vips output call this once during + their own logging setup. mediapreview never calls it on import. + """ + logging.getLogger("pyvips").setLevel(logging.WARNING) + logging.getLogger("pyvips.voperation").setLevel(logging.INFO) diff --git a/mediapreview/worker.py b/mediapreview/worker.py index 280a9ff..1d3f24a 100644 --- a/mediapreview/worker.py +++ b/mediapreview/worker.py @@ -40,7 +40,7 @@ except ImportError: # pragma: no cover - optional worker extra from mediapreview.backends import dispatch from mediapreview.exceptions import PreviewError from mediapreview.protocol import PreviewRequest, PreviewResponse -from mediapreview.util.logformat import format_level_prefix +from mediapreview.util.logformat import format_level_prefix, quiet_vips_logging logger = logging.getLogger(__name__) @@ -171,8 +171,7 @@ def main() -> None: handler = logging.StreamHandler(sys.stderr) handler.setFormatter(_WorkerLogFormatter()) logging.basicConfig(level=logging.INFO, handlers=[handler]) - # pyvips is chatty at INFO ("threadpool completed ..." per operation). - logging.getLogger("pyvips").setLevel(logging.WARNING) + quiet_vips_logging() # NOTE: standalone package no longer depends on cista config loading. # Consumers can load their own configuration before starting workers. if len(sys.argv) > 1: