在Python 3中记录到多个文件

在Python 3中记录到多个文件,python,python-3.x,logging,Python,Python 3.x,Logging,我已经为我的Python应用程序定义了日志记录配置: from logging import config from os.path import expanduser def load_logconfig(app): home = expanduser('~') default_file_prefix = 'my_app' default_log_level = 'DEBUG' if 'debug_mode' in app.registry.settings el

我已经为我的Python应用程序定义了日志记录配置:

from logging import config
from os.path import expanduser


def load_logconfig(app):

    home = expanduser('~')
    default_file_prefix = 'my_app'
    default_log_level = 'DEBUG' if 'debug_mode' in app.registry.settings else 'WARN'
    extra_loggers = ['requests', 'selenium', 'easyprocess', 'transaction', 'pyvirtualdisplay']
    excludes = ['defaults', 'temp', 'test']

    default_logging = {
        'version': 1,
        'formatters': {
            'short': {
                'format': '%(asctime)s\t%(message)s',
            },
            'long': {
                'format': '%(asctime)s %(levelname)-5.5s [%(threadName)s]\t%(message)s'
            },
            'generic': {
                'format': '%(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s]\t%(message)s'
            }
        },
        'handlers': {
            'console': {
                'level': default_log_level,
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout',
                'formatter': 'long'
            },
            'debuglog': {
                'class': 'logging.handlers.RotatingFileHandler',
                'level': default_log_level,
                'filename': '{}/logs/my_app/debug.log'.format(home),
                'formatter': 'generic',
                'maxBytes': 102400000,
                'backupCount': 20,
                'encoding': 'utf8'
            },
            'warnlog': {
                'class': 'logging.handlers.RotatingFileHandler',
                'level': 'ERROR',
                'filename': '{}/logs/my_app/error.log'.format(home),
                'formatter': 'generic',
                'maxBytes': 102400000,
                'backupCount': 20,
                'encoding': 'utf8'
            }
        },
        'loggers': {
            'sqlalchemy': {'level': 'INFO', 'qualname': 'sqlalchemy.engine', 'propagate': False},
        },
        'root': {
            'level': default_log_level,
            'handlers': ['console', 'debuglog', 'warnlog'],
            'propagate': False
        }
    }

    for logger in extra_loggers:
        default_logging['loggers'][logger] = {'level': 'WARN', 'qualname': logger, 'propagate': False}

    for endpoint in app.registry.cornice_services:
        endpoint_name = endpoint.split('/')[1]
        handler_name = '{}_{}'.format(default_file_prefix, endpoint_name)
        if handler_name not in default_logging['handlers'] and len(endpoint_name) > 0 and endpoint_name not in excludes:
            default_logging['handlers'][handler_name] = {
                'level': default_log_level,
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': '{}/logs/my_app/{}_{}.log'.format(home, default_file_prefix, endpoint_name),
                'formatter': 'generic',
                'maxBytes': 102400000,
                'backupCount': 20,
                'encoding': 'utf8'
            }
            default_logging['root']['handlers'].append(handler_name)

    config.dictConfig(default_logging)
我有一个助手函数,用于记录日志:

import logging


def write_log(request, loglevel, message, mongo_log=False, send_email=False, **kwargs):
    requested_name = request.path.split('/')[1]
    log = logging.getLogger('my_app_{}'.format(requested_name))
    level = logging.getLevelName(loglevel.upper())
    msg = '[{}] [{}] {}'.format(request.remote_addr, request.method, message)

    log.log(level, msg)

    # do some other stuff...

    return True
它的用法相当简单:

write_log(request, 'debug', 'some informative message', send_email=True)
我想在这里实现的是根据我在这里所称的
endpoint
,在不同的文件中写入日志消息-例如,如果请求endpoint
users
,则应在
my\u app\u users.log
文件中写入消息。来自
公司
端点的消息应写入
my\u app\u Companys.log
文件等

在我目前的设置中,所有文件都会写入日志消息,但我就是不知道为什么。我想可能是我误解了
logging.getLogger()
的用法,但我不知道如何正确地处理每次我想使用的
处理程序。

啊,在再次阅读之后,我意识到我没有在
默认日志['loggers']
中添加我需要的东西。一旦我在那里定义了它们,一切都按预期进行