diff --git a/Dockerfile b/Dockerfile index 321abac..e2bdb04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3 +FROM python:3-alpine # Build arguments for metadata ARG BUILD_DATE @@ -25,11 +25,6 @@ ENV PYTHONUNBUFFERED=1 \ # Set working directory WORKDIR /app -# Install system dependencies -RUN apt-get update && apt-get install -y \ - --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* - # Copy project metadata and install dependencies COPY pyproject.toml . diff --git a/docker-compose.yml b/docker-compose.yml index 18fb153..d294515 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,8 @@ services: volumes: # Mount data directory for persistent storage - ./data:/app/data + - ./logs:/app/logs environment: # Set timezone (optional, defaults to UTC) - - TZ=UTC + - TZ=Australia/Sydney restart: unless-stopped diff --git a/pyproject.toml b/pyproject.toml index 5bd2366..48af9b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "twitch-drops-miner" version = "1.1.2" # Update from src/version.py as needed description = "Automatically mine Twitch drops without downloading stream data" readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.12" dependencies = [ "aiohttp>=3.9", "truststore", diff --git a/src/__main__.py b/src/__main__.py index cd3bfb7..e040005 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -1,5 +1,4 @@ from __future__ import annotations - import argparse import asyncio import logging @@ -8,6 +7,7 @@ import sys import traceback import warnings from logging.handlers import TimedRotatingFileHandler +from pathlib import Path import truststore @@ -23,21 +23,27 @@ if __name__ == "__main__": from src.version import __version__ logger = logging.getLogger("TwitchDrops") - # Force INFO level logging by default for better visibility - logger.setLevel(logging.INFO) if logger.level < logging.INFO: logger.setLevel(logging.INFO) # Always add console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(FILE_FORMATTER) logger.addHandler(console_handler) + + # Create logs directory if it doesn't exist + logs_dir = Path("logs") + logs_dir.mkdir(exist_ok=True) + log_file = logs_dir / "TDM.log" + + # Add file handler for timestamped log + file_handler = TimedRotatingFileHandler(log_file, when="midnight", backupCount=5) + file_handler.setFormatter(FILE_FORMATTER) + logger.addHandler(file_handler) + logger.info("Logger initialized") warnings.simplefilter("default", ResourceWarning) - if sys.version_info < (3, 10): - raise RuntimeError("Python 3.10 or higher is required") - class ParsedArgs(argparse.Namespace): _verbose: int _debug_ws: bool @@ -101,22 +107,8 @@ if __name__ == "__main__": if settings.language: _.set_language(settings.language) - # Always log to file with timestamped filename in ./logs/ directory - from pathlib import Path - - # Create logs directory if it doesn't exist - logs_dir = Path("logs") - logs_dir.mkdir(exist_ok=True) - log_file = logs_dir / "TDM.log" - - # Add file handler for timestamped log - file_handler = TimedRotatingFileHandler(log_file, when="midnight", backupCount=5) - file_handler.setFormatter(FILE_FORMATTER) - logger.addHandler(file_handler) - logger.info(f"Logging to file: {log_file}") - - logging.getLogger("TwitchDrops.gql").setLevel(settings.debug_gql) - logging.getLogger("TwitchDrops.websocket").setLevel(settings.debug_ws) + # logging.getLogger("TwitchDrops.gql").setLevel(settings.debug_gql) + # logging.getLogger("TwitchDrops.websocket").setLevel(settings.debug_ws) logger.info("=== TwitchDropsMiner Starting ===") logger.info(f"Version: {__version__}") diff --git a/src/config/__init__.py b/src/config/__init__.py index f4996b7..5ec8c8f 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -17,7 +17,6 @@ from .constants import ( MAX_TOPICS, MAX_WEBSOCKETS, ONLINE_DELAY, - OUTPUT_FORMATTER, PING_INTERVAL, PING_TIMEOUT, TOPICS_PER_CHANNEL, @@ -45,7 +44,6 @@ __all__ = [ # constants.py "CALL", "FILE_FORMATTER", - "OUTPUT_FORMATTER", "LOGGING_LEVELS", "State", "WebsocketTopic", diff --git a/src/config/constants.py b/src/config/constants.py index d98e622..2bfa09c 100644 --- a/src/config/constants.py +++ b/src/config/constants.py @@ -27,11 +27,10 @@ LOGGING_LEVELS = { 4: logging.DEBUG, } FILE_FORMATTER = logging.Formatter( - "{asctime}.{msecs:03.0f}:\t{levelname:>7}:\t{filename}:{lineno}:\t{message}", + "{asctime}:\t{levelname:>7}:\t{filename}:{lineno}:\t{message}", style="{", - datefmt="%Y-%m-%d %H:%M:%S", + datefmt="%Y-%m-%dT%H:%M:%S%z", ) -OUTPUT_FORMATTER = logging.Formatter("{levelname}: {message}", style="{", datefmt="%H:%M:%S") # Type aliases JsonType = dict[str, Any] diff --git a/src/web/managers/console.py b/src/web/managers/console.py index 9e2c7ce..d83cc39 100644 --- a/src/web/managers/console.py +++ b/src/web/managers/console.py @@ -29,8 +29,8 @@ class ConsoleOutputManager: Args: message: The message to display """ - timestamp = datetime.now().strftime("%H:%M:%S") - line = f"[{timestamp}] {message}" + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + line = f"[{timestamp}] | {message}" self._buffer.append(line) asyncio.create_task(self._broadcaster.emit("console_output", {"message": line}))