A simple log handler implement in python

Simple log handler with log file writing.

import logging
import os
import datetime


class MyHandler(logging.Handler):
def __init__(self):
super().__init__()
local_win = os.path.join(os.environ['LOCALAPPDATA'], 'Programs', 'test-bench')
if not os.path.exists(local_win):
os.makedirs(local_win)
self.log_p = local_win
self.gen = self.get_next_log_p()
self.log_file = None
self.file = None
self.get_new_file()

def get_next_log_p(self):
x = 0
while True:
p = os.path.join(self.log_p, f'test_bench_log{x}.txt')
yield p
x = (x + 1) % 10

def get_new_file(self):
self.log_file = next(self.gen)
mod = 'a'
if os.path.exists(self.log_file) and os.path.getsize(self.log_file) >= 50 * 1024 * 1024:
mod = 'w'
self.file = open(self.log_file, mod, encoding='utf-8')
self.file.write(f'\n{"-" * 40}{datetime.datetime.now()}{"-" * 40}\n')

def emit(self, record):
record.msg = "{}-{}:{}".format(record.funcName, record.lineno, record.msg)
msg = self.format(record)
print(msg)
if os.path.getsize(self.log_file) >= 50 * 1024 * 1024: # maxim size one file
self.get_new_file()
self.file.write(msg)
self.file.write('\n')
self.file.flush()


if __name__ == '__main__':
han = MyHandler()
logger = logging.getLogger('test') # get same logger object anywhere with same name.
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s \n')
han.setFormatter(formatter)
logger.setLevel(logging.DEBUG)
logger.addHandler(han)
logger.info('test to log')

Comments

Popular Posts