2025-06-24 14:22:50 +02:00

87 lines
2.0 KiB
Python

import logging
import sys
import time
from logging.config import dictConfig
from typing import Sized
import urllib3
from core.Env import Env
from core.extend import fs
logFile = fs.getPath(__file__, f"../../logs/{Env.LOGGING_DIR}.log").resolve()
logFile.parent.mkdir(parents=True, exist_ok=True)
# WARGNINGS
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# ERRORS ON WINDOWS CONSOLE
sys.stdin.reconfigure(encoding='utf-8')
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding='utf-8')
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'default': {
'format': "%(asctime)s | %(processName)s | %(module)40s:%(lineno)-3d | %(levelname)-7s | %(message)s",
'datefmt': "%Y.%m.%d %H:%M:%S",
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'default',
'stream': sys.stderr,
},
'file': {
'level': 'DEBUG',
'class': "logging.handlers.RotatingFileHandler",
'formatter': 'default',
'encoding': 'UTF-8',
"filename": logFile,
"maxBytes": 1e9,
"backupCount": 10,
},
},
'loggers': {
'app.services.PostaApiService': {
'level': 'WARN'
},
'sqlalchemy.engine.Engine': {
'level': 'WARN'
},
'': {
'handlers': ['console', 'file'],
'level': 'INFO',
'propagate': True
}
}
})
log = logging.getLogger(__name__)
class Progress:
def __init__(self, title: str, iter: Sized | int):
self.title = title
self.size = len(iter) if isinstance(iter, Sized) else iter
self.startTime = time.time()
self.nowTime = self.startTime
def log(self, i: int, info: str = None) -> callable:
nowTime = time.time()
if nowTime - self.nowTime > 1:
percent = round(i / self.size * 100, 2)
secondsPerIter = (nowTime - self.startTime) / (i + 1)
iterLeft = self.size - i
secondsLeft = secondsPerIter * iterLeft
minutesLeft = round(secondsLeft / 60, 2)
log.info(f"{self.title if info is None else info}: {percent}% => {iterLeft} => {minutesLeft} minutes")
self.nowTime = nowTime