Source code for LandSurveyCodesImport.toolbelt.log_handler

#! python3  # noqa: E265

"""
    QGIS plugin logic.
"""

# standard library
import logging

# PyQGIS
from qgis.core import QgsMessageLog
from qgis.utils import iface

# project package
from LandSurveyCodesImport.__about__ import __title__

# ############################################################################
# ########## Classes ###############
# ##################################


[docs]class PlgLogger(logging.Handler): """Python logging handler supercharged with QGIS useful methods."""
[docs] @staticmethod def log( message: str, application: str = __title__, log_level: int = 0, push: bool = False, ): """Send messages to QGIS messages windows and to the user as a message bar. \ Plugin name is used as title. :param message: message to display :type message: str :param application: name of the application sending the message. \ Defaults to __about__.__title__ :type application: str, optional :param log_level: message level. Possible values: 0 (info), 1 (warning), \ 2 (critical), 3 (success), 4 (none - grey). Defaults to 0 (info) :type log_level: int, optional :param push: also display the message in the QGIS message bar in addition to \ the log, defaults to False :type push: bool, optional :Example: .. code-block:: python log(message="Plugin loaded - INFO", log_level=0, push=1) log(message="Plugin loaded - WARNING", log_level=1, push=1) log(message="Plugin loaded - ERROR", log_level=2, push=1) log(message="Plugin loaded - SUCCESS", log_level=3, push=1) log(message="Plugin loaded - TEST", log_level=4, push=1) """ # ensure message is a string if not isinstance(message, str): try: message = str(message) except Exception as err: err_msg = "Log message must be a string, not: {}. Trace: {}".format( type(message), err ) logging.error(err_msg) message = err_msg # send it to QGIS messages panel QgsMessageLog.logMessage( message=message, tag=application, notifyUser=push, level=log_level ) # optionally, display message on QGIS Message bar (above the map canvas) if push: iface.messageBar().pushMessage( title=application, text=message, level=log_level, duration=(log_level + 1) * 3, )