我错过了什么?
我有一个包含大量文件和模块的项目。我希望每个模块和一些类都有自己的日志文件。在大多数情况下,我只想记录INFO和ERROR,但偶尔我会想要DEBUG。
但是,我只想将ERROR发送到屏幕(通过Anaconda的Spyder上的iPython)。这是高速代码,每毫秒几次获得网络更新,打印所有INFO消息不仅非常烦人,而且还会使Spyder崩溃。
简而言之,我只想将ERROR发送到屏幕上。其他所有内容都会转到文件中。下面是我为每个类创建单独日志文件的代码。它在每个应该记录项目的类的__init__
方法中调用。 name
参数通常为__class__.__name__
。 fname
参数也已设置。通常,lvl
和formatter
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()))),
)
答案 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级别的消息,并且都在文件中。