gpt4 book ai didi

python - 如何在我的程序中更好地使用日志记录模块?

转载 作者:行者123 更新时间:2023-11-28 16:50:25 25 4
gpt4 key购买 nike

我在开始编写脚本时没有考虑日志记录模块,所以我只是简单地编写如下代码:

LogMethod(LogFileName, LogMessage):
LogRlock.acquire()

LogFile = open(LogFileName, "a")
LogFile.write(LogMessage)
LogFile.close()

LogRlock.release()

但是现在由于日志记录模块可以在日志文件大小/格式控制等方面做得更好,我将重写上面的方法。嗯,我有点想对这个方法进行简单的修改,假设我会这样编码:

LogMethod(LogFileName, LogMessage):
#### Do I need to destroy the instance Logger at the end of this method?
LogRlock.acquire()

Logger = logging.getLogger("Demo")
Logger.setLevel(logging.DEBUG)
SizeHandler = logging.handlers.RotatingFileHandler(filename = LogFileName, mode = "a", maxBytes = 1000000)
SimpleFormatter = logging.Formatter(fmt = '%(asctime)s%(message)s', datefmt = '[%Y-%m-%d, %H:%M:%S]:')
SizeHandler.setFormatter(SimpleFormatter)
Logger.addHandler(SizeHandler)
Logger.info(LogMessage)

LogRlock.release()

Python 文档说日志记录模块是线程安全的,所以我想我并不真的需要 LogRlock,对吧?还有一个问题,我需要在上述方法结束时销毁实例吗?如果是这样,我应该怎么做?这是使用日志记录模块的安全方法吗?

非常感谢

最佳答案

使用记录器和定义其属性是两个不同的任务,应该将它们分开,以便将业务逻辑与配置逻辑分开。

通常,在应用程序中,您通过名称定位记录器。所以基本上,所有你需要记录的都是这样的方法:

def logMethod(loggerName, logMessage):
logger = logging.getLogger(loggerName)
logger.info(logMessage)

可以像这样单独定义记录器属性:

def configureLogger(loggerName):
logger = logging.getLogger(loggerName)
logger.setLevel(logging.DEBUG)
sizeHandler = logging.handlers.RotatingFileHandler(filename = LogFileName, mode = "a", maxBytes = 1000000)
simpleFormatter = logging.Formatter(fmt = '%(asctime)s%(message)s', datefmt = '[%Y-%m-%d, %H:%M:%S]:')
sizeHandler.setFormatter(simpleFormattesr)
logger.addHandler(sizeHandler)

上述“手动”日志记录配置的另一种替代方法是使用 logging configuration file或使用 configuration dictionary .

Python 开发人员不必关心销毁对象,这是由 Python 的垃圾收集器完成的。在 logging.Logger 类的情况下,这甚至会是显式销毁记录器的错误:记录器实例由记录模块存储,以便在每次调用 logging.getLogger 时返回相同的实例(如果相同的记录器名称提供)(方法 logging.getLogger("Demo") 在第一次调用时创建一个新实例)在您的情况下,这意味着 RotatingFileHandler 会在每次调用 logMethod 时向您的记录器添加第二次、第三次、第四次……

PS:Python 编码约定:函数和变量以小写字母开头

关于python - 如何在我的程序中更好地使用日志记录模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8292036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com