chore: restrict logs to app namespace

This commit is contained in:
aclist 2026-04-29 20:20:20 +09:00
parent d6ef55a3b3
commit eba9a7bfba
34 changed files with 119 additions and 112 deletions

View File

@ -2,9 +2,10 @@ import logging
import requests
from typing import Optional
from dzgui.const.constants import APP_NAME
from dzgui.const.endpoints import BM_SERVERS
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def get_attributes(key: str, uid: int) -> str:

View File

@ -11,6 +11,7 @@ from pathlib import Path
import dzgui.api.pefile as PeFile
from dzgui.api.servers import Record, get_rules
from dzgui.const.constants import (
APP_NAME,
APPID_DAYZ,
LIBRARYFOLDERS_PATH,
WORKSHOP_PATH,
@ -22,7 +23,7 @@ from dzgui.const.enum import Preferences
from typing import Any
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
@dataclass

View File

@ -3,10 +3,10 @@ import requests
from typing import Union, TYPE_CHECKING
from dzgui.const.constants import APPID_DAYZ, REQUEST_TIMEOUT
from dzgui.const.constants import APPID_DAYZ, APP_NAME, REQUEST_TIMEOUT
from dzgui.const import endpoints
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:

View File

@ -12,7 +12,7 @@ from dataclasses import dataclass
from typing import Optional, TYPE_CHECKING, Union
from dzgui.api.bm import map_id_to_record
from dzgui.const.constants import REQUEST_TIMEOUT
from dzgui.const.constants import APP_NAME, REQUEST_TIMEOUT
from dzgui.const.endpoints import STEAM_SERVERS
from dzgui.util import strings
@ -22,8 +22,7 @@ import dayzquery
if TYPE_CHECKING:
from dayzquery import DayzMod
logger = logging.getLogger(__name__)
logging.getLogger("a2s").setLevel(logging.ERROR)
logger = logging.getLogger(APP_NAME)
# TODO: confirm that patches from testing are incorporated here
# particularly around malformed values in JSON response. check commit log
@ -63,7 +62,7 @@ def get_netmask() -> str:
# TODO: rename
def test_ip(suffix: int, port: int, event: threading.Event) -> dict | None:
if event.is_set():
return
return None
netmask = get_netmask()
hostname = f"{netmask}.{str(suffix)}"
ping = ["ping", "-c1", "-i", "0.1", "-w", "1"]
@ -74,6 +73,9 @@ def test_ip(suffix: int, port: int, event: threading.Event) -> dict | None:
def sanitize(name: str) -> str:
"""
Strips extraneous padding and spammy junk chars in server names
"""
name = re.sub(r"\r", r"", name)
name = re.sub(r"\n", r"", name)
name = re.sub(r"\x01", r"", name)
@ -189,9 +191,9 @@ def parse_json(json: list) -> list:
return rows
def query_direct(ip: str, qport: int, TIMEOUT: float = 3.0) -> dict | None:
def query_direct(ip: str, qport: int, timeout: float = 3.0) -> dict | None:
try:
info = a2s.info((ip, qport), TIMEOUT)
info = a2s.info((ip, qport), timeout)
name = info.server_name
mapname = info.map_name
@ -218,7 +220,7 @@ def query_direct(ip: str, qport: int, TIMEOUT: float = 3.0) -> dict | None:
res["ping"] = ping
return res
except Exception as e:
logger.critical(f"{type(e).__name__}: {e}")
logger.critical(f"{type(e).__name__}: {e} ({ip}:{qport})")
return None

View File

@ -5,10 +5,11 @@ import subprocess
from shlex import shlex
from pathlib import Path
from dzgui.const.constants import APP_NAME
from dzgui.util.bash import concat_bash_args
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def query_defunct() -> None:

View File

@ -6,10 +6,11 @@ import shutil
from pathlib import Path
from dzgui.const.constants import REQUEST_TIMEOUT
from dzgui.const.constants import APP_NAME, REQUEST_TIMEOUT
from dzgui.const.endpoints import DB_IP
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def find_download_url(url: str) -> str | None:
res = requests.get(url, timeout=REQUEST_TIMEOUT)
@ -20,6 +21,7 @@ def find_download_url(url: str) -> str | None:
return None
return str(urls[0])
def get_ipdb(ips_path: Path) -> None:
url = find_download_url(DB_IP)
if url is None:
@ -28,10 +30,10 @@ def get_ipdb(ips_path: Path) -> None:
date = find_date(url)
month_file = ips_path.parent / ".month"
if ips_path.exists() and month_file.exists():
old_date = month_file.read_text().rstrip("\n")
if old_date == date:
logger.info(f"IP DB date matches: {date}")
return
old_date = month_file.read_text().rstrip("\n")
if old_date == date:
logger.info(f"IP DB date matches: {date}")
return
# TODO: log additional output
logger.info(f"Fetching IPDB for {date} from {url}")

View File

@ -112,39 +112,6 @@ class NotebookPage(EnumWithAttrs):
class RowType(EnumWithAttrs):
@classmethod
def str2rowtype(cls, string: str) -> "RowType":
for member in cls:
if string == member.dict["label"]:
return member
# TODO: add to notebook tab tooltips
# SERVER_BROWSER = {
# "label": "Server browser",
# "tooltip": "Used to browse the global server list",
# "type": "server",
# }
# SAVED_SERVERS = {
# "label": "My saved servers",
# "tooltip": "Browse your saved servers. Unreachable servers will be excluded",
# "type": "server",
# }
# RECENT_SERVERS = {
# "label": "Recent servers",
# "tooltip": "Shows the last 10 servers you connected to (includes attempts)",
# "type": "server",
# }
# SCAN_LAN = {
# "label": "Scan LAN servers",
# "tooltip": "Search for servers on your local network",
# "type": "server",
# }
# LIST_MODS = {
# "label": "Mods",
# "tooltip": "Browse a list of locally-installed mods",
# "quad_label": "Mods",
# "type": "mods",
# }
# TODO: strings
CHANGELOG = {
"label": "View changelog",

View File

@ -34,6 +34,7 @@ from dzgui.const.enum import (
from dzgui.config.query import lookup
from dzgui.config.userprefs import UserPrefs
from dzgui.const.constants import APP_NAME
from dzgui.controllers.emitter import Emitter
from dzgui.managers.log import LogManager
from dzgui.managers.config import ConfigManager
@ -56,7 +57,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib, GObject # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.api.servers import Record

View File

@ -1,12 +1,13 @@
import logging
from typing import TYPE_CHECKING
from dzgui.const.constants import APP_NAME
from dzgui.util.ip import get_local_ip, get_coords, Coords
if TYPE_CHECKING:
from pathlib import Path
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def get_local_coords(path: "Path") -> Coords | None:

View File

@ -4,13 +4,13 @@ import sys
from pathlib import Path
from dzgui.config.query import lookup
from dzgui.const.constants import LIBRARYFOLDERS_PATH, APPID_DAYZ
from dzgui.const.constants import APPID_DAYZ, APP_NAME, LIBRARYFOLDERS_PATH
from dzgui.const.enum import Preferences
from dzgui.views.dialogs.early_alert import EarlyAlertDialog
import dzgui.api.pefile as PeFile
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def is_dayz_installed(config: Path) -> None:

View File

@ -2,9 +2,9 @@ import logging
import shutil
import subprocess
from dzgui.const.constants import STEAM_CMD, FLATPAK_APPID, FLATPAK_CMD
from dzgui.const.constants import APP_NAME, FLATPAK_APPID, FLATPAK_CMD, STEAM_CMD
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def has_steam_client() -> bool:
@ -14,10 +14,7 @@ def has_steam_client() -> bool:
return False
try:
res = subprocess.run(
[FLATPAK_CMD, "list"],
capture_output=True,
text=True,
check=True
[FLATPAK_CMD, "list"], capture_output=True, text=True, check=True
)
if FLATPAK_APPID in res.stdout:
return True

View File

@ -6,11 +6,11 @@ import sys
from importlib import resources
from packaging.version import Version, InvalidVersion
from dzgui.const.constants import APP_NAME_LOWER, REQUEST_TIMEOUT
from dzgui.const.constants import APP_NAME, APP_NAME_LOWER, REQUEST_TIMEOUT
from dzgui.const.endpoints import GITHUB_RELEASES, CODEBERG_RELEASES
from dzgui.init.prefix import is_prefix_writeable
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def get_latest_release() -> str | None:

View File

@ -7,6 +7,7 @@ import warnings
from typing import TYPE_CHECKING
from dzgui.api.mods import remove_stale_signatures
from dzgui.const.constants import APP_NAME
from dzgui.const.enum import Preferences
from dzgui.config.ipdb import get_ipdb
from dzgui.config.query import lookup
@ -36,18 +37,17 @@ from dzgui.util.strings import init, flags
from dzgui.views.base import App
from dzgui.views.dialogs.early_alert import EarlyAlertDialog, EarlyIgnoreDialog
logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from pathlib import Path
logger = logging.getLogger(APP_NAME)
parser = argparse.ArgumentParser(description=flags.description)
parser.add_argument("-v", "--version", action="store_true", help=flags.version)
parser.add_argument("-u", "--uninstall", action="store_true", help=flags.uninstall)
parser.add_argument("-d", "--debug", action="store_true", help=flags.debug)
args = parser.parse_args()
if TYPE_CHECKING:
from pathlib import Path
# TODO: profile load time
def make_parents(path: "Path") -> None:
@ -63,6 +63,18 @@ def uninstall() -> None:
pass
def setup_logger(log_path: "Path") -> None:
_format = (
"%(asctime)s%(levelname)s%(filename)s::%(funcName)s::%(lineno)s%(message)s"
)
fh = logging.FileHandler(log_path)
formatter = logging.Formatter(_format)
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
def main() -> None:
lock = lock_acquire() # noqa
@ -95,10 +107,7 @@ def main() -> None:
# TODO: copy notes file
copy_state_files(xdg_paths["XDG_STATE_HOME"])
_format = (
"%(asctime)s%(levelname)s%(filename)s::%(funcName)s::%(lineno)s%(message)s"
)
logging.basicConfig(filename=XDG.debug, format=_format, level=logging.DEBUG)
setup_logger(XDG.debug)
with open(XDG.debug, "w") as f:
f.truncate(0)

View File

@ -4,9 +4,10 @@ import traceback
from typing import Any, TYPE_CHECKING
from dzgui.const.constants import (
STEAM_CMD,
APP_NAME,
FLATPAK_RUN_CMD,
FLATPAK_SANDBOX,
STEAM_CMD,
WINDOW_DEFAULT_X,
WINDOW_DEFAULT_Y,
)
@ -28,7 +29,7 @@ if TYPE_CHECKING:
from dzgui.views.base import OuterWindow
from dzgui.views.trees.tree_servers import ServerTreeView
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class ConfigManager:

View File

@ -2,6 +2,7 @@ import gi
import logging
from typing import TYPE_CHECKING
from dzgui.const.constants import APP_NAME
from dzgui.const.enum import ContextMenu, Preferences
from dzgui.util.clip import copy_clipboard
from dzgui.util.open_links import open_workshop_page
@ -14,7 +15,7 @@ gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib, GObject # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller

View File

@ -1,8 +1,10 @@
import logging
from pathlib import Path
from dzgui.const.constants import APP_NAME
from dzgui.util.strings import delimiter
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class LogManager:

View File

@ -2,6 +2,8 @@ import json
import logging
from typing import TYPE_CHECKING
from dzgui.const.constants import APP_NAME
from dzgui.util._json import read_json
import gi
@ -12,7 +14,7 @@ if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
from pathlib import Path
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class NoteManager:

View File

@ -5,6 +5,8 @@ from typing import Any, TYPE_CHECKING
from functools import wraps
from typing import Callable
from dzgui.const.constants import APP_NAME
from dzgui.views.dialogs.generic import WaitDialog
if TYPE_CHECKING:
@ -15,7 +17,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def call_on_thread(dialog_str: str) -> Callable:

View File

@ -7,11 +7,12 @@ from dataclasses import dataclass
from typing import Any, TYPE_CHECKING
import dzgui.api.servers as Servers
from dzgui.const.enum import FilterMode, Preferences, ServerTab
from dzgui.const.constants import (
APPID_DAYZ,
APPID_DAYZ_EXP,
APP_NAME,
)
from dzgui.const.enum import FilterMode, Preferences, ServerTab
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
from dzgui.util.strings import api_warn_msg, dialog
from dzgui.views.dialogs.generic import ExceptionDialog
@ -21,15 +22,14 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa E402
LAN_TIMEOUT = 0.5
API_TIMEOUT = 3
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
from dzgui.model.proxy_model import ProxyModelManager
from dzgui.views.trees.tree_servers import ServerTreeView
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
LAN_TIMEOUT = 0.5
API_TIMEOUT = 3
@dataclass
@ -336,7 +336,6 @@ class ServerModelManager:
proxy = self._get_proxy_man().get_proxy_model()
self.tv.set_model(proxy)
# TODO: animate saved servers tab if we are on other tab
self.emitter.emit("servers_loaded", self.enum)
filter_man = self.tv.get_filter_man()

View File

@ -1,9 +1,10 @@
import logging
from math import radians, cos, sin, asin, sqrt
from typing import Self, TYPE_CHECKING
from typing import TYPE_CHECKING
from dzgui.util.ip import GeolocationError, get_coords
from dzgui.const.constants import APP_NAME
from dzgui.util.ip import get_coords
import gi
@ -15,7 +16,7 @@ if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
from queue import Queue
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class Haversine:

View File

@ -2,13 +2,14 @@ import logging
from pathlib import Path
from dzgui.api.mods import get_local_mod_path, get_local_mod_ids, _hash
from dzgui.const.constants import APPID_DAYZ, APPID_DAYZ_EXP
from dzgui.const.constants import APPID_DAYZ, APPID_DAYZ_EXP, APP_NAME
from dzgui.const.enum import Preferences
from dzgui.config.query import lookup
import dzgui.api.pefile as PeFile
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
def rebuild_symlinks(config: Path) -> None:
path = lookup(config, Preferences.DEFAULT)

View File

@ -35,7 +35,7 @@ gi.require_version("Gtk", "3.0")
gi.require_version("GLibUnix", "2.0")
from gi.repository import Gtk, GLib, GLibUnix, Gdk, GObject, Pango # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
# https://bugzilla.gnome.org/show_bug.cgi?id=708676
warnings.filterwarnings("ignore", ".*g_value_get_int", Warning)

View File

@ -1,15 +1,15 @@
import logging
from typing import TYPE_CHECKING
from dzgui.const.constants import APP_NAME, NO_EXPAND, NO_FILL, NO_PADDING
from dzgui.const.enum import ButtonType
from dzgui.const.constants import NO_EXPAND, NO_FILL, NO_PADDING
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.emitter import Emitter

View File

@ -1,8 +1,15 @@
import logging
from typing import Literal, TYPE_CHECKING
from dzgui.const.constants import (
APP_NAME,
EXPAND,
NO_EXPAND,
NO_FILL,
NO_PADDING,
SEARCH_ICON,
)
from dzgui.const.enum import FilterMode
from dzgui.const.constants import EXPAND, NO_EXPAND, NO_FILL, NO_PADDING, SEARCH_ICON
from dzgui.model.servers import ServerModelManager
from dzgui.util.strings import all_maps
from dzgui.views.components.maps_combo import MapsCombo
@ -13,7 +20,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, Pango, GLib # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller

View File

@ -78,6 +78,10 @@ class ServerDetailsDialog(ServerDialog):
column.set_sort_column_id(i)
column.set_expand(True)
# NOTE: constrain tree area to logical height of metadata
# leaving room for server message
self.scrollable_tree.set_size_request(700, 150)
# TODO: make "Server message" text boldface
scrollable_message = Gtk.ScrolledWindow()
desc = Gtk.Label(label=strings.server_message, valign=Gtk.Align.START)

View File

@ -1,4 +1,6 @@
import logging
from dzgui.const.constants import APP_NAME
from dzgui.const.enum import ContextMenu
from dzgui.util.keys import is_navkey
from dzgui.util.strings import edit_note
@ -9,8 +11,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class ContextMixin(TreeView):

View File

@ -3,7 +3,7 @@ import logging
from typing import TYPE_CHECKING
from importlib import resources
from dzgui.const.constants import APP_NAME_LOWER, CHANGELOG_PATH
from dzgui.const.constants import APP_NAME, APP_NAME_LOWER, CHANGELOG_PATH
from dzgui.util.strings import missing_changelog
from dzgui.util.format import format_pango
from dzgui.views.mixins.help_menu_mixin import HelpMenuMixin
@ -14,7 +14,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller

View File

@ -25,10 +25,10 @@ class Log(CursorMixin, HelpMenuMixin, Gtk.Box): # type: ignore
self.check_bar = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
# TODO: strings
active = (
"WARNING",
"WARN",
"CRITICAL",
)
for check in ("WARNING", "CRITICAL", "INFO", "DEBUG"):
for check in ("WARN", "CRITICAL", "INFO", "DEBUG"):
c = Gtk.CheckButton(label=check)
self.check_bar.pack_start(c, False, False, 0)
if check in active:

View File

@ -2,6 +2,7 @@ import logging
from typing import Optional, Self, TYPE_CHECKING
from dzgui.cosnt.constants import APP_NAME
from dzgui.const.enum import ContextMenuGroup, ServerTab
from dzgui.views.trees.tree_servers import ServerTreeView
from dzgui.util.strings import server_labels
@ -11,7 +12,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, GLib # noqa E402
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller

View File

@ -3,7 +3,7 @@ import logging
from typing import Any, Optional, TYPE_CHECKING
from warnings import deprecated
from dzgui.const.constants import SEPARATOR
from dzgui.const.constants import APP_NAME, SEPARATOR
from dzgui.util.keys import is_navkey
from dzgui.views.mixins.cursor_mixin import CursorMixin
@ -12,7 +12,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller

View File

@ -2,6 +2,7 @@ import logging
from typing import Any, TYPE_CHECKING
from dzgui.const.cosntants import APP_NAME
from dzgui.const.enum import ContextMenuGroup
from dzgui.model.model_factory import ModelFactory
from dzgui.util import strings
@ -17,7 +18,7 @@ if TYPE_CHECKING:
from pathlib import Path
from dzgui.controllers.mc import Controller
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class LogTreeView(ContextMixin, TreeView):

View File

@ -1,6 +1,7 @@
import logging
from typing import Any, TYPE_CHECKING
from typing import TYPE_CHECKING
from dzgui.const.constants import APP_NAME
from dzgui.const.enum import RowType, NotebookPage
from dzgui.model.model_factory import ModelFactory
from dzgui.util.open_links import open_link_by_rowtype
@ -11,7 +12,7 @@ import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller

View File

@ -1,7 +1,7 @@
import logging
from typing import Any, TYPE_CHECKING
from dzgui.const.constants import HEX_RED
from dzgui.const.constants import APP_NAME, HEX_RED
from dzgui.const.enum import ContextMenuGroup
from dzgui.util import strings, localize
from dzgui.views.mixins.context_mixin import ContextMixin
@ -18,7 +18,7 @@ if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
from dzgui.controllers.emitter import Emitter
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
class ModTreeView(ModsMixin, ContextMixin, TreeView):

View File

@ -5,13 +5,14 @@ from queue import Queue
from typing import Any, Optional, Self
from warnings import deprecated
from dzgui.views.mixins.context_mixin import ContextMixin
from dzgui.const.enum import ContextMenu, ContextMenuGroup, Preferences, ServerTab
from dzgui.api.servers import ping, Record
from dzgui.const.constants import APP_NAME
from dzgui.const.enum import ContextMenu, ContextMenuGroup, Preferences, ServerTab
from dzgui.managers.filter import FilterManager
from dzgui.model.proxy_model import ProxyModelManager
from dzgui.util.dist import CalcDist
from dzgui.util import strings
from dzgui.util.dist import CalcDist
from dzgui.views.mixins.context_mixin import ContextMixin
from typing import Literal, TYPE_CHECKING
@ -24,7 +25,7 @@ gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
logger = logging.getLogger(__name__)
logger = logging.getLogger(APP_NAME)
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller