From 0e004cbd21ab00b8804901952405fa870bf48e9c Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Wed, 16 Mar 2022 14:00:08 +0100 Subject: [PATCH] logger refactoring --- config.yaml | 1 + image_prediction/flask.py | 7 ++----- image_prediction/predictor.py | 11 ++++++----- image_prediction/utils.py | 26 ++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/config.yaml b/config.yaml index 77c5141..77ef6f1 100644 --- a/config.yaml +++ b/config.yaml @@ -5,6 +5,7 @@ webserver: service: logging_level: $LOGGING_LEVEL_ROOT|DEBUG # Logging level for service logger + progressbar: True # Whether a progress bar over the pages of a document is displayed while processing batch_size: $BATCH_SIZE|32 # Number of images in memory simultaneously verbose: $VERBOSE|True # Service prints document processing progress to stdout run_id: $RUN_ID|fabfb1f192c745369b88cab34471aba7 # The ID of the mlflow run to load the model from diff --git a/image_prediction/flask.py b/image_prediction/flask.py index 03ed026..c5e8e3d 100644 --- a/image_prediction/flask.py +++ b/image_prediction/flask.py @@ -1,13 +1,10 @@ -import logging from typing import Callable from flask import Flask, request, jsonify -from image_prediction.config import CONFIG - -logger = logging.getLogger(__name__) -logger.setLevel(CONFIG.service.logging_level) +from image_prediction.utils import get_logger +logger = get_logger() def make_prediction_server(predict_fn: Callable): diff --git a/image_prediction/predictor.py b/image_prediction/predictor.py index 0be1d79..8e83f2c 100644 --- a/image_prediction/predictor.py +++ b/image_prediction/predictor.py @@ -1,4 +1,3 @@ -import logging from itertools import chain from operator import itemgetter from typing import List, Dict, Iterable @@ -7,12 +6,14 @@ import numpy as np from image_prediction.config import CONFIG from image_prediction.locations import MLRUNS_DIR, BASE_WEIGHTS -from image_prediction.utils import temporary_pdf_file +from image_prediction.utils import temporary_pdf_file, get_logger from incl.redai_image.redai.redai.backend.model.model_handle import ModelHandle from incl.redai_image.redai.redai.backend.pdf.image_extraction import extract_and_stitch from incl.redai_image.redai.redai.utils.mlflow_reader import MlflowModelReader from incl.redai_image.redai.redai.utils.shared import chunk_iterable +logger = get_logger() + class Predictor: """`ModelHandle` wrapper. Forwards to wrapped model handle for prediction and produces structured output that is @@ -37,7 +38,7 @@ class Predictor: self.classes_readable = np.array(self.model_handle.classes) self.classes_readable_aligned = self.classes_readable[self.classes[list(range(len(self.classes)))]] except Exception as e: - logging.info(f"Service estimator initialization failed: {e}") + logger.info(f"Service estimator initialization failed: {e}") def __make_predictions_human_readable(self, probs: np.ndarray) -> List[Dict[str, float]]: """Translates an n x m matrix of probabilities over classes into an n-element list of mappings from classes to @@ -89,9 +90,9 @@ class Predictor: return predictions if probabilities else classes - def predict_pdf(self, pdf): + def predict_pdf(self, pdf, verbose=False): with temporary_pdf_file(pdf) as pdf_path: - image_metadata_pairs = self.__extract_image_metadata_pairs(pdf_path) + image_metadata_pairs = self.__extract_image_metadata_pairs(pdf_path, verbose=verbose) return self.__predict_images(image_metadata_pairs) def __predict_images(self, image_metadata_pairs: Iterable, batch_size: int = CONFIG.service.batch_size): diff --git a/image_prediction/utils.py b/image_prediction/utils.py index 59f56e7..e7eefc6 100644 --- a/image_prediction/utils.py +++ b/image_prediction/utils.py @@ -1,9 +1,35 @@ +import logging import tempfile from contextlib import contextmanager +from image_prediction.config import CONFIG + @contextmanager def temporary_pdf_file(pdf: bytes): with tempfile.NamedTemporaryFile() as f: f.write(pdf) yield f.name + + +def make_logger_getter(): + + logger = logging.getLogger("imgclf") + logger.propagate = False + + handler = logging.StreamHandler() + handler.setLevel(CONFIG.service.logging_level) + + log_format = "[%(levelname)s]: %(message)s" + formatter = logging.Formatter(log_format) + + handler.setFormatter(formatter) + logger.addHandler(handler) + + def get_logger(): + return logger + + return get_logger + + +get_logger = make_logger_getter()