Source code for ftrack_application_launcher.configure_logging
# :coding: utf-8
# :copyright: Copyright (c) 2015 ftrack
import os
import logging
import logging.config
import appdirs
import errno
[docs]def get_log_directory():
'''Get log directory.
Will create the directory (recursively) if it does not exist.
Raise if the directory can not be created.
'''
user_data_dir = appdirs.user_data_dir('ftrack-connect', 'ftrack')
log_directory = os.path.join(user_data_dir, 'log')
if not os.path.exists(log_directory):
try:
os.makedirs(log_directory)
except OSError as error:
if error.errno == errno.EEXIST and os.path.isdir(log_directory):
pass
else:
raise
return log_directory
[docs]def configure_logging(
logger_name, level=None, format=None, extra_modules=None
):
'''Configure `loggerName` loggers with console and file handler.
Optionally specify log *level* (default WARNING)
Optionally set *format*, default:
`%(asctime)s - %(name)s - %(levelname)s - %(message)s`.
Optional *extra_modules* to extend the modules to be set to *level*.
'''
# Provide default values for level and format.
format = (
format
or '%(levelname)s - %(threadName)s - %(asctime)s - %(name)s - %(message)s'
)
level = level or logging.WARNING
log_directory = get_log_directory()
logfile = os.path.join(log_directory, '{0}.log'.format(logger_name))
# Sanitise the variable, checking the type.
if not isinstance(extra_modules, (list, tuple, type(None))):
error_message = (
'Extra modules: {0} as are not of the correct type.'
'Expected list or tuple or None, got {1}'.format(
extra_modules, type(extra_modules)
)
)
raise ValueError(error_message)
extra_modules = extra_modules or []
# Cast to list in case is a tuple.
modules = ['ftrack_api', 'urllib3', 'requests']
modules.extend(list(extra_modules))
logging_settings = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': logging.getLevelName(level),
'formatter': 'file',
'stream': 'ext://sys.stdout',
},
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'DEBUG',
'formatter': 'file',
'filename': logfile,
'mode': 'a',
'maxBytes': 10485760,
'backupCount': 5,
},
},
'filters': {'application_launcher_only': {'name': logger_name}},
'formatters': {'file': {'format': format}},
'loggers': {
logger_name: {'level': 'DEBUG', 'handlers': ['console', 'file']}
},
}
for module in modules:
current_level = level
logging_settings['loggers'].setdefault(
module, {'level': current_level}
)
# Set default logging settings.
logging.config.dictConfig(logging_settings)
# Redirect warnings to log so can be debugged.
logging.captureWarnings(True)
# Log out the file output.
logging.info('Saving log file to: {0}'.format(logfile))