logs are now written in log files

This commit is contained in:
zurdi
2023-08-01 13:06:11 +02:00
parent e095f23d36
commit fd5ffb347a
7 changed files with 130 additions and 72 deletions

View File

@@ -1,7 +1,7 @@
import emoji
import json
import emoji
from logger.logger import log, COLORS
from logger.logger import log
from utils import fs, fastapi
from utils.exceptions import PlatformsNotFoundException, RomsNotFoundException
from handler import dbh
@@ -9,40 +9,58 @@ from models.platform import Platform
from models.rom import Rom
async def scan(_sid: str, platforms: str, complete_rescan: bool=True, sm=None):
async def scan(_sid: str, platforms: str, complete_rescan: bool = True, sm = None):
"""Scan platforms and roms and write them in database."""
log.info(emoji.emojize(":magnifying_glass_tilted_right: Scanning "))
fs.store_default_resources()
try: # Scanning platforms
try: # Scanning platforms
fs_platforms: list[str] = fs.get_platforms()
except PlatformsNotFoundException as e:
log.error(e); await sm.emit('scan:done_ko', e.message); return
platforms: list[str] = json.loads(platforms) if len(json.loads(platforms)) > 0 else fs_platforms
log.error(e)
await sm.emit("scan:done_ko", e.message)
return
platforms: list[str] = (
json.loads(platforms) if len(json.loads(platforms)) > 0 else fs_platforms
)
log.info(f"Platforms to be scanned: {', '.join(platforms)}")
for platform in platforms:
log.info(emoji.emojize(f":video_game: {platform} {COLORS['reset']}"))
log.info(emoji.emojize(f":video_game: {platform}"))
try:
scanned_platform: Platform = fastapi.scan_platform(platform)
except RomsNotFoundException as e:
log.error(e); continue
await sm.emit('scan:scanning_platform', [scanned_platform.name, scanned_platform.slug]); await sm.emit('') # Workaround to emit in real-time
if platform != str(scanned_platform): log.info(f"Identified as {COLORS['blue']}{scanned_platform}{COLORS['reset']}")
log.error(e)
continue
await sm.emit(
"scan:scanning_platform", [scanned_platform.name, scanned_platform.slug]
)
await sm.emit("") # Workaround to emit in real-time
if platform != str(scanned_platform):
log.info(
f"Identified as {scanned_platform}"
)
dbh.add_platform(scanned_platform)
# Scanning roms
fs_roms: list[str] = fs.get_roms(scanned_platform.fs_slug)
for rom in fs_roms:
rom_id: int = dbh.rom_exists(scanned_platform.slug, rom['file_name'])
if rom_id and not complete_rescan: continue
await sm.emit('scan:scanning_rom', rom['file_name']); await sm.emit('') # Workaround to emit in real-time
log.info(f"Scanning {COLORS['orange']}{rom['file_name']}{COLORS['reset']}")
if rom['multi']: [log.info(f"\t - {COLORS['orange_i']}{file}{COLORS['reset']}") for file in rom['files']]
rom_id: int = dbh.rom_exists(scanned_platform.slug, rom["file_name"])
if rom_id and not complete_rescan:
continue
await sm.emit("scan:scanning_rom", rom["file_name"])
await sm.emit("") # Workaround to emit in real-time
log.info(f"\t - {rom['file_name']}")
if rom["multi"]:
[
log.info(f"\t\t · {file}")
for file in rom["files"]
]
scanned_rom: Rom = fastapi.scan_rom(scanned_platform, rom)
if rom_id: scanned_rom.id = rom_id
if rom_id:
scanned_rom.id = rom_id
dbh.add_rom(scanned_rom)
dbh.purge_roms(scanned_platform.slug, [rom['file_name'] for rom in fs_roms])
dbh.purge_roms(scanned_platform.slug, [rom["file_name"] for rom in fs_roms])
dbh.purge_platforms(fs_platforms)
await sm.emit('scan:done')
await sm.emit("scan:done")

View File

@@ -1,7 +1,7 @@
from fastapi import APIRouter, Request
import emoji
from logger.logger import log, COLORS
from logger.logger import log
from handler import igdbh
router = APIRouter()
@@ -20,14 +20,14 @@ async def search_rom_igdb(
if search_term:
log.info(f"Searching by {search_by}: {search_term}")
if search_by == "ID":
if search_by.lower() == "id":
matched_roms = igdbh.get_matched_rom_by_id(search_term)
elif search_by == "Name":
elif search_by.lower() == "name":
matched_roms = igdbh.get_matched_roms_by_name(search_term, rom["p_igdb_id"])
else:
log.info(
emoji.emojize(
f":video_game: {rom['p_slug']}: {COLORS['orange']}{rom['file_name']}{COLORS['reset']}"
f":video_game: {rom['p_slug']}: {rom['file_name']}"
)
)
matched_roms = igdbh.get_matched_roms(
@@ -37,7 +37,7 @@ async def search_rom_igdb(
log.info("Results:")
[
log.info(f"\t - {COLORS['blue']}{rom['r_name']}{COLORS['reset']}")
log.info(f"\t - {rom['r_name']}")
for rom in matched_roms
]

View File

@@ -0,0 +1,11 @@
COLORS: dict = {
'grey': '\033[92m',
'pink': '\033[95m',
'blue': '\033[94m',
'cyan': '\033[96m',
'orange': '\033[93m',
'orange_i': '\033[3;93m',
'red': '\033[91m',
'bold_red': '\033[1;91m',
'reset': '\033[0m',
}

View File

@@ -0,0 +1,23 @@
import logging
class FileFormatter(logging.Formatter):
level: str = "%(levelname)s"
dots: str = ":"
identifier: str = "\t [RomM]"
identifier_warning: str = " [RomM]"
identifier_critical: str = " [RomM]"
msg: str = "%(message)s"
date: str = "[%(asctime)s] "
FORMATS: dict = {
logging.DEBUG: level + dots + identifier + date + msg,
logging.INFO: level + dots + identifier + date + msg,
logging.WARNING: level + dots + identifier_warning + date + msg,
logging.ERROR: level + dots + identifier + date + msg,
logging.CRITICAL: level + dots + identifier_critical + date + msg
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(fmt=log_fmt, datefmt='%Y-%m-%d %H:%M:%S')
return formatter.format(record)

View File

@@ -1,48 +1,28 @@
import logging
import os
import sys
from datetime import datetime
from pathlib import Path
COLORS: dict = {
'grey': '\033[92m',
'pink': '\033[95m',
'blue': '\033[94m',
'cyan': '\033[96m',
'orange': '\033[93m',
'orange_i': '\033[3;93m',
'red': '\033[91m',
'bold_red': '\033[1;91m',
'reset': '\033[0m',
}
class CustomFormatter(logging.Formatter):
level: str = "%(levelname)s"
dots: str = ":"
identifier: str = "\t [RomM]"
identifier_warning: str = " [RomM]"
identifier_critical: str = " [RomM]"
msg: str = "%(message)s"
date: str = "[%(asctime)s] "
FORMATS: dict = {
logging.DEBUG: COLORS['pink'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.INFO: COLORS['grey'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.WARNING: COLORS['orange'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier_warning + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.ERROR: COLORS['red'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.CRITICAL: COLORS['bold_red'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier_critical + COLORS['cyan'] + date + COLORS['reset'] + msg
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(fmt=log_fmt, datefmt='%Y-%m-%d %H:%M:%S')
return formatter.format(record)
from logger.stdout_formatter import StdoutFormatter
from logger.file_formatter import FileFormatter
# Create logs folder if not exists
logs_path = f"{os.getenv('ROMM_BASE_PATH')}/logs"
Path(logs_path).mkdir(parents=True, exist_ok=True)
now = datetime.now()
logs_file = f"{logs_path}/{now.strftime('%Y%m%d_%H%M%S')}.log"
# Get logger
log = logging.getLogger("romm")
log.setLevel(logging.DEBUG)
# define handler and formatter
handler = logging.StreamHandler()
# Define stdout handler
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setFormatter(StdoutFormatter())
log.addHandler(stdout_handler)
# add formatter to handler
handler.setFormatter(CustomFormatter())
# add handler to logger
log.addHandler(handler)
# Define file handler
file_handler = logging.FileHandler(logs_file)
file_handler.setFormatter(FileFormatter())
log.addHandler(file_handler)

View File

@@ -0,0 +1,25 @@
import logging
from logger import COLORS
class StdoutFormatter(logging.Formatter):
level: str = "%(levelname)s"
dots: str = ":"
identifier: str = "\t [RomM]"
identifier_warning: str = " [RomM]"
identifier_critical: str = " [RomM]"
msg: str = "%(message)s"
date: str = "[%(asctime)s] "
FORMATS: dict = {
logging.DEBUG: COLORS['pink'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.INFO: COLORS['grey'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.WARNING: COLORS['orange'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier_warning + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.ERROR: COLORS['red'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier + COLORS['cyan'] + date + COLORS['reset'] + msg,
logging.CRITICAL: COLORS['bold_red'] + level + COLORS['reset'] + dots + COLORS['blue'] + identifier_critical + COLORS['cyan'] + date + COLORS['reset'] + msg
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(fmt=log_fmt, datefmt='%Y-%m-%d %H:%M:%S')
return formatter.format(record)

View File

@@ -7,19 +7,20 @@ services:
container_name: romm
environment:
- ROMM_DB_DRIVER=mariadb # This variable can be set as: mariadb | sqlite. If it is not defined, sqlite will be the database by default
- DB_HOST=mariadb # Only needed if ROMM_DB_DRIVER=mariadb
- DB_PORT=3306 # Only needed if ROMM_DB_DRIVER=mariadb
- DB_USER=romm-user # Only needed if ROMM_DB_DRIVER=mariadb
- DB_NAME=romm # Only needed if ROMM_DB_DRIVER=mariadb. Can be optionally changed, and should match the MYSQL_DATABASE value in the mariadb container.
- DB_PASSWD=<database password> # Only needed if ROMM_DB_DRIVER=mariadb
- DB_HOST=mariadb # [Optional] Only needed if ROMM_DB_DRIVER=mariadb
- DB_PORT=3306 # [Optional] Only needed if ROMM_DB_DRIVER=mariadb
- DB_USER=romm-user # [Optional] Only needed if ROMM_DB_DRIVER=mariadb
- DB_NAME=romm # [Optional] Only needed if ROMM_DB_DRIVER=mariadb. Can be optionally changed, and should match the MYSQL_DATABASE value in the mariadb container.
- DB_PASSWD=<database password> # [Optional] Only needed if ROMM_DB_DRIVER=mariadb
- CLIENT_ID=<IGDB client id>
- CLIENT_SECRET=<IGDB client secret>
- STEAMGRIDDB_API_KEY=<SteamGridDB api key>
volumes:
- '/path/to/library:/romm/library'
- '/path/to/resources:/romm/resources'
- '/path/to/config.yml:/romm/config.yml'
- '/path/to/database:/romm/database' # Only needed if ROMM_DB_DRIVER=sqlite or ROMM_DB_DRIVER not exists
- '/path/to/resources:/romm/resources' # [Optional] Path where roms metadata (cover) are stored
- '/path/to/config.yml:/romm/config.yml' # [Optional] Path where config is stored
- '/path/to/database:/romm/database' # [Optional] Only needed if ROMM_DB_DRIVER=sqlite or ROMM_DB_DRIVER not exists
- '/path/to/logs:/romm/logs' # [Optional] Path where RomM logs are stored
ports:
- 80:80
depends_on: