scripts/lib/log.py

101 lines
3.7 KiB
Python
Raw Normal View History

2024-02-04 23:43:55 +08:00
import logging
import os
import os.path
import datetime
import inspect
class ServiceLoggerHandler(logging.Handler):
def __init__(self, file_fmt=None):
self.file_fmt = file_fmt
if file_fmt is None:
self.file_fmt = os.path.join('logs', '%Y-%m-%d.log')
logging.Handler.__init__(self)
def emit(self, record):
msg = self.format(record)
fpath = datetime.datetime.now().strftime(self.file_fmt)
fdir = os.path.dirname(fpath)
try:
if not os.path.exists(fdir):
os.makedirs(fdir)
except Exception as e:
print(e)
try:
f = open(fpath, 'a')
f.write(msg)
f.write("\n")
f.flush()
f.close()
except Exception as e:
print(e)
class Logger:
2024-07-15 16:24:14 +08:00
def __init__(self, service_name, log_level=logging.DEBUG, log_dir=None, print_terminal=True):
2024-02-04 23:43:55 +08:00
self.service_name = service_name
self.log_level = log_level
self.log_dir = log_dir
2024-07-15 16:24:14 +08:00
self.print_terminal = print_terminal
2024-02-04 23:43:55 +08:00
logging.addLevelName(10, 'DEBG')
logging.addLevelName(20, 'INFO')
logging.addLevelName(30, 'WARN')
logging.addLevelName(40, 'EROR')
logging.addLevelName(50, 'CRIT')
self.logger = logging.getLogger(self.service_name)
self.logger.setLevel(self.log_level)
# 创建一个handler用于写入日志文件
file_fmt = os.path.join(self.log_dir, self.service_name, self.service_name + "-%Y-%m-%d.log")
fh = ServiceLoggerHandler(file_fmt)
fh.setLevel(self.log_level)
# 再创建一个handler用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(self.log_level)
# 定义handler的输出格式
formatter = logging.Formatter(
'[%(asctime)s] [%(levelname).4s] (%(name)s, %(call_fname)s:%(call_line)d) %(message)s')
fh.setFormatter(formatter)
2024-07-15 16:24:14 +08:00
if print_terminal:
ch.setFormatter(formatter)
2024-02-04 23:43:55 +08:00
# 给logger添加handler
self.logger.addHandler(fh)
2024-07-15 16:24:14 +08:00
if print_terminal:
self.logger.addHandler(ch)
2024-02-04 23:43:55 +08:00
def Debug(self, msg):
previous_frame = inspect.currentframe().f_back
pathname, line_number, func_name, lines, index = inspect.getframeinfo(previous_frame)
filename = os.path.basename(pathname)
self.logger.debug(msg, extra={'call_fname': filename, 'call_line': line_number})
def Info(self, msg):
previous_frame = inspect.currentframe().f_back
pathname, line_number, func_name, lines, index = inspect.getframeinfo(previous_frame)
filename = os.path.basename(pathname)
self.logger.info(msg, extra={'call_fname': filename, 'call_line': line_number})
def Warn(self, msg):
previous_frame = inspect.currentframe().f_back
pathname, line_number, func_name, lines, index = inspect.getframeinfo(previous_frame)
filename = os.path.basename(pathname)
self.logger.warning(msg, extra={'call_fname': filename, 'call_line': line_number})
def Error(self, msg):
previous_frame = inspect.currentframe().f_back
pathname, line_number, func_name, lines, index = inspect.getframeinfo(previous_frame)
filename = os.path.basename(pathname)
self.logger.error(msg, extra={'call_fname': filename, 'call_line': line_number})
def Critical(self, msg):
previous_frame = inspect.currentframe().f_back
pathname, line_number, func_name, lines, index = inspect.getframeinfo(previous_frame)
filename = os.path.basename(pathname)
self.logger.critical(msg, extra={'call_fname': filename, 'call_line': line_number})