diff --git a/rare/app.py b/rare/app.py index ef48f817..9860f4a3 100644 --- a/rare/app.py +++ b/rare/app.py @@ -1,6 +1,5 @@ import logging import os -import platform import shutil import sys import time @@ -9,13 +8,11 @@ from argparse import Namespace from datetime import datetime from typing import Optional -import legendary import requests.exceptions -from PyQt5.QtCore import QThreadPool, QTimer, QT_VERSION_STR, PYQT_VERSION_STR +from PyQt5.QtCore import QThreadPool, QTimer from PyQt5.QtWidgets import QApplication, QMessageBox from requests import HTTPError -import rare from rare.components.dialogs.launch_dialog import LaunchDialog from rare.components.main_window import MainWindow from rare.shared import ( @@ -27,7 +24,6 @@ from rare.shared.rare_core import RareCore from rare.utils import legendary_utils, config_helper, paths from rare.widgets.rare_app import RareApp - logger = logging.getLogger("Rare") @@ -52,49 +48,8 @@ def excepthook(exc_type, exc_value, exc_tb): class App(RareApp): def __init__(self, args: Namespace): - super(App, self).__init__(args) - - start_time = time.strftime("%y-%m-%d--%H-%M") # year-month-day-hour-minute - file_name = os.path.join(paths.log_dir(), f"Rare_{start_time}.log") - - for handler in logging.root.handlers[:]: - logging.root.removeHandler(handler) - - file_handler = logging.FileHandler(filename=file_name, encoding="utf-8") - file_handler.setFormatter(fmt=logging.Formatter("[%(name)s] %(levelname)s: %(message)s")) - - # configure logging - if args.debug: - logging.basicConfig( - format="[%(name)s] %(levelname)s: %(message)s", - level=logging.DEBUG, - stream=sys.stderr, - ) - file_handler.setLevel(logging.DEBUG) - logging.root.addHandler(file_handler) - logging.getLogger().setLevel(level=logging.DEBUG) - # keep requests, asyncio and pillow quiet - logging.getLogger("requests").setLevel(logging.WARNING) - logging.getLogger("urllib3").setLevel(logging.WARNING) - logging.getLogger("asyncio").setLevel(logging.WARNING) - logger.info( - f"Launching Rare version {rare.__version__} Codename: {rare.code_name}\n" - f" - Using Legendary {legendary.__version__} Codename: {legendary.__codename__} as backend\n" - f" - Operating System: {platform.system()}, Python version: {platform.python_version()}\n" - f" - Running {sys.executable} {' '.join(sys.argv)}\n" - f" - Qt version: {QT_VERSION_STR}, PyQt version: {PYQT_VERSION_STR}" - ) - else: - logging.basicConfig( - format="[%(name)s] %(levelname)s: %(message)s", - level=logging.INFO, - stream=sys.stderr, - ) - file_handler.setLevel(logging.INFO) - logging.root.addHandler(file_handler) - logger.info(f"Launching Rare version {rare.__version__}") - logger.info(f"Operating System: {platform.system()}") - + log_file = "Rare_{0}.log" + super(App, self).__init__(args, log_file) self.rare_core = RareCore(args=args) self.args = ArgumentsSingleton() self.signals = GlobalSignalsSingleton() diff --git a/rare/game_launch_helper/__init__.py b/rare/game_launch_helper/__init__.py index ac97e272..09b3b0a4 100644 --- a/rare/game_launch_helper/__init__.py +++ b/rare/game_launch_helper/__init__.py @@ -17,6 +17,8 @@ from .console import Console from .lgd_helper import get_launch_args, InitArgs, get_configured_process, LaunchArgs, GameArgsError from .message_models import ErrorModel, Actions, FinishedModel, BaseModel, StateChangedModel +logger = logging.getLogger("RareLauncher") + class PreLaunchThread(QRunnable): class Signals(QObject): @@ -65,7 +67,8 @@ class GameProcessApp(RareApp): success: bool = True def __init__(self, args: Namespace): - super(GameProcessApp, self).__init__(args) + log_file = f"Rare_Launcher_{args.app_name}" + "_{0}.log" + super(GameProcessApp, self).__init__(args, log_file) self.game_process = QProcess() self.app_name = args.app_name self.logger = getLogger(self.app_name) @@ -206,10 +209,6 @@ class GameProcessApp(RareApp): def start_game(args: Namespace): args = InitArgs.from_argparse(args) - logging.basicConfig( - format="[%(name)s] %(levelname)s: %(message)s", - level=logging.INFO, - ) app = GameProcessApp(args) app.setQuitOnLastWindowClosed(True) diff --git a/rare/game_launch_helper/lgd_helper.py b/rare/game_launch_helper/lgd_helper.py index 7e82960c..1ef18e93 100644 --- a/rare/game_launch_helper/lgd_helper.py +++ b/rare/game_launch_helper/lgd_helper.py @@ -25,6 +25,7 @@ class InitArgs: skip_version_check: bool = False wine_prefix: str = "" wine_bin: str = "" + debug: str = "" @classmethod def from_argparse(cls, args): @@ -33,7 +34,8 @@ class InitArgs: offline=args.offline, skip_version_check=args.skip_update_check, wine_bin=args.wine_bin, - wine_prefix=args.wine_pfx + wine_prefix=args.wine_pfx, + debug=args.debug, ) diff --git a/rare/widgets/rare_app.py b/rare/widgets/rare_app.py index 7d1bed82..86097096 100644 --- a/rare/widgets/rare_app.py +++ b/rare/widgets/rare_app.py @@ -1,24 +1,24 @@ +import logging import os +import platform import sys +import time from argparse import Namespace -from logging import getLogger -from PyQt5.QtCore import Qt, QSettings, QTranslator +import legendary +from PyQt5.QtCore import Qt, QSettings, QTranslator, QT_VERSION_STR, PYQT_VERSION_STR from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QApplication -# noinspection PyUnresolvedReferences -from legendary.core import LegendaryCore - import rare.resources.resources from rare.utils import paths from rare.utils.misc import set_color_pallete, set_style_sheet class RareApp(QApplication): - logger = getLogger("RareApp") + logger = logging.getLogger("RareApp") - def __init__(self, args: Namespace): + def __init__(self, args: Namespace, log_file: str): super(RareApp, self).__init__(sys.argv) self.setQuitOnLastWindowClosed(False) if hasattr(Qt, "AA_UseHighDpiPixmaps"): @@ -26,7 +26,53 @@ class RareApp(QApplication): self.setApplicationName("Rare") self.setOrganizationName("Rare") + + # Create directories after QStandardPaths has been initialized paths.create_dirs() + + # Clean any existing logging handlers from library imports + for handler in logging.root.handlers[:]: + logging.root.removeHandler(handler) + + start_time = time.strftime("%y-%m-%d--%H-%M") # year-month-day-hour-minute + file_handler = logging.FileHandler( + filename=os.path.join(paths.log_dir(), log_file.format(start_time)), + encoding="utf-8", + ) + file_handler.setFormatter(fmt=logging.Formatter("[%(name)s] %(levelname)s: %(message)s")) + + # Set up common logging channel to stderr + if args.debug: + logging.basicConfig( + format="[%(name)s] %(levelname)s: %(message)s", + level=logging.DEBUG, + stream=sys.stderr, + ) + file_handler.setLevel(logging.DEBUG) + logging.root.addHandler(file_handler) + logging.getLogger().setLevel(level=logging.DEBUG) + # keep requests, asyncio and pillow quiet + logging.getLogger("requests").setLevel(logging.WARNING) + logging.getLogger("urllib3").setLevel(logging.WARNING) + logging.getLogger("asyncio").setLevel(logging.WARNING) + self.logger.info( + f"Launching Rare version {rare.__version__} Codename: {rare.code_name}\n" + f" - Using Legendary {legendary.__version__} Codename: {legendary.__codename__} as backend\n" + f" - Operating System: {platform.system()}, Python version: {platform.python_version()}\n" + f" - Running {sys.executable} {' '.join(sys.argv)}\n" + f" - Qt version: {QT_VERSION_STR}, PyQt version: {PYQT_VERSION_STR}" + ) + else: + logging.basicConfig( + format="[%(name)s] %(levelname)s: %(message)s", + level=logging.INFO, + stream=sys.stderr, + ) + file_handler.setLevel(logging.DEBUG) + logging.root.addHandler(file_handler) + self.logger.info(f"Launching Rare version {rare.__version__}") + self.logger.info(f"Operating System: {platform.system()}") + self.settings = QSettings() # Translator