代码之家  ›  专栏  ›  技术社区  ›  Steven Sproat

GUI程序的日志策略

  •  3
  • Steven Sproat  · 技术社区  · 14 年前

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

    我想知道最好的办法是什么。我正在考虑通过命令行开关启用日志记录,并在程序每次“运行”时创建一个日志,并在发生崩溃时给自己发送一个日志副本。但是,如果应用程序未处于调试模式,日志将不会有帮助!

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   Vinay Sajip    14 年前

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

    作为一个简单的解释,请看下面的代码:

    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@~:
    

    如果您担心可以使用旋转日志的文件大小,witch将根据您的条件丢弃最旧的日志:

    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),但最近的日志在那里,保留了用户的可用空间。别忘了从下往上看日志:)

        2
  •  0
  •   S.Lott    14 年前