编程语言
首页 > 编程语言> > 我如何在程序中更好地利用日志记录模块?

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

作者:互联网

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

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,对吗?还有一个问题,我需要在上述方法结束时销毁该实例吗?如果是这样,我该怎么办?这是使用日志记录模块的安全方法吗?

非常感谢

解决方法:

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")

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

def foo():
    ...
    logger.info("message")
    ...

对logger.info的此调用将替换您自己的LogMethod.

标签:logging,file-io,python
来源: https://codeday.me/bug/20191202/2085405.html