【问题标题】: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 函数中打印似乎存在问题,因此我不会使用它。

【问题讨论】:

  • 我建议使用内置的logging 包而不是重新发明轮子。您可以编写一个自定义的Handler 来处理计数。
  • 谢谢,我会看一下,它是标准库的一部分吗?

标签: 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2012-10-07
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多