From b9d74b84d60a06b7083f972f32dd55e7b44377d2 Mon Sep 17 00:00:00 2001 From: Kentaro Wada Date: Mon, 30 Dec 2024 16:35:34 +0900 Subject: [PATCH] Use loguru for logging --- labelme/__main__.py | 43 ++++++++++++++++--- labelme/ai/_utils.py | 3 +- labelme/ai/efficient_sam.py | 2 +- labelme/ai/segment_anything_model.py | 2 +- labelme/ai/text_to_annotation.py | 3 +- labelme/app.py | 2 +- labelme/cli/draw_label_png.py | 3 +- labelme/cli/export_json.py | 2 +- labelme/cli/json_to_dataset.py | 2 +- labelme/config/__init__.py | 3 +- labelme/label_file.py | 2 +- labelme/logger.py | 62 ---------------------------- labelme/shape.py | 2 +- labelme/utils/shape.py | 3 +- labelme/widgets/canvas.py | 2 +- labelme/widgets/label_dialog.py | 2 +- setup.py | 1 + 17 files changed, 52 insertions(+), 87 deletions(-) delete mode 100644 labelme/logger.py diff --git a/labelme/__main__.py b/labelme/__main__.py index 98fe1ac6d..a832a6cac 100644 --- a/labelme/__main__.py +++ b/labelme/__main__.py @@ -1,11 +1,11 @@ import argparse import codecs -import logging import os import os.path as osp import sys import yaml +from loguru import logger from qtpy import QtCore from qtpy import QtWidgets @@ -13,10 +13,40 @@ from labelme import __version__ from labelme.app import MainWindow from labelme.config import get_config -from labelme.logger import logger from labelme.utils import newIcon +def _setup_loguru(logger_level: str) -> None: + try: + logger.remove(handler_id=0) + except ValueError: + pass + + if sys.stderr: + logger.add(sys.stderr, level=logger_level) + + cache_dir: str + if os.name == "nt": + cache_dir = os.path.join(os.environ["LOCALAPPDATA"], "labelme") + else: + cache_dir = os.path.expanduser("~/.cache/labelme") + + os.makedirs(cache_dir, exist_ok=True) + + log_file = os.path.join(cache_dir, "labelme.log") + logger.add( + log_file, + colorize=True, + level="DEBUG", + rotation="10 MB", + retention="30 days", + compression="gz", + enqueue=True, + backtrace=True, + diagnose=True, + ) + + def main(): parser = argparse.ArgumentParser() parser.add_argument("--version", "-V", action="store_true", help="show version") @@ -109,7 +139,7 @@ def main(): print("{0} {1}".format(__appname__, __version__)) sys.exit(0) - logger.setLevel(getattr(logging, args.logger_level.upper())) + _setup_loguru(logger_level=args.logger_level.upper()) if hasattr(args, "flags"): if os.path.isfile(args.flags): @@ -177,9 +207,10 @@ def main(): win.settings.clear() sys.exit(0) - win.show() - win.raise_() - sys.exit(app.exec_()) + with logger.catch(): + win.show() + win.raise_() + sys.exit(app.exec_()) # this main block is required to generate executable by pyinstaller diff --git a/labelme/ai/_utils.py b/labelme/ai/_utils.py index 6806a5b06..23e7fee08 100644 --- a/labelme/ai/_utils.py +++ b/labelme/ai/_utils.py @@ -1,8 +1,7 @@ import imgviz import numpy as np import skimage - -from labelme.logger import logger +from loguru import logger def _get_contour_length(contour): diff --git a/labelme/ai/efficient_sam.py b/labelme/ai/efficient_sam.py index 656c43a58..7b639f399 100644 --- a/labelme/ai/efficient_sam.py +++ b/labelme/ai/efficient_sam.py @@ -5,8 +5,8 @@ import numpy as np import onnxruntime import skimage +from loguru import logger -from ..logger import logger from . import _utils diff --git a/labelme/ai/segment_anything_model.py b/labelme/ai/segment_anything_model.py index 84da17d86..2b024b52c 100644 --- a/labelme/ai/segment_anything_model.py +++ b/labelme/ai/segment_anything_model.py @@ -5,8 +5,8 @@ import numpy as np import onnxruntime import skimage +from loguru import logger -from ..logger import logger from . import _utils diff --git a/labelme/ai/text_to_annotation.py b/labelme/ai/text_to_annotation.py index 35ca4ba7c..2256946dd 100644 --- a/labelme/ai/text_to_annotation.py +++ b/labelme/ai/text_to_annotation.py @@ -3,8 +3,7 @@ import numpy as np import osam - -from labelme.logger import logger +from loguru import logger def get_rectangles_from_texts( diff --git a/labelme/app.py b/labelme/app.py index 207a769cf..354f7b68b 100644 --- a/labelme/app.py +++ b/labelme/app.py @@ -11,6 +11,7 @@ import imgviz import natsort import numpy as np +from loguru import logger from qtpy import QtCore from qtpy import QtGui from qtpy import QtWidgets @@ -23,7 +24,6 @@ from labelme.config import get_config from labelme.label_file import LabelFile from labelme.label_file import LabelFileError -from labelme.logger import logger from labelme.shape import Shape from labelme.widgets import AiPromptWidget from labelme.widgets import BrightnessContrastDialog diff --git a/labelme/cli/draw_label_png.py b/labelme/cli/draw_label_png.py index 6fe080a02..f799db8e6 100644 --- a/labelme/cli/draw_label_png.py +++ b/labelme/cli/draw_label_png.py @@ -4,8 +4,7 @@ import imgviz import matplotlib.pyplot as plt import numpy as np - -from labelme.logger import logger +from loguru import logger def main(): diff --git a/labelme/cli/export_json.py b/labelme/cli/export_json.py index 4479321e7..f11963a62 100644 --- a/labelme/cli/export_json.py +++ b/labelme/cli/export_json.py @@ -6,9 +6,9 @@ import imgviz import PIL.Image +from loguru import logger from labelme import utils -from labelme.logger import logger def main(): diff --git a/labelme/cli/json_to_dataset.py b/labelme/cli/json_to_dataset.py index ef3749270..d464be75d 100644 --- a/labelme/cli/json_to_dataset.py +++ b/labelme/cli/json_to_dataset.py @@ -6,9 +6,9 @@ import imgviz import PIL.Image +from loguru import logger from labelme import utils -from labelme.logger import logger def main(): diff --git a/labelme/config/__init__.py b/labelme/config/__init__.py index 112a919c7..3fe18443a 100644 --- a/labelme/config/__init__.py +++ b/labelme/config/__init__.py @@ -2,8 +2,7 @@ import shutil import yaml - -from labelme.logger import logger +from loguru import logger here = osp.dirname(osp.abspath(__file__)) diff --git a/labelme/label_file.py b/labelme/label_file.py index 3c1f31530..ea43572a9 100644 --- a/labelme/label_file.py +++ b/labelme/label_file.py @@ -5,12 +5,12 @@ import os.path as osp import PIL.Image +from loguru import logger from labelme import PY2 from labelme import QT4 from labelme import __version__ from labelme import utils -from labelme.logger import logger PIL.Image.MAX_IMAGE_PIXELS = None diff --git a/labelme/logger.py b/labelme/logger.py deleted file mode 100644 index 25a5ce91c..000000000 --- a/labelme/logger.py +++ /dev/null @@ -1,62 +0,0 @@ -import datetime -import logging -import os -import sys - -import termcolor - -if os.name == "nt": # Windows - import colorama - - colorama.init() - -from . import __appname__ - -COLORS = { - "WARNING": "yellow", - "INFO": "white", - "DEBUG": "blue", - "CRITICAL": "red", - "ERROR": "red", -} - - -class ColoredFormatter(logging.Formatter): - def __init__(self, fmt, use_color=True): - logging.Formatter.__init__(self, fmt) - self.use_color = use_color - - def format(self, record): - levelname = record.levelname - if self.use_color and levelname in COLORS: - - def colored(text): - return termcolor.colored( - text, - color=COLORS[levelname], - attrs={"bold": True}, - ) - - record.levelname2 = colored("{:<7}".format(record.levelname)) - record.message2 = colored(record.msg) - - asctime2 = datetime.datetime.fromtimestamp(record.created) - record.asctime2 = termcolor.colored(asctime2, color="green") - - record.module2 = termcolor.colored(record.module, color="cyan") - record.funcName2 = termcolor.colored(record.funcName, color="cyan") - record.lineno2 = termcolor.colored(record.lineno, color="cyan") - return logging.Formatter.format(self, record) - - -logger = logging.getLogger(__appname__) -logger.setLevel(logging.INFO) - -stream_handler = logging.StreamHandler(sys.stderr) -handler_format = ColoredFormatter( - "%(asctime)s [%(levelname2)s] %(module2)s:%(funcName2)s:%(lineno2)s" - "- %(message2)s" -) -stream_handler.setFormatter(handler_format) - -logger.addHandler(stream_handler) diff --git a/labelme/shape.py b/labelme/shape.py index 0f1fd9fdb..99f51bc63 100644 --- a/labelme/shape.py +++ b/labelme/shape.py @@ -2,11 +2,11 @@ import numpy as np import skimage.measure +from loguru import logger from qtpy import QtCore from qtpy import QtGui import labelme.utils -from labelme.logger import logger # TODO(unknown): # - [opt] Store paths instead of creating new ones at each paint. diff --git a/labelme/utils/shape.py b/labelme/utils/shape.py index 2aab557c9..c6f7f8de5 100644 --- a/labelme/utils/shape.py +++ b/labelme/utils/shape.py @@ -7,8 +7,7 @@ import numpy as np import PIL.Image import PIL.ImageDraw - -from labelme.logger import logger +from loguru import logger def polygons_to_mask(img_shape, polygons, shape_type=None): diff --git a/labelme/widgets/canvas.py b/labelme/widgets/canvas.py index d71a6125b..660d857f7 100644 --- a/labelme/widgets/canvas.py +++ b/labelme/widgets/canvas.py @@ -1,4 +1,5 @@ import imgviz +from loguru import logger from qtpy import QtCore from qtpy import QtGui from qtpy import QtWidgets @@ -6,7 +7,6 @@ import labelme.ai import labelme.utils from labelme import QT5 -from labelme.logger import logger from labelme.shape import Shape # TODO(unknown): diff --git a/labelme/widgets/label_dialog.py b/labelme/widgets/label_dialog.py index e6c33ba1d..ba14253c2 100644 --- a/labelme/widgets/label_dialog.py +++ b/labelme/widgets/label_dialog.py @@ -1,12 +1,12 @@ import re +from loguru import logger from qtpy import QT_VERSION from qtpy import QtCore from qtpy import QtGui from qtpy import QtWidgets import labelme.utils -from labelme.logger import logger QT5 = QT_VERSION[0] == "5" diff --git a/setup.py b/setup.py index 26222a9ad..e884123a2 100644 --- a/setup.py +++ b/setup.py @@ -23,6 +23,7 @@ def get_install_requires(): install_requires = [ "gdown", "imgviz>=1.7.5", + "loguru", "matplotlib", "natsort>=7.1.0", "numpy",