182 lines
5.3 KiB
Python
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))
|