def get_logger_from_func(func): """Get logger from func's module""" try: log = getlog(get_func_name(func)) except: # ^ no evidence of this ever failing log = base_log log.warning('Failed to get logger for func.') return log
from smseventlog import delta from smseventlog import errors as er from smseventlog import functions as f from smseventlog import getlog, users from smseventlog.data import factorycampaign as fc from smseventlog.data.units import update_comp_smr from smseventlog.database import db from smseventlog.gui import _global as gbl from smseventlog.gui import dialogs as dlgs from smseventlog.gui import tables as tbls from smseventlog.gui.multithread import Worker from smseventlog.gui.update import Updater from smseventlog.utils import fileops as fl from smseventlog.utils.credentials import CredentialManager log = getlog(__name__) class MainWindow(QMainWindow): """Main application window""" minesite_changed = pyqtSignal(str) def __init__(self): super().__init__() self.app = QApplication.instance() self.setWindowTitle(gbl.title) self.setMinimumSize(QSize(1000, 400)) self.minesite_changed.connect(self.update_minesite_label) self.minesite_label = QLabel( self ) # permanent label for status bar so it isnt changed by statusTips
def log_error(msg: str = None, exc: Exception = None, display: bool = False, log: logging.Logger = None, prnt: bool = False, func: Callable = None, func_name: str = None, exc_info: tuple = None, discord: bool = False, **kw): """Base func to log/handle errors - eg, ignore things like 'NoInternetError' or 'NoRowSelectedError' Parameters ---------- msg : str, optional Simple message to add to start of traceback, by default None\n exc : Exception, optional Exception object used to check exc time to add extra info to display msg, by default None\n display : bool, optional\n log : logging.Logger, optional Logger, passed from calling module, by default None\n prnt : bool, optional Msg will be printed if not running in frozen app, by default False\n func: optional Function object\n Already formatted traceback string, may have been passed in from different thread, so cant build here exc_info : tuple comes from sys.excepthook, (exc_type, exc_value, exc_traceback) discord : bool send message to discord err channel """ if prnt: print_error(msg) # err came from excepthook, extract info if not exc_info is None: kw['tb_msg'] = ''.join(traceback.format_exception(*exc_info)) exc_type, exc, tb = exc_info func_name = get_func_name_from_tb(tb=tb) if log is None: try: log = getlog(inspect.getmodule( tb).__name__) # 'smseventlog.gui.my_module' except: log = base_log log.warning('failed to get logger from tb') if func_name is None: func_name = get_func_name(func) if exc is None: exc = sys.exc_info()[ 1] # doesnt work if comes from excepthook, but all good # get extra errors if raised with 'from' excs = [exc] if hasattr(exc, '__cause__'): excs.append(exc.__cause__) # Suppress error if 'expected' (NoInternet, NoRowSelected) for _exc in excs: if issubclass(type(_exc), ExpectedError): return if display: display_error(exc=exc, func_name=func_name, msg=msg, **kw) if discord: from smseventlog import functions as f f.discord(msg=format_traceback(exc_info=sys.exc_info()), channel='err') if not log is None: # exc_info = True makes sentry/logger collect it if exc_info is None: exc_info = True if msg is None: msg = str(exc) log.error(msg, exc_info=exc_info) return # unhandled exception, pass back to sentry if we don't handle - doesn't ever get here if not exc_info is None: sys.sentry_excepthook(*exc_info)
import functools import inspect import logging import sys import traceback import types from typing import * import sentry_sdk from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration from smseventlog import VERSION, getlog from smseventlog.config import AZURE_WEB, IS_QT_APP, SYS_FROZEN base_log = getlog(__name__) def global_exception_hook(*exc_info) -> None: """Custom exception hook to catch all errors in central location Parameters --------- exc_info : tuple Comes from sys.exc_info() - (exc_type, exc, exc_traceback) """ try: log_error(display=True, exc_info=exc_info) except: # if any issues with custom err handling, always try pass back to sentry, then base base_log.error('Custom excepthook failed, falling back to sentry', exc_info=True)