Python3日志记录:仅将ERROR发送到屏幕而不是INFO

时间:2017-11-12 19:22:25

标签: python logging

我错过了什么?

我有一个包含大量文件和模块的项目。我希望每个模块和一些类都有自己的日志文件。在大多数情况下,我只想记录INFO和ERROR,但偶尔我会想要DEBUG。

但是,我只想将ERROR发送到屏幕(通过Anaconda的Spyder上的iPython)。这是高速代码,每毫秒几次获得网络更新,打印所有INFO消息不仅非常烦人,而且还会使Spyder崩溃。

简而言之,我只想将ERROR发送到屏幕上。其他所有内容都会转到文件中。下面是我为每个类创建单独日志文件的代码。它在每个应该记录项目的类的__init__方法中调用。 name参数通常为__class__.__name__fname参数也已设置。通常,lvlformatter args保留默认值。正在创建文件,它们看起来或多或少是正确的。

我的搜索没有提供有用的项目,而且在阅读Logging Cookbook时我遗失了一些东西。

代码:

import logging, traceback
import time, datetime
import collections


standard_formatter = logging.Formatter('[{}|%(levelname)s]::%(funcName)s-%(message)s\n'.format(datetime.datetime.utcnow()))
standard_formatter.converter = time.gmtime

logging.basicConfig(level=logging.ERROR,
                    filemode='w')

err_handler = logging.StreamHandler()
err_handler.setLevel(logging.ERROR)
err_handler.setFormatter(standard_formatter)

Log = collections.namedtuple(
    'LogLvls',
    [
        'info',
        'debug',
        'error',
        'exception'
    ]
)


def setup_logger(
        name: str,
        fname: [str, None]=None,
        lvl=logging.INFO,
        formatter: logging.Formatter=standard_formatter
) -> Log:
    logger = logging.getLogger(name)

    if fname is None:
        handler = logging.StreamHandler()
    else:
        handler = logging.FileHandler(fname, mode='a')
    handler.setFormatter(formatter)

    logger.setLevel(lvl)
    logger.addHandler(handler)
    logger.addHandler(err_handler)

    return Log(
        debug=lambda msg: logger.debug('{}::{}'.format(name, msg)),
        info=lambda msg: logger.info('{}::{}'.format(name, msg)),
        error=lambda msg: logger.error('{}::{}'.format(name, msg)),
        exception=lambda e: logger.error('{}::{}: {}\n{}'.format(name, type(e), e, repr(traceback.format_stack()))),
    )

1 个答案:

答案 0 :(得分:0)

你不能拥有

logging.basicConfig(level=logging.ERROR,
                    filemode='w')

和专门的配置同时。注释或删除,然后使用

if __name__ == '__main__':
    setup_logger('spam', "/tmp/spaaam")
    logging.getLogger('spam').info('eggs')
    logging.getLogger('spam').error('eggs')
    logging.getLogger('spam').info('eggs')

您在控制台上只有ERROR级别的消息,并且都在文件中。