ich die Logging-Konfiguration für meine Python App definiert haben:Logging, um mehrere Dateien in 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)
und ich habe eine Hilfsfunktion, die ich benutze für die Protokollierung:
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
Und sein Verwendung ist ziemlich einfach:
write_log(request, 'debug', 'some informative message', send_email=True)
Was ich hier erreichen möchte, ist Protokollnachrichten in verschiedenen Dateien zu erstellen, basierend auf was ich hier nenne endpoint
- z.B. Wenn der Endpunkt users
angefordert wird, sollten die Nachrichten in die Datei my_app_users.log
geschrieben werden. Nachrichten von companies
Endpunkt sollte in my_app_companies.log
Datei usw. geschrieben werden.
Mit meinem aktuellen Setup, Protokollmeldungen sind in allen Dateien geschrieben, aber ich kann einfach nicht herausfinden, warum. Ich nehme an, es könnte sein, dass ich die Verwendung von logging.getLogger()
missverstanden habe, aber ich bin mir nicht sicher, wie ich die handler
richtig adressieren soll, die ich jedes Mal verwenden möchte.