ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-02 02:55:14  阅读:137  来源: 互联网

标签:logging file-io python


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有