You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

73 lines
2.0 KiB

from loguru import logger
import os
from functools import wraps
from myutils.ConfigManager import myCongif
'''
@logger.catch() 异常捕获注解
----
TRACE 5
DEBUG 10
INFO 20
SUCCESS 25
WARNING 30
ERROR 40
CRITICAL 50
----
'''
#singleton--使用装饰器来保障单一实例的好处是能够动态加载,但线程不安全
def singleton(cls):
instances = {}
@wraps(cls)
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class LogHandler():
def __init__(self, log_dir=myCongif.get_data('log_dir')):
# 确保日志目录存在
if not os.path.exists(log_dir):
os.makedirs(log_dir)
# 清除所有以前的处理器
logger.remove()
# 配置控制台输出
logger.add(lambda msg: print(msg, end=""),
format="{time:YYYY-MM-DD_HH:mm:ss}-{extra[caller]}-{level}:{message}",
level=myCongif.get_data('show_log_level'))
# 配置文件输出
logger.add("logs/{time:YYYY-MM-DD}.log", rotation="00:00", retention="90 days",
format="{time:YYYY-MM-DD_HH:mm:ss}-{extra[caller]}-{level}:{message}",
level=myCongif.get_data('file_log_level'))
def get_logger(self, caller):
# 返回一个带有调用者信息的logger
return logger.bind(caller=caller)
# 示例类A
class ClassA:
def __init__(self):
self.logger = LogHandler().get_logger("ClassA")
def do_something(self):
self.logger.warning("ClassA is doing something.")
# 示例类B
class ClassB:
def __init__(self):
self.logger = LogHandler().get_logger("ClassB")
def do_something(self):
self.logger.error("ClassB is doing something.")
if __name__ == "__main__":
a = ClassA()
b = ClassB()
r = myCongif.get_data('url')
print(r)
a.do_something()
b.do_something()