【问题标题】:Is there a better way of making this logging func/class?有没有更好的方法来制作这个日志记录功能/类?
【发布时间】:2022-12-07 00:20:33
【问题描述】:
所以我想制作一个我可以调用的记录器,它会告诉我日志的编号和一些文本,每次调用时数字都会递增。
class logger:
i=0
def __new__(ctx, msg):
ctx.i+=1
print(ctx.i, msg)
logger("test")
logger("test2")
想知道这是否是最优雅的方法?
附言我尝试使用 yield,但在某些 IDE 的 yield 函数中打印似乎存在问题,因此我不会使用它。
【问题讨论】:
标签:
python
python-3.x
logging
【解决方案1】:
有完整的 python 专用日志记录库。
这是一个自动每日日志重命名/轮换的示例。如果应用程序频繁运行,则很有用。
https://docs.python.org/3/library/logging.html
import logging
import logging.handlers
import os #just for creation of logging directory
def set_logger(logdir,logname="applog"):
logger = logging.getLogger(logname)
logging.basicConfig(level=logging.DEBUG) #this is very detailed level
#logpath=os.path.join(logdir,logname+"_"+datetime.date.today().strftime('%Y-%m-%d')+".log")
logpath=os.path.join(logdir,logname+".log")
try:os.makedirs(logdir)
except OSError:pass
fileHandler = logging.FileHandler(logpath)
fileHandler.setLevel(logging.DEBUG)
#set time rotating filename
fileHandler=logging.handlers.TimedRotatingFileHandler(filename=logpath, when='midnight', backupCount=30, encoding='utf-8')
fileHandler.namer = lambda name: name.replace(".log", "") + ".log"
formatter = logging.Formatter("%(asctime)s %(levelname)8s [%(filename)s:%(lineno)s - %(funcName)s() ] %(message)s")
fileHandler.setFormatter(formatter)
logger.addHandler(fileHandler)
#logger.info("Logger set")
return logger
如何使用:
#create logger object
logger = set_logger(r'yourlogpath','appname')
#call anytime logger.info, logger.exception, logger.warning()
logger.info('application started')