使用配置文件在Python中进行日志记录 - 通过代码使用文件中定义的处理器

12 投票
3 回答
16919 浏览
提问于 2025-04-16 08:10

我正在使用Python的日志模块。请问我该如何从代码中访问配置文件中定义的处理器?举个例子,我有一个日志记录器和两个处理器,一个是用来在屏幕上显示日志,另一个是用来写入文件。我想根据用户的偏好来使用合适的处理器(也就是用户想在屏幕上记录日志还是写入文件)。我该如何动态地添加和删除配置文件中定义的处理器呢?

[loggers]

keys=root,netmap

[handlers]
keys=fil,screen

[logger_root]
level=NOTSET
handlers=

[logger_netmap]
level=INFO
handlers=fil,screen
qualname=netmap

[formatters]
keys = simple

[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

[handler_fil]
class=handlers.RotatingFileHandler
args=('file.log','a','maxBytes=10000','backupCount=5')
formatter=simple

[handler_screen]
class=StreamHandler
args = (sys.stdout,)
formatter=simple

根据用户是否使用-v参数运行程序,我需要选择使用文件处理器或屏幕处理器。我该如何从netmap日志记录器中添加或删除文件或屏幕处理器呢?

3 个回答

0

好的,我在Python的Google小组里找到了一个很棒的方法,真是太好用了。下面是代码:

import logging
import getopt
import sys
import logging.config

def stop(m,handl):
    consoleHand=[h for h in m.handlers if h.__class__ is handl]
    print consoleHand
    if consoleHand:
        h1=consoleHand[0]
        h1.filter=lambda x: False


logging.config.fileConfig('log.conf')
my_log = logging.getLogger('netmap')
args=sys.argv[1:]
opt,arg = getopt.gnu_getopt(args,'v')
l=''
for o,a in opt:
    if o=='-v':
        l='verbose'
        stop(my_log,logging.handlers.RotatingFileHandler)
if not l:
    stop(my_log,logging.StreamHandler)
my_log.debug('Starting.....')
my_log.warning('Unstable')
my_log.error('FIles Missing')
my_log.critical('BlowOut!!')

配置文件还是和以前一样。现在我可以很方便地开启或关闭处理程序了。

1

根据logging模块的文档,看起来logging对象有这两个方法:

Logger.addHandler(hdlr)

  Adds the specified handler hdlr to this logger.

Logger.removeHandler(hdlr)

  Removes the specified handler hdlr from this logger.

所以看起来你应该可以用这两个方法来添加或更改网络日志记录器的处理器,具体可以根据配置文件里的内容来决定。

5

与其每次都去动态修改配置文件,不如直接使用 Logger.addHandler(handler) 这个方法。

fileHandler = logging.handlers.RotatingFileHandler('file.log', mode='a', maxBytes=10000, backupCount=5)
logger = logging.getLogger('netmap')

if LOG_TO_FILE:
    logger.addHandler(fileHandler)

然后,如果你想从同一个文件中加载格式设置,可以这样做;

import ConfigParser
configParser = ConfigParser.ConfigParser()
config.read('config.ini')

format = config.get('formatter_simple', 'format')
fileHandler.setFormatter(format)

撰写回答