from ujson import loads from os import stat, makedirs, path, getcwd from gzip import open as gzipopen from shutil import copyfileobj from datetime import datetime with open(getcwd()+path.sep+"config.json", "r", encoding='utf8') as file: json_contents = loads(file.read()) log_size = json_contents["logging"]["size"] log_folder = json_contents["logging"]["location"] file.close() # Check latest log size def checkSize(debug=False): """Check size of latest.log file and rotate it if needed ### Args: * debug (`bool`, *optional*): Whether this is a debug log. Defaults to `False`. """ global log_folder if debug: log_file = "debug.log" else: log_file = "latest.log" try: makedirs(log_folder, exist_ok=True) log = stat(path.join(log_folder, log_file)) if (log.st_size / 1024) > log_size: with open(path.join(log_folder, log_file), 'rb') as f_in: with gzipopen(path.join(log_folder, f'{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz'), 'wb') as f_out: copyfileobj(f_in, f_out) print(f'Copied {path.join(log_folder, datetime.now().strftime("%d.%m.%Y_%H:%M:%S"))}.log.gz') open(path.join(log_folder, log_file), 'w').close() except FileNotFoundError: print(f'Log file {path.join(log_folder, log_file)} does not exist') pass # Append string to log def logAppend(message: str, debug=False): """Write message to log file ### Args: * message (`str`): Message to write * debug (`bool`, *optional*): Whether this is a debug log. Defaults to `False`. """ global log_folder message_formatted = f'[{datetime.now().strftime("%d.%m.%Y")}] [{datetime.now().strftime("%H:%M:%S")}] {message}' checkSize(debug=debug) if debug: log_file = "debug.log" else: log_file = "latest.log" log = open(path.join(log_folder, log_file), 'a') log.write(f'{message_formatted}\n') log.close() # Print to stdout and then to log def logWrite(message: str, debug=False): """Write message to stdout and log file ### Args: * message (`str`): Message to print and write * debug (`bool`, *optional*): Whether this is a debug log. Defaults to `False`. """ # save to log file and rotation is to be done logAppend(f'{message}', debug=debug) print(f"{message}", flush=True)