import os import datetime import locale from threading import Thread import queue from src.functions import dump_queue def get_today(tz): today = datetime.datetime.now(tz=tz) locale.setlocale(locale.LC_TIME, 'es_ES') return today class Logger: """ Clase que lleva el diario de actividades de la secretaria """ def __init__(self, log_folder, timezone, name): self.folder = log_folder self.tz = timezone self.name = name self.messages = [] def get_filename(self): files = [f for f in os.listdir(self.folder) if os.path.isfile(os.path.join(self.folder, f)) and 'diary' in f] today = datetime.datetime.now(tz=self.tz) if len(files) == 0: return os.path.join(self.folder, self.name + '-diary-{0}.log'.format(today.strftime('%Y-%m-%d'))) last = files[-1] return os.path.join(self.folder, last) def start_new(self): today = datetime.datetime.now(tz=self.tz) filename = os.path.join(self.folder, self.name + '-diary-{0}.log'.format(today.strftime('%Y-%m-%d'))) with open(filename, 'w') as f: pass def start_log(self): today = datetime.datetime.now(tz=self.tz) locale.setlocale(locale.LC_TIME, 'es_ES') msg = 'Inicio una nueva jornada siendo las {0} del {1}'.format(today.strftime('%H:%M:%S'), today.strftime('%d de %B de %Y')) self.log(msg) def stop_log(self): now = datetime.datetime.now(tz=self.tz) locale.setlocale(locale.LC_TIME, 'es_ES') msg = 'Siendo las {0}, termino mis registros por esta jornada'.format(now.strftime('%H:%M:%S')) self.log(msg) msg = '--------' self.log(msg) def log_action(self, action): msg = 'he realizado {0}'.format(action) self.log_msg(msg) def log_not_action(self, action): msg = 'no he podido realizar {0}'.format(action) self.log_msg(msg) def start_turn(self, action): self.log_msg('Inicio de turno de {0}'.format(action)) def end_turn(self, action): self.log_msg('Termino de turno de {0}'.format(action)) def log_msg(self, msg): today = get_today(self.tz) line = 'A las {0} del {1}, {2}'.format(today.strftime('%H:%M:%S'), today.strftime('%d de %B de %Y'), msg) self.log(line) def log(self, message): line = message if line[-1] != '.' and line != '--------': line = line.rstrip('.') + '.' self.messages.append(line) if len(self.messages) > 1000: self.start_new() with open(self.get_filename(), 'a') as f: f.write(line + "\n") class Worker(Thread): def __init__(self, params, configs): super().__init__() self.event = params['events']['log_stop'] self.queue = params['queues']['log'] self.wait = configs.get('supervisor.wait') self.logger = Logger(params['folders']['log'], configs.get('timezone'), params['logger']['name']) self.logging = params['logging'] def parse_message(self, message): if 'is_start' in message and message['is_start']: self.logger.start_log() return if 'action' in message: if 'not' in message and message['not']: self.logger.log_not_action(message['action']) return self.logger.log_action(message['action']) return if 'start_turn' in message: self.logger.start_turn(message['start_turn']) return if 'end_turn' in message: self.logger.end_turn(message['end_turn']) return self.logger.log_msg(message['message']) def run(self): self.logging.log('Starting', caller=type(self)) self.queue.put({'is_start': True}) while not self.event.is_set(): try: message = self.queue.get(timeout=self.wait) self.logging.log('Logger received message', caller=type(self)) self.parse_message(message) except queue.Empty: continue [self.parse_message(message) for message in dump_queue(self.queue, self.wait)] self.logger.stop_log() self.logging.log('Exiting', caller=type(self))