Source code for ftrack_connect_pipeline.configure_logging

# :coding: utf-8
# :copyright: Copyright (c) 2014-2020 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, extra_handlers=None, propagate=True, ): '''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.INFO 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 = [] modules.extend(list(extra_modules)) extra_handlers = extra_handlers or {} 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, }, }, 'formatters': {'file': {'format': format}}, 'loggers': { '': {'level': 'INFO', 'handlers': ['console']}, 'ftrack_api': {'level': 'INFO', 'handlers': ['file']}, 'requests': {'level': 'WARNING', 'handlers': ['file']}, 'urllib3': {'level': 'WARNING', 'handlers': ['file']}, }, } logging_settings['handlers'].update(extra_handlers) extra_handlers_names = list(extra_handlers.keys()) modules_handlers = ['file'] + extra_handlers_names for module in modules: current_level = logging.getLevelName(level) logging_settings['loggers'].setdefault( module, { 'level': 'DEBUG', 'handlers': modules_handlers, 'propagate': propagate, }, ) # Set default logging settings. logging.config.dictConfig(logging_settings) # Redirect warnings to log so can be debugged. logging.captureWarnings(True) # Log out the file exporters. logging.warning('Saving log file to: {0}'.format(logfile))