Python中文件处理器和显示的不同日志级别
我在用Python的logging
模块来写调试和错误信息。
我想把所有logging.DEBUG
级别或更高级别的信息都写进文件里。
但是,我只想把logging.WARNING
级别或更高级别的信息打印到屏幕上。
这样做可以只用一个Logger
和一个FileHandler
吗?
4 个回答
2
不行。文件和屏幕输出意味着你需要两个处理器。
3
你可以给同一个日志记录器添加很多处理器,每个处理器可以设置不同的日志级别。但是,根日志级别必须和最详细的处理器一样详细。下面这个例子展示了如何把日志信息记录到文件中,同时把调试信息(log.debug())和普通信息(log.info())输出到控制台:
log = logging.getLogger("syslog2elastic")
log.setLevel(logging.DEBUG) # this must be DEBUG to allow debug messages through
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s.%(msecs)03d - %(name)s:%(lineno)d - %(levelname)s - %(message)s", "%Y%m%d%H%M%S")
console.setFormatter(formatter)
log.addHandler(console)
fh = RotatingFileHandler(args.logfile, maxBytes=104857600, backupCount=5)
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s.%(msecs)03d - %(message)s", "%Y%m%d%H%M%S")
fh.setFormatter(formatter)
log.addHandler(fh)
15
正如之前提到的,处理器(handlers)非常容易创建和添加,所以你可能只需要用两个处理器就可以了。不过,如果你有特别的原因想要只用一个,Python日志手册里有一部分正好讲你想做的事情:如何同时记录到控制台和文件,但使用不同的级别(它甚至告诉你怎么做不同的格式)。不过,它是用一个 StreamHandler
来实现的,而不是 FileHandler
。
import logging
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='/temp/myapp.log',
filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)
# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')
# Now, define a couple of other loggers which might represent areas in your
# application:
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')
补充:在评论中讨论过,这段代码实际上还是生成了两个处理器,但通过使用basicConfig()“隐藏”了一个的创建。我强烈建议你明确地创建两个处理器。