diff --git a/src/ocrmypdf/builtin_plugins/concurrency.py b/src/ocrmypdf/builtin_plugins/concurrency.py index 74b3500f..797087ae 100644 --- a/src/ocrmypdf/builtin_plugins/concurrency.py +++ b/src/ocrmypdf/builtin_plugins/concurrency.py @@ -29,6 +29,7 @@ from tqdm import tqdm from ocrmypdf import Executor, hookimpl from ocrmypdf._logging import TqdmConsole from ocrmypdf.exceptions import InputFileError +from ocrmypdf.helpers import remove_all_log_handlers Queue = Union[multiprocessing.Queue, queue.Queue] @@ -74,9 +75,7 @@ def process_init(q: Queue, user_init: Callable[[], None], loglevel): # Remove any log handlers that belong to the parent process root = logging.getLogger() - for handler in root.handlers[:]: - root.removeHandler(handler) - handler.close() # To ensure handlers with opened resources are released + remove_all_log_handlers(root) # Set up our single log handler to forward messages to the parent root.setLevel(loglevel) diff --git a/src/ocrmypdf/extra_plugins/awslambda.py b/src/ocrmypdf/extra_plugins/awslambda.py index 23fe9799..0f98f470 100644 --- a/src/ocrmypdf/extra_plugins/awslambda.py +++ b/src/ocrmypdf/extra_plugins/awslambda.py @@ -22,6 +22,7 @@ from unittest.mock import Mock from ocrmypdf import Executor, hookimpl from ocrmypdf._concurrent import NullProgressBar from ocrmypdf.exceptions import InputFileError +from ocrmypdf.helpers import remove_all_log_handlers class MessageType(Enum): @@ -61,8 +62,8 @@ def process_loop( # Reconfigure the root logger for this process to send all messages to a queue h = ConnectionLogHandler(conn) root = logging.getLogger() + remove_all_log_handlers(root) root.setLevel(loglevel) - root.handlers = [] root.addHandler(h) user_init() diff --git a/src/ocrmypdf/helpers.py b/src/ocrmypdf/helpers.py index 0f26e025..07ff66ae 100644 --- a/src/ocrmypdf/helpers.py +++ b/src/ocrmypdf/helpers.py @@ -223,6 +223,13 @@ def clamp(n, smallest, largest): # mypy doesn't understand types for this return max(smallest, min(n, largest)) +def remove_all_log_handlers(logger): + "Remove all log handlers, usually used in a child process." + for handler in logger.handlers[:]: + logger.removeHandler(handler) + handler.close() # To ensure handlers with opened resources are released + + def pikepdf_enable_mmap(): # try: # if pikepdf._qpdf.set_access_default_mmap(True):