在Python 3中记录到多个文件
我已经为我的Python应用程序定义了日志记录配置:在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
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
,在不同的文件中写入日志消息-例如,如果请求endpointusers
,则应在my\u app\u users.log
文件中写入消息。来自公司
端点的消息应写入my\u app\u Companys.log
文件等在我目前的设置中,所有文件都会写入日志消息,但我就是不知道为什么。我想可能是我误解了
logging.getLogger()
的用法,但我不知道如何正确地处理每次我想使用的处理程序。啊,在再次阅读之后,我意识到我没有在默认日志['loggers']
中添加我需要的东西。一旦我在那里定义了它们,一切都按预期进行