← source index

log.py

77 lines  ·  2.4 K  ·  python
import singleton
import utility
import globals

severity_level = [" ", " LOG: ", " WARNING: ", " ERROR: ", " FATAL: "]

class SEVERITY():
    NONE = 0
    WEAK = 1
    EASY = 2
    HARD = 3
    FATAL = 4
    
class Logger(metaclass=singleton.Singleton):    
    file = None
    util = None
    global_data = None

    def __init__(self):
        self.util = utility.Utility()
        self.global_data = globals.Globals()

    def open_log_file(self, path = None):
        if path == None:
            return
        
        time_now = self.util.get_time()[0].replace('/', '_')
        path = path + "." + time_now + ".txt"
        
        try:
            print("Attempting to open the log file... (" + path + ")")
            self.file = open(path, 'a+')
            print("Log file loaded successfully!")
            
        except:
            self.log(SEVERITY.HARD, "Could not open file at path '" + path + "'!")

    def log_cmd(self, severity, message, location):
        print("\n[" + self.util.get_time()[1] + "]" + severity_level[severity] + "\t" + message + "\n\t\t" + location)

    def log_file(self, severity, message, location):
        if self.file == None:
            self.log_cmd(severity, message, location)
            return 1

        try:
            self.file.write("\n[" + self.util.get_time()[1] + "]" + severity_level[severity] + "\t" + message + "\n\t\t" + location)

        except:
            self.file.close()
            self.log(SEVERITY.HARD, "Could not write to file!")
            self.log(severity, message)

        return 0

    def log(self, severity, message, err = None):
        self.open_log_file(self.global_data.log_path)
        
        filename, lineno = self.util.get_codeline()
        reason = ""
        location = "\tError thrown inside '" + filename + "' on line " + str(lineno) + "\n"

        if err != None: reason = "\n\t\t\tReason: " + str(err)
        flag = self.log_file(severity, message + reason, location)
        if flag == 0: self.log_cmd(severity, message + reason, location)

        if severity == SEVERITY.FATAL:
            self.global_data.program_running = False
            self.clear(False)
        
    def clear(self, flag = True):
        if flag:
            print("\t\t-clearing LOG data from memory...")
            
        if self.file != None:
            self.file.close()