gpt4 book ai didi

python - GUI 程序的日志记录策略

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:29 25 4
gpt4 key购买 nike

我认为在我的应用程序(绘画类程序)中添加一些调试日志记录并将此信息写入文件可能会有所帮助。我当前的调试策略是连接自定义异常监听器 (sys.excepthook) 并允许用户通过电子邮件将导致崩溃的堆栈跟踪副本发送给我。

这对于查看用户所做的导致程序崩溃的操作非常方便,但我觉得日志文件肯定有帮助。我想知道最好的方法是什么。我正在考虑通过命令行开关启用日志记录,并在每次“运行”程序时创建一个日志,并在发生崩溃时通过电子邮件向自己发送一份日志副本。但是,如果应用未处于 Debug模式,日志将无济于事!

我有点担心日志填得太快 - 如果我将日志记录放在一些鼠标移动事件处理程序中,那么它会创建很多条目。此外,日志文件可能会变得非常大,并且在检查错误报告时会充满与我无关的信息。

你们是怎么处理的?我对日志记录的频率感兴趣 - 因为我的应用程序响应许多事件(例如鼠标移动;取决于用户输入)我不想创建过多的日志记录。

最佳答案

如前所述,您可以使用记录器模块。您可以设置默认级别的日志记录(例如警告)并将所有类型的消息放入您的代码中,从调试到关键。作为谦虚的解释,如果您将日志记录级别设置为警告,即使您的代码记录调试消息,它们也不会出现在文件(或标准输出)中。这是因为日志模块只会记录优先级高于或等于警告(警告、错误和严重)的消息。

作为一个简单的解释,请看这段代码:

import logging
import logging.handlers as handlers

logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('/tmp/myapp.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.WARNING)

logger.debug('debug!')
logger.info('info!')
logger.warning('warning!')
logger.error('error!')
logger.critical('critical!')

它创建一个名为 myapp.log 的文件:

magun@~: cat /tmp/myapp.log
2010-11-05 12:27:25,359 WARNING: warning!
2010-11-05 12:27:25,362 ERROR: error!
2010-11-05 12:27:26,071 CRITICAL: critical!
magun@~:

如果您担心文件大小,您可以使用循环日志,女巫将根据您的标准丢弃最旧的日志:

import logging
import logging.handlers as handlers

logger = logging.getLogger('myapp')
hdlr = handlers.RotatingFileHandler('/tmp/log/myapp.log', maxBytes=100, backupCount=5)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.WARNING)

for i in range(20):
logger.debug('debug%i!'%i)
logger.info('info%i!'%i)
logger.warning('warning%i!'%i)
logger.error('error%i!'%i)
logger.critical('critical%i!'%i)

在这种情况下,我使用的日志文件的最大大小为 100 字节(非常小,你应该提高它),备份计数为 5。这意味着当日志达到 100 字节时,它将被“轮换”:一个新的(并且为空)myapp.log 将被创建,旧的将成为 myapp.log.1。在下一次循环中,myapp.log.1 将变为 myapp.log.2,myapp.log 将变为新的 myapp.log.1。它会重复,直到我们有 myapp.log、myapp.log.1、myapp.log.2、... myapp.log.n(在本例中,限制将为 myapp.log.5)。当我们点击这个,并且日志需要轮换时,myapp.log.5 文件将被丢弃。因此,大小限制为 5*100 字节。

看看发生了什么:

magun@~: ls /tmp/log/
myapp.log myapp.log.1 myapp.log.2 myapp.log.3 myapp.log.4 myapp.log.5
magun@~: cat /tmp/log/myapp.log
2010-11-05 12:33:52,369 ERROR: error19!
2010-11-05 12:33:52,376 CRITICAL: critical19!
magun@~: cat /tmp/log/myapp.log.1
2010-11-05 12:33:52,362 CRITICAL: critical18!
2010-11-05 12:33:52,369 WARNING: warning19!
magun@~: cat /tmp/log/myapp.log.2
2010-11-05 12:33:52,355 WARNING: warning18!
2010-11-05 12:33:52,362 ERROR: error18!
magun@~: cat /tmp/log/myapp.log.3
2010-11-05 12:33:52,348 ERROR: error17!
2010-11-05 12:33:52,355 CRITICAL: critical17!
magun@~: cat /tmp/log/myapp.log.4
2010-11-05 12:33:52,340 CRITICAL: critical16!
2010-11-05 12:33:52,348 WARNING: warning17!
magun@~: cat /tmp/log/myapp.log.5
2010-11-05 12:33:52,333 WARNING: warning16!
2010-11-05 12:33:52,340 ERROR: error16!
magun@~:

如您所见,我们丢失了很多日志 (0-15),但最近的日志都在那里,保留了用户可用空间。不要忘记从下往上阅读日志:)

关于python - GUI 程序的日志记录策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004353/

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