#!/usr/bin/env python # -*- coding: utf-8 -*- import os import datetime import json class Logs(object): """ Manage logs Example as config file. """ file = None logs = [] result = None save = False clear = False display = False level = 'INFO' date_format = '%Y-%m-%d %H:%M:%S' levels = { 0: 'INFO', 1: 'DEBUG', 2: 'WARNING', 3: 'CRITICAL', 4: 'ERROR', } def __init__(self, file=None, save=None, clear=False, date_format=None, display=None, level=None): self.set_save(save=save) self.set_date_format(date_format=date_format) self.set_display(display=display) self.set_level(level=level) self.set_file(file=file) self.set_clear(clear=clear) def set_file(self, file=None): if file is not None: self.file = file if not os.path.isfile(self.file): with open(self.file, 'w') as file: pass def set_clear(self, clear=None): if clear is not None: self.clear = clear with open(self.file, 'w') as file: pass def set_save(self, save=None): if save is not None: self.save = save def set_display(self, display=None): if display is not None: self.display = display def set_level(self, level=None): if level is not None: self.level = level def set_date_format(self, date_format=None): if date_format is not None: self.date_format = date_format def get_message(self, log, template=None): template = '{now} - {level}: {message}' if template is None else template return template.format(now=log['timestamp'], level=log['level'], message=log['message']) def get_level_code(self, level=None): level = self.level if level is None else level return list(self.levels.keys())[list(self.levels.values()).index(level)] def add(self, message='', data=None, level='INFO', save=None, display=None): save = save if save is not None else self.save display = display if display is not None else self.display if self.get_level_code(level) >= self.get_level_code(): now = datetime.datetime.today().strftime(self.date_format) log = { 'timestamp': now, 'level': level, 'level_code': self.get_level_code(level), 'message': message } if data is not None: log.update(data) self.logs.append(log) log_message = self.get_message(log) if save: with open(self.file, 'a') as file: file.write(log_message + '\n') if display: print(log_message) return self def info(self, message='', data=None, save=None): self.add(message=message, data=data, level='INFO', save=save) def debug(self, message='', data=None, save=None): self.add(message=message, data=data, level='DEBUG', save=save) def warning(self, message='', data=None, save=None): self.add(message=message, data=data, level='WARNING', save=save) def critical(self, message='', data=None, save=None): self.add(message=message, data=data, level='CRITICAL', save=save) def error(self, message='', data=None, save=None): self.add(message=message, data=data, level='ERROR', save=save) def where(self, search=None, limit=10): where = [s.strip() for s in '+'.join(search).split('+')] if search and search is not None else None with open(self.file, 'r') as file: if where and where is not None: logs = [] for log in log_file: nb_true = 0 for w in where: if w.strip().lower() in log.lower(): nb_true += 1 if nb_true == len(where): logs.append(log.strip()) else: logs = [log.strip() for log in log_file.readlines()] logs.reverse() self.result = logs[:limit] if limit else logs return self def result(self, format=None, level=None): self.set_level(level=level) level_code = self.get_level_code(level) keep_logs = [log for log in self.logs if log['level_code'] >= level_code] if format == 'json': return json.dumps(keep_logs, indent = 4) if format == 'text': rows = [self.get_message(log) for log in keep_logs] return "\n".join(rows) def json(self, level=None): self.result('json', level) def text(self, level=None): self.result('text', level) if __name__ == '__main__': file = './test.json' data = dict_file = [{'sports': ['soccer', 'football', 'basketball', 'cricket', 'hockey', 'table tennis']}, {'countries': ['Pakistan', 'USA', 'India', 'China', 'Germany', 'France', 'Spain']}] print(Yaml.set(data, file, True)) print(Yaml.set(file))