Guillaume RYCKELYNCK c6c2ee9c04 first commit
2024-06-22 22:00:42 +02:00

182 lines
5.3 KiB
Python

#!/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))