Source code for distcache.logger
from collections import deque
import pickle
[docs]class Logger:
"""
Implements a simple logger
"""
def __init__(self, filename='cache.db', mode='ab', batch_size=1):
"""
Initializes Logger object:
:param filename: name of the file in which logs are to be stored/written.
:param batch_size: Number of logs to accumulate before log is written.
To write objects in batches, increase the value of batch_size.
"""
self.filename = filename
self.mode = mode
self.batch_size = batch_size
self.logs = deque() # List of logs to be written to the file
self.file = open(file=filename, mode=mode)
[docs] def log_bytes(self, object):
"""
Write objects of bytes type in batches to the log file
:param object: basically any serialized object
for instance:
obj = ("life", "is wonderful")
byte_obj = pickle.dumps(obj)
logger = Logger()
logger.log_bytes(byte_obj)
You can do the same with images or pdfs
obj = open("some_image_file.png", mode='rb').read()
logger = Logger()
logger.log_bytes(byte_obj)
Note: This function does not check if the object is not bytes. The user should do the checks.
:returns: None
"""
self.logs.append(object)
if len(self.logs) == self.batch_size:
self.flush() # TODO: Gotta be async
[docs] def log(self, object):
"""
Write objects that are not bytes type in batches to the log file
:param object: basically anything [int, str, list, etc]
Object instances:
("set", "hi", "greeting"),
("set", 1, 100),
("del", 1)
:returns: None
"""
self.logs.append(pickle.dumps(object))
if len(self.logs) == self.batch_size:
self.flush() # TODO: Gotta be async
[docs] def flush(self):
"""
Writes whatever object is in the log queue is written to the disk.
No worries if someone appended to the logs when it is being written
"""
n = len(self.logs)
for i in range(n):
pickle.dump(self.logs.popleft(), self.file)
[docs] def close(self):
"""
Close the logger. Close the log file safely
"""
self.flush()
self.file.close()
[docs] def read_logs(self):
"""
Reads logs from the file.
"""
self.file.close()
objs = []
with open(self.filename, mode='rb') as file:
while True:
try:
obj = pickle.load(file)
objs.append(obj)
except EOFError as e:
break
self.file = open(self.filename, mode='ab') # Open the file again but in an append mode of-course.
return objs