-
Notifications
You must be signed in to change notification settings - Fork 13
/
log.py
64 lines (45 loc) · 1.65 KB
/
log.py
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
54
55
56
57
58
59
60
61
62
63
"""
"""
from datetime import datetime, timedelta
from tinydb import TinyDB, Query
class Log:
"""Creates and uses a database for log persistence
"""
def __init__(self, file):
self.db = TinyDB(file)
def add(self, obj):
"""Add a log entry"""
# add a timestamp
obj["isodatetime"] = datetime.isoformat(datetime.now())
self.db.insert(obj)
self.clean()
def clean(self):
"""Keep only 1000 records from the last year. Delete others.
"""
def older_than_days(d_isoformat, days):
d = datetime.fromisoformat(d_isoformat)
age = timedelta(days=days)
now = datetime.now()
return d < (now - age)
self.db.remove(Query().isodatetime.test(older_than_days, 365))
max_length = 1000
if len(self.db) > max_length:
# sort in reverse order (oldest first)
sorted_records = sorted(self.db.all(),
key=lambda k: k['isodatetime'],
reverse=True)
for r in sorted_records[max_length:]:
self.db.remove(Query().isodatetime == r['isodatetime'])
print(f"removed {r['isodatetime']}")
def tail(self, n=1000):
"""Return the last n log entries
"""
# sort in forward order (newest first)
sorted_records = sorted(self.db.all(),
key=lambda k: k['isodatetime'])
return sorted_records[-n::]
if __name__ == "__main__":
from pprint import pprint
log = Log("log.db")
#log.add({"testobject": True})
pprint(log.db.all())