如何在程序中更好地利用日志模块?

2024-10-04 03:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

    LogRlock.release()

但现在由于日志模块在日志文件大小/格式控制等方面可以做得更好,所以我打算重写上面的方法。好吧,我想对这个方法做一个简单的修改,假设我要这样写:

^{pr2}$

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

非常感谢


Tags: 模块方法代码脚本closerelease格式open
2条回答

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

通常,在应用程序中,您可以根据记录器的名称将其作为目标。因此,基本上,您需要记录的就是这样一种方法:

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

可以按如下方式单独定义记录器属性:

^{pr2}$

另一个替代上述“手动”日志配置的方法是使用logging configuration file或使用configuration dictionary。在

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

Python惯例和函数:以小写字母开头的函数

Python docs say logging module is thread-safe, so I guess I don't really need LogRlock, right?

正确,不需要锁来保护日志代码。在

And another question, do I need to destroy the instance at the end of above method? If so, how should I do it?

不,你没有。实际上,在Python中不能销毁对象。当没有对它们的引用时,它们将被自动垃圾回收。在

但是,除此之外,Logger对象将在程序的生命周期内持续存在。即使您可以在日志记录功能结束时销毁它,也不应该这样做

And is this a safe way to use logging module?

不,不是。正如在注释中所指出的,您正在日志记录方法中对记录器执行设置操作(如添加处理程序和格式化程序),而您应该在程序开始时只执行一次。现在的做法是,每次记录消息时,都会添加一个处理程序,并且每个处理程序都会打印出它接收到的每条消息,因此,您会发现,您记录的第一条消息打印一次,第二条消息打印两次,第三条消息打印三次,等等,直到您用不必要的副本淹没日志文件为止你的日志消息。在

我建议使用某种设置函数,在程序开始时调用一次来配置日志记录行为。关于设置记录器级别、添加处理程序和添加格式化程序的所有内容都在其中。然后,在使用日志代码的每个模块(.py文件)中,在模块级别,您可以获得适当的记录器并将其存储在模块级变量中:

logger = logging.getLogger("package.module")

或者,如果您在模块中使用多个记录器,请对每个记录器执行此操作。在每个需要记录消息的函数中,您可以

^{pr2}$

logger.info的调用将替换您自己的LogMethod。在

相关问题 更多 >