Logger.py 1.82 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
# Essa classe deve ser usada como singleton
# O objetivo dela é prover uma interface centralizada para salvar os dados
# das aquisições de forma organizada
# 
# Todos os arquivos de log devem ser gerados através dela para manter consistência
# Para conhecer mais sobre o pattern de singleton utilizado, acesse
# https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html

# Classe externa, apenas interface para a interna

from datetime import datetime
from pathlib import Path

class Logger(object):
    # Classe de fato
    # Essa é uma classe privada que não pode ser acessada diretamente

    class __Logger(object):
        def __init__(self):
            today = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

            home = Path.home()
            self.logDir = Path.home() / "logs" / today
            self.logDir.mkdir(exist_ok=True)
            self.logs = {}

        def writeLog(self, name, text, timestamp=False, isCSV = False):
            if not name in self.logs:
                path = self.logDir / name
                if isCSV:
                    path = path.with_suffix(".csv")
                else:
                    path = path.with_suffix(".txt")
                self.logs[name] = path.open("a")

            log = self.logs[name]
            if timestamp:
                now = datetime.now().strftime("%Y-%m-%d-%H:%M:%S")
                log.write("[{}] {} \n".format(now, text))
            else:
                log.write("{} \n".format(text))

        def __del__(self):
            for key in self.logs:
                self.logs[key].close()

    instance = None
    def __init__(self):
        # Se não existe um Logger já criado, cria um
        if not Logger.instance:
            Logger.instance = Logger.__Logger()
    def __getattr__(self, name):
        return getattr(self.instance, name)