я определил конфигурацию протоколирования для моего приложения Python:Вход для нескольких файлов в Python 3
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
- например. если запрашивается конечная точка users
, сообщения должны быть записаны в файле my_app_users.log
. Сообщения от companies
Конечная точка должна быть записана в файле my_app_companies.log
и т. Д.
С моей текущей настройкой сообщения журнала записываются во всех файлах, но я просто не могу понять, почему. Я предполагаю, что, возможно, я неправильно понял использование logging.getLogger()
, но я не уверен, как правильно адресовать handler
, который я хочу использовать каждый раз.