Port to oslo_log

This removes log.py from the oslo incubator and replaces it with the
graduated oslo_log module.

Change-Id: Ie0a41b4de9de25fdac3e925cd904e6cf6cd02627
This commit is contained in:
Louis Taylor 2015-05-27 17:42:03 +00:00
parent f5fc27f84a
commit b006d033fd
61 changed files with 79 additions and 776 deletions

View File

@ -34,7 +34,6 @@
zaqar.openstack.common.importutils.rst
zaqar.openstack.common.local.rst
zaqar.openstack.common.lockutils.rst
zaqar.openstack.common.log.rst
zaqar.openstack.common.strutils.rst
zaqar.openstack.common.timeutils.rst
zaqar.storage.base.rst

View File

@ -1,7 +0,0 @@
The :mod:`zaqar.openstack.common.log` module
=============================================
.. automodule:: zaqar.openstack.common.log
:members:
:undoc-members:
:show-inheritance:

View File

@ -8,7 +8,6 @@ module=gettextutils
module=importutils
module=local
module=lockutils
module=log
module=strutils
module=timeutils

View File

@ -19,6 +19,7 @@ stevedore>=1.3.0,<1.4.0 # Apache-2.0
six>=1.9.0
oslo.config>=1.9.3,<1.10.0 # Apache-2.0
oslo.i18n>=1.5.0,<1.6.0 # Apache-2.0
oslo.log>=1.0.0 # Apache-2.0
oslo.utils>=1.4.0,<1.5.0 # Apache-2.0
SQLAlchemy>=0.9.7,<=0.9.99
enum34

View File

@ -17,6 +17,7 @@ stevedore>=1.3.0,<1.4.0 # Apache-2.0
six>=1.9.0
oslo.config>=1.9.3,<1.10.0 # Apache-2.0
oslo.i18n>=1.5.0,<1.6.0 # Apache-2.0
oslo.log>=1.0.0 # Apache-2.0
oslo.serialization>=1.4.0,<1.5.0 # Apache-2.0
oslo.utils>=1.4.0,<1.5.0 # Apache-2.0
SQLAlchemy>=0.9.7,<=0.9.99

View File

@ -12,10 +12,11 @@
# License for the specific language governing permissions and limitations under
# the License.
from oslo_log import log as logging
from zaqar.common.api import response
from zaqar.common.api import utils as api_utils
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import validation

View File

@ -14,6 +14,7 @@
# limitations under the License.
from oslo_config import cfg
from oslo_log import log
from stevedore import driver
from zaqar.api import handler
@ -21,7 +22,6 @@ from zaqar.common import decorators
from zaqar.common import errors
from zaqar.i18n import _
from zaqar.openstack.common.cache import cache as oslo_cache
from zaqar.openstack.common import log
from zaqar.storage import pipeline
from zaqar.storage import pooling
from zaqar.storage import utils as storage_utils
@ -43,6 +43,7 @@ _CLI_OPTIONS = (
# zaqar-server
CONF = cfg.CONF
CONF.register_cli_opts(_CLI_OPTIONS)
log.register_options(CONF)
_GENERAL_OPTIONS = (
ADMIN_MODE_OPT,
@ -84,7 +85,7 @@ class Bootstrap(object):
self.conf.register_opts(_DRIVER_OPTIONS, group=_DRIVER_GROUP)
self.driver_conf = self.conf[_DRIVER_GROUP]
log.setup('zaqar')
log.setup(conf, 'zaqar')
if self.conf.unreliable is None:
msg = _(u'Unreliable\'s default value will be changed to False '

View File

@ -12,10 +12,10 @@
# limitations under the License.
from oslo_config import cfg
from oslo_log import log
from zaqar import bootstrap
from zaqar.common import cli
from zaqar.openstack.common import log
LOG = log.getLogger(__name__)

View File

@ -15,10 +15,10 @@
import jsonschema
from jsonschema import validators
from oslo_log import log
from zaqar.common import errors
from zaqar.i18n import _
from zaqar.openstack.common import log
LOG = log.getLogger(__name__)

View File

@ -14,9 +14,10 @@
import functools
from oslo_log import log as logging
import zaqar.common.api.response as response
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
LOG = logging.getLogger(__name__)
@ -44,4 +45,4 @@ def raises_conn_error(func):
def error_response(req, exception, headers=None, error=None):
body = {'exception': str(exception), 'error': error}
resp = response.Response(req, body, headers)
return resp
return resp

View File

@ -16,9 +16,12 @@ from __future__ import print_function
import functools
import sys
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from oslo_config import cfg
from oslo_log import log as logging
from zaqar.i18n import _
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
@ -46,7 +49,8 @@ def runnable(func):
@functools.wraps(func)
def _wrapper():
try:
logging.setup('zaqar')
logging.register_options(CONF)
logging.setup(CONF, 'zaqar')
func()
except KeyboardInterrupt:
LOG.info(_(u'Terminating'))

View File

@ -16,8 +16,7 @@
import functools
import msgpack
import zaqar.openstack.common.log as logging
from oslo_log import log as logging
LOG = logging.getLogger(__name__)

View File

@ -31,11 +31,11 @@ them do, an AttributeError exception will be raised.
import contextlib
from oslo_log import log as logging
import six
from zaqar.common import decorators
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
LOG = logging.getLogger(__name__)

View File

@ -18,11 +18,11 @@
import uuid
import falcon
from oslo_log import log as logging
import six
from zaqar import context
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.transport import validation

View File

@ -15,9 +15,7 @@
import uuid
from zaqar.notification.task import webhook
from zaqar.openstack.common import log as logging
from oslo_log import log as logging
import six
from taskflow import engines
from taskflow.patterns import unordered_flow as uf
@ -25,6 +23,8 @@ from taskflow import task
from taskflow.types import futures
from taskflow.utils import eventlet_utils
from zaqar.notification.task import webhook
LOG = logging.getLogger(__name__)

View File

@ -13,10 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_log import log as logging
import requests
from zaqar.openstack.common import log as logging
from taskflow import task
LOG = logging.getLogger(__name__)

View File

@ -19,7 +19,7 @@ import os
import tempfile
from zaqar.openstack.common import excutils
from zaqar.openstack.common import log as logging
from oslo_log import log as logging
LOG = logging.getLogger(__name__)

View File

@ -1,703 +0,0 @@
# Copyright 2011 OpenStack Foundation.
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""OpenStack logging handler.
This module adds to logging functionality by adding the option to specify
a context object when calling the various log methods. If the context object
is not specified, default formatting is used. Additionally, an instance uuid
may be passed as part of the log message, which is intended to make it easier
for admins to find messages related to a specific instance.
It also allows setting of formatting information through conf.
"""
import inspect
import itertools
import logging
import logging.config
import logging.handlers
import os
import sys
import traceback
from oslo_config import cfg
from oslo_serialization import jsonutils
import six
from six import moves
_PY26 = sys.version_info[0:2] == (2, 6)
from zaqar.openstack.common.gettextutils import _
from zaqar.openstack.common import importutils
from zaqar.openstack.common import local
# NOTE(flaper87): Pls, remove when graduating this module
# from the incubator.
from zaqar.openstack.common.strutils import mask_password # noqa
_DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
common_cli_opts = [
cfg.BoolOpt('debug',
short='d',
default=False,
help='Print debugging output (set logging level to '
'DEBUG instead of default WARNING level).'),
cfg.BoolOpt('verbose',
short='v',
default=False,
help='Print more verbose output (set logging level to '
'INFO instead of default WARNING level).'),
]
logging_cli_opts = [
cfg.StrOpt('log-config-append',
metavar='PATH',
deprecated_name='log-config',
help='The name of a logging configuration file. This file '
'is appended to any existing logging configuration '
'files. For details about logging configuration files, '
'see the Python logging module documentation.'),
cfg.StrOpt('log-format',
metavar='FORMAT',
help='DEPRECATED. '
'A logging.Formatter log message format string which may '
'use any of the available logging.LogRecord attributes. '
'This option is deprecated. Please use '
'logging_context_format_string and '
'logging_default_format_string instead.'),
cfg.StrOpt('log-date-format',
default=_DEFAULT_LOG_DATE_FORMAT,
metavar='DATE_FORMAT',
help='Format string for %%(asctime)s in log records. '
'Default: %(default)s .'),
cfg.StrOpt('log-file',
metavar='PATH',
deprecated_name='logfile',
help='(Optional) Name of log file to output to. '
'If no default is set, logging will go to stdout.'),
cfg.StrOpt('log-dir',
deprecated_name='logdir',
help='(Optional) The base directory used for relative '
'--log-file paths.'),
cfg.BoolOpt('use-syslog',
default=False,
help='Use syslog for logging. '
'Existing syslog format is DEPRECATED during I, '
'and will change in J to honor RFC5424.'),
cfg.BoolOpt('use-syslog-rfc-format',
# TODO(bogdando) remove or use True after existing
# syslog format deprecation in J
default=False,
help='(Optional) Enables or disables syslog rfc5424 format '
'for logging. If enabled, prefixes the MSG part of the '
'syslog message with APP-NAME (RFC5424). The '
'format without the APP-NAME is deprecated in I, '
'and will be removed in J.'),
cfg.StrOpt('syslog-log-facility',
default='LOG_USER',
help='Syslog facility to receive log lines.')
]
generic_log_opts = [
cfg.BoolOpt('use_stderr',
default=True,
help='Log output to standard error.')
]
DEFAULT_LOG_LEVELS = ['amqp=WARN', 'amqplib=WARN', 'boto=WARN',
'qpid=WARN', 'sqlalchemy=WARN', 'suds=INFO',
'oslo_messaging=INFO', 'iso8601=WARN',
'requests.packages.urllib3.connectionpool=WARN',
'urllib3.connectionpool=WARN', 'websocket=WARN']
log_opts = [
cfg.StrOpt('logging_context_format_string',
default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
'%(name)s [%(request_id)s %(user_identity)s] '
'%(instance)s%(message)s',
help='Format string to use for log messages with context.'),
cfg.StrOpt('logging_default_format_string',
default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
'%(name)s [-] %(instance)s%(message)s',
help='Format string to use for log messages without context.'),
cfg.StrOpt('logging_debug_format_suffix',
default='%(funcName)s %(pathname)s:%(lineno)d',
help='Data to append to log format when level is DEBUG.'),
cfg.StrOpt('logging_exception_prefix',
default='%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s '
'%(instance)s',
help='Prefix each line of exception output with this format.'),
cfg.ListOpt('default_log_levels',
default=DEFAULT_LOG_LEVELS,
help='List of logger=LEVEL pairs.'),
cfg.BoolOpt('publish_errors',
default=False,
help='Enables or disables publication of error events.'),
cfg.BoolOpt('fatal_deprecations',
default=False,
help='Enables or disables fatal status of deprecations.'),
# NOTE(mikal): there are two options here because sometimes we are handed
# a full instance (and could include more information), and other times we
# are just handed a UUID for the instance.
cfg.StrOpt('instance_format',
default='[instance: %(uuid)s] ',
help='The format for an instance that is passed with the log '
'message.'),
cfg.StrOpt('instance_uuid_format',
default='[instance: %(uuid)s] ',
help='The format for an instance UUID that is passed with the '
'log message.'),
]
CONF = cfg.CONF
CONF.register_cli_opts(common_cli_opts)
CONF.register_cli_opts(logging_cli_opts)
CONF.register_opts(generic_log_opts)
CONF.register_opts(log_opts)
# our new audit level
# NOTE(jkoelker) Since we synthesized an audit level, make the logging
# module aware of it so it acts like other levels.
logging.AUDIT = logging.INFO + 1
logging.addLevelName(logging.AUDIT, 'AUDIT')
try:
NullHandler = logging.NullHandler
except AttributeError: # NOTE(jkoelker) NullHandler added in Python 2.7
class NullHandler(logging.Handler):
def handle(self, record):
pass
def emit(self, record):
pass
def createLock(self):
self.lock = None
def _dictify_context(context):
if context is None:
return None
if not isinstance(context, dict) and getattr(context, 'to_dict', None):
context = context.to_dict()
return context
def _get_binary_name():
return os.path.basename(inspect.stack()[-1][1])
def _get_log_file_path(binary=None):
logfile = CONF.log_file
logdir = CONF.log_dir
if logfile and not logdir:
return logfile
if logfile and logdir:
return os.path.join(logdir, logfile)
if logdir:
binary = binary or _get_binary_name()
return '%s.log' % (os.path.join(logdir, binary),)
return None
class BaseLoggerAdapter(logging.LoggerAdapter):
def audit(self, msg, *args, **kwargs):
self.log(logging.AUDIT, msg, *args, **kwargs)
def isEnabledFor(self, level):
if _PY26:
# This method was added in python 2.7 (and it does the exact
# same logic, so we need to do the exact same logic so that
# python 2.6 has this capability as well).
return self.logger.isEnabledFor(level)
else:
return super(BaseLoggerAdapter, self).isEnabledFor(level)
class LazyAdapter(BaseLoggerAdapter):
def __init__(self, name='unknown', version='unknown'):
self._logger = None
self.extra = {}
self.name = name
self.version = version
@property
def logger(self):
if not self._logger:
self._logger = getLogger(self.name, self.version)
if six.PY3:
# In Python 3, the code fails because the 'manager' attribute
# cannot be found when using a LoggerAdapter as the
# underlying logger. Work around this issue.
self._logger.manager = self._logger.logger.manager
return self._logger
class ContextAdapter(BaseLoggerAdapter):
warn = logging.LoggerAdapter.warning
def __init__(self, logger, project_name, version_string):
self.logger = logger
self.project = project_name
self.version = version_string
self._deprecated_messages_sent = dict()
@property
def handlers(self):
return self.logger.handlers
def deprecated(self, msg, *args, **kwargs):
"""Call this method when a deprecated feature is used.
If the system is configured for fatal deprecations then the message
is logged at the 'critical' level and :class:`DeprecatedConfig` will
be raised.
Otherwise, the message will be logged (once) at the 'warn' level.
:raises: :class:`DeprecatedConfig` if the system is configured for
fatal deprecations.
"""
stdmsg = _("Deprecated: %s") % msg
if CONF.fatal_deprecations:
self.critical(stdmsg, *args, **kwargs)
raise DeprecatedConfig(msg=stdmsg)
# Using a list because a tuple with dict can't be stored in a set.
sent_args = self._deprecated_messages_sent.setdefault(msg, list())
if args in sent_args:
# Already logged this message, so don't log it again.
return
sent_args.append(args)
self.warn(stdmsg, *args, **kwargs)
def process(self, msg, kwargs):
# NOTE(mrodden): catch any Message/other object and
# coerce to unicode before they can get
# to the python logging and possibly
# cause string encoding trouble
if not isinstance(msg, six.string_types):
msg = six.text_type(msg)
if 'extra' not in kwargs:
kwargs['extra'] = {}
extra = kwargs['extra']
context = kwargs.pop('context', None)
if not context:
context = getattr(local.store, 'context', None)
if context:
extra.update(_dictify_context(context))
instance = kwargs.pop('instance', None)
instance_uuid = (extra.get('instance_uuid') or
kwargs.pop('instance_uuid', None))
instance_extra = ''
if instance:
instance_extra = CONF.instance_format % instance
elif instance_uuid:
instance_extra = (CONF.instance_uuid_format
% {'uuid': instance_uuid})
extra['instance'] = instance_extra
extra.setdefault('user_identity', kwargs.pop('user_identity', None))
extra['project'] = self.project
extra['version'] = self.version
extra['extra'] = extra.copy()
return msg, kwargs
class JSONFormatter(logging.Formatter):
def __init__(self, fmt=None, datefmt=None):
# NOTE(jkoelker) we ignore the fmt argument, but its still there
# since logging.config.fileConfig passes it.
self.datefmt = datefmt
def formatException(self, ei, strip_newlines=True):
lines = traceback.format_exception(*ei)
if strip_newlines:
lines = [moves.filter(
lambda x: x,
line.rstrip().splitlines()) for line in lines]
lines = list(itertools.chain(*lines))
return lines
def format(self, record):
message = {'message': record.getMessage(),
'asctime': self.formatTime(record, self.datefmt),
'name': record.name,
'msg': record.msg,
'args': record.args,
'levelname': record.levelname,
'levelno': record.levelno,
'pathname': record.pathname,
'filename': record.filename,
'module': record.module,
'lineno': record.lineno,
'funcname': record.funcName,
'created': record.created,
'msecs': record.msecs,
'relative_created': record.relativeCreated,
'thread': record.thread,
'thread_name': record.threadName,
'process_name': record.processName,
'process': record.process,
'traceback': None}
if hasattr(record, 'extra'):
message['extra'] = record.extra
if record.exc_info:
message['traceback'] = self.formatException(record.exc_info)
return jsonutils.dumps(message)
def _create_logging_excepthook(product_name):
def logging_excepthook(exc_type, value, tb):
extra = {'exc_info': (exc_type, value, tb)}
getLogger(product_name).critical(
"".join(traceback.format_exception_only(exc_type, value)),
**extra)
return logging_excepthook
class LogConfigError(Exception):
message = _('Error loading logging config %(log_config)s: %(err_msg)s')
def __init__(self, log_config, err_msg):
self.log_config = log_config
self.err_msg = err_msg
def __str__(self):
return self.message % dict(log_config=self.log_config,
err_msg=self.err_msg)
def _load_log_config(log_config_append):
try:
logging.config.fileConfig(log_config_append,
disable_existing_loggers=False)
except (moves.configparser.Error, KeyError) as exc:
raise LogConfigError(log_config_append, six.text_type(exc))
def setup(product_name, version='unknown'):
"""Setup logging."""
if CONF.log_config_append:
_load_log_config(CONF.log_config_append)
else:
_setup_logging_from_conf(product_name, version)
sys.excepthook = _create_logging_excepthook(product_name)
def set_defaults(logging_context_format_string=None,
default_log_levels=None):
# Just in case the caller is not setting the
# default_log_level. This is insurance because
# we introduced the default_log_level parameter
# later in a backwards in-compatible change
if default_log_levels is not None:
cfg.set_defaults(
log_opts,
default_log_levels=default_log_levels)
if logging_context_format_string is not None:
cfg.set_defaults(
log_opts,
logging_context_format_string=logging_context_format_string)
def _find_facility_from_conf():
facility_names = logging.handlers.SysLogHandler.facility_names
facility = getattr(logging.handlers.SysLogHandler,
CONF.syslog_log_facility,
None)
if facility is None and CONF.syslog_log_facility in facility_names:
facility = facility_names.get(CONF.syslog_log_facility)
if facility is None:
valid_facilities = facility_names.keys()
consts = ['LOG_AUTH', 'LOG_AUTHPRIV', 'LOG_CRON', 'LOG_DAEMON',
'LOG_FTP', 'LOG_KERN', 'LOG_LPR', 'LOG_MAIL', 'LOG_NEWS',
'LOG_AUTH', 'LOG_SYSLOG', 'LOG_USER', 'LOG_UUCP',
'LOG_LOCAL0', 'LOG_LOCAL1', 'LOG_LOCAL2', 'LOG_LOCAL3',
'LOG_LOCAL4', 'LOG_LOCAL5', 'LOG_LOCAL6', 'LOG_LOCAL7']
valid_facilities.extend(consts)
raise TypeError(_('syslog facility must be one of: %s') %
', '.join("'%s'" % fac
for fac in valid_facilities))
return facility
class RFCSysLogHandler(logging.handlers.SysLogHandler):
def __init__(self, *args, **kwargs):
self.binary_name = _get_binary_name()
# Do not use super() unless type(logging.handlers.SysLogHandler)
# is 'type' (Python 2.7).
# Use old style calls, if the type is 'classobj' (Python 2.6)
logging.handlers.SysLogHandler.__init__(self, *args, **kwargs)
def format(self, record):
# Do not use super() unless type(logging.handlers.SysLogHandler)
# is 'type' (Python 2.7).
# Use old style calls, if the type is 'classobj' (Python 2.6)
msg = logging.handlers.SysLogHandler.format(self, record)
msg = self.binary_name + ' ' + msg
return msg
def _setup_logging_from_conf(project, version):
log_root = getLogger(None).logger
for handler in log_root.handlers:
log_root.removeHandler(handler)
if CONF.use_syslog:
facility = _find_facility_from_conf()
# TODO(bogdando) use the format provided by RFCSysLogHandler
# after existing syslog format deprecation in J
if CONF.use_syslog_rfc_format:
syslog = RFCSysLogHandler(address='/dev/log',
facility=facility)
else:
syslog = logging.handlers.SysLogHandler(address='/dev/log',
facility=facility)
log_root.addHandler(syslog)
logpath = _get_log_file_path()
if logpath:
filelog = logging.handlers.WatchedFileHandler(logpath)
log_root.addHandler(filelog)
if CONF.use_stderr:
streamlog = ColorHandler()
log_root.addHandler(streamlog)
elif not logpath:
# pass sys.stdout as a positional argument
# python2.6 calls the argument strm, in 2.7 it's stream
streamlog = logging.StreamHandler(sys.stdout)
log_root.addHandler(streamlog)
if CONF.publish_errors:
try:
handler = importutils.import_object(
"zaqar.openstack.common.log_handler.PublishErrorsHandler",
logging.ERROR)
except ImportError:
handler = importutils.import_object(
"oslo_messaging.notify.log_handler.PublishErrorsHandler",
logging.ERROR)
log_root.addHandler(handler)
datefmt = CONF.log_date_format
for handler in log_root.handlers:
# NOTE(alaski): CONF.log_format overrides everything currently. This
# should be deprecated in favor of context aware formatting.
if CONF.log_format:
handler.setFormatter(logging.Formatter(fmt=CONF.log_format,
datefmt=datefmt))
log_root.info('Deprecated: log_format is now deprecated and will '
'be removed in the next release')
else:
handler.setFormatter(ContextFormatter(project=project,
version=version,
datefmt=datefmt))
if CONF.debug:
log_root.setLevel(logging.DEBUG)
elif CONF.verbose:
log_root.setLevel(logging.INFO)
else:
log_root.setLevel(logging.WARNING)
for pair in CONF.default_log_levels:
mod, _sep, level_name = pair.partition('=')
logger = logging.getLogger(mod)
# NOTE(AAzza) in python2.6 Logger.setLevel doesn't convert string name
# to integer code.
if sys.version_info < (2, 7):
level = logging.getLevelName(level_name)
logger.setLevel(level)
else:
logger.setLevel(level_name)
_loggers = {}
def getLogger(name='unknown', version='unknown'):
if name not in _loggers:
_loggers[name] = ContextAdapter(logging.getLogger(name),
name,
version)
return _loggers[name]
def getLazyLogger(name='unknown', version='unknown'):
"""Returns lazy logger.
Creates a pass-through logger that does not create the real logger
until it is really needed and delegates all calls to the real logger
once it is created.
"""
return LazyAdapter(name, version)
class WritableLogger(object):
"""A thin wrapper that responds to `write` and logs."""
def __init__(self, logger, level=logging.INFO):
self.logger = logger
self.level = level
def write(self, msg):
self.logger.log(self.level, msg.rstrip())
class ContextFormatter(logging.Formatter):
"""A context.RequestContext aware formatter configured through flags.
The flags used to set format strings are: logging_context_format_string
and logging_default_format_string. You can also specify
logging_debug_format_suffix to append extra formatting if the log level is
debug.
For information about what variables are available for the formatter see:
http://docs.python.org/library/logging.html#formatter
If available, uses the context value stored in TLS - local.store.context
"""
def __init__(self, *args, **kwargs):
"""Initialize ContextFormatter instance
Takes additional keyword arguments which can be used in the message
format string.
:keyword project: project name
:type project: string
:keyword version: project version
:type version: string
"""
self.project = kwargs.pop('project', 'unknown')
self.version = kwargs.pop('version', 'unknown')
logging.Formatter.__init__(self, *args, **kwargs)
def format(self, record):
"""Uses contextstring if request_id is set, otherwise default."""
# store project info
record.project = self.project
record.version = self.version
# store request info
context = getattr(local.store, 'context', None)
if context:
d = _dictify_context(context)
for k, v in d.items():
setattr(record, k, v)
# NOTE(sdague): default the fancier formatting params
# to an empty string so we don't throw an exception if
# they get used
for key in ('instance', 'color', 'user_identity'):
if key not in record.__dict__:
record.__dict__[key] = ''
if record.__dict__.get('request_id'):
fmt = CONF.logging_context_format_string
else:
fmt = CONF.logging_default_format_string
if (record.levelno == logging.DEBUG and
CONF.logging_debug_format_suffix):
fmt += " " + CONF.logging_debug_format_suffix
if sys.version_info < (3, 2):
self._fmt = fmt
else:
self._style = logging.PercentStyle(fmt)
self._fmt = self._style._fmt
# Cache this on the record, Logger will respect our formatted copy
if record.exc_info:
record.exc_text = self.formatException(record.exc_info, record)
return logging.Formatter.format(self, record)
def formatException(self, exc_info, record=None):
"""Format exception output with CONF.logging_exception_prefix."""
if not record:
return logging.Formatter.formatException(self, exc_info)
stringbuffer = moves.StringIO()
traceback.print_exception(exc_info[0], exc_info[1], exc_info[2],
None, stringbuffer)
lines = stringbuffer.getvalue().split('\n')
stringbuffer.close()
if CONF.logging_exception_prefix.find('%(asctime)') != -1:
record.asctime = self.formatTime(record, self.datefmt)
formatted_lines = []
for line in lines:
pl = CONF.logging_exception_prefix % record.__dict__
fl = '%s%s' % (pl, line)
formatted_lines.append(fl)
return '\n'.join(formatted_lines)
class ColorHandler(logging.StreamHandler):
LEVEL_COLORS = {
logging.DEBUG: '\033[00;32m', # GREEN
logging.INFO: '\033[00;36m', # CYAN
logging.AUDIT: '\033[01;36m', # BOLD CYAN
logging.WARN: '\033[01;33m', # BOLD YELLOW
logging.ERROR: '\033[01;31m', # BOLD RED
logging.CRITICAL: '\033[01;31m', # BOLD RED
}
def format(self, record):
record.color = self.LEVEL_COLORS[record.levelno]
return logging.StreamHandler.format(self, record)
class DeprecatedConfig(Exception):
message = _("Fatal call to deprecated config: %(msg)s")
def __init__(self, msg):
super(Exception, self).__init__(self.message % dict(msg=msg))

View File

@ -23,10 +23,10 @@ import uuid
import enum
from oslo_config import cfg
from oslo_log import log as logging
import six
from zaqar.common import decorators
import zaqar.openstack.common.log as logging
from zaqar.storage import errors
from zaqar.storage import utils

View File

@ -25,7 +25,8 @@ Serves to construct an association between a project + queue -> pool.
}
"""
import zaqar.openstack.common.log as logging
from oslo_log import log as logging
from zaqar.storage import base
from zaqar.storage import errors
from zaqar.storage.mongodb import utils

View File

@ -24,9 +24,9 @@ Field Mappings:
import datetime
from bson import objectid
from oslo_log import log as logging
from oslo_utils import timeutils
import zaqar.openstack.common.log as logging
from zaqar import storage
from zaqar.storage import errors
from zaqar.storage.mongodb import utils

View File

@ -17,12 +17,12 @@
import ssl
from oslo_log import log as logging
import pymongo
import pymongo.errors
from zaqar.common import decorators
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from zaqar import storage
from zaqar.storage.mongodb import controllers
from zaqar.storage.mongodb import options

View File

@ -25,12 +25,12 @@ import datetime
import time
from bson import objectid
from oslo_log import log as logging
from oslo_utils import timeutils
import pymongo.errors
import pymongo.read_preferences
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar import storage
from zaqar.storage import errors
from zaqar.storage.mongodb import utils

View File

@ -21,12 +21,12 @@ Field Mappings:
letter of their long name.
"""
from oslo_log import log as logging
from oslo_utils import timeutils
import pymongo.errors
from zaqar.common import decorators
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar import storage
from zaqar.storage import errors
from zaqar.storage.mongodb import utils

View File

@ -24,11 +24,11 @@ import time
from bson import errors as berrors
from bson import objectid
from bson import tz_util
from oslo_log import log as logging
from oslo_utils import timeutils
from pymongo import errors
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors

View File

@ -13,13 +13,13 @@
# the License.
from oslo_config import cfg
from oslo_log import log as logging
from stevedore import driver
from stevedore import extension
from zaqar import common
from zaqar.common import decorators
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from zaqar.storage import base
LOG = logging.getLogger(__name__)

View File

@ -17,10 +17,10 @@ import heapq
import itertools
from oslo_config import cfg
from oslo_log import log
from zaqar.common import decorators
from zaqar.common.storage import select
from zaqar.openstack.common import log
from zaqar import storage
from zaqar.storage import errors
from zaqar.storage import pipeline

View File

@ -15,11 +15,11 @@
import functools
import msgpack
from oslo_log import log as logging
from oslo_utils import timeutils
from oslo_utils import uuidutils
from zaqar.common import decorators
from zaqar.openstack.common import log as logging
from zaqar import storage
from zaqar.storage import errors
from zaqar.storage.redis import messages

View File

@ -11,6 +11,8 @@
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_log import log as logging
import redis
import redis.sentinel
from six.moves import urllib
@ -18,7 +20,6 @@ from six.moves import urllib
from zaqar.common import decorators
from zaqar.common import errors
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from zaqar import storage
from zaqar.storage.redis import controllers
from zaqar.storage.redis import options

View File

@ -15,11 +15,11 @@
import functools
import msgpack
from oslo_log import log as logging
from oslo_utils import timeutils
import redis
from zaqar.common import decorators
from zaqar.openstack.common import log as logging
from zaqar import storage
from zaqar.storage import errors
from zaqar.storage.redis import utils

View File

@ -18,12 +18,12 @@ import functools
import sys
import time
from oslo_log import log as logging
from oslo_utils import encodeutils
import redis
import six
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from zaqar.storage import errors
LOG = logging.getLogger(__name__)

View File

@ -15,13 +15,13 @@
import functools
from oslo_log import log as logging
from oslo_serialization import jsonutils
from oslo_utils import encodeutils
import sqlalchemy as sa
from sqlalchemy import exc
from sqlalchemy.sql import func as sfunc
from zaqar.openstack.common import log as logging
from zaqar.storage import errors
from zaqar.storage.sqlalchemy import tables

View File

@ -15,12 +15,12 @@
import copy
from oslo_config import cfg
from oslo_log import log
import six
from stevedore import driver
from zaqar.common import errors
from zaqar.common import utils
from zaqar.openstack.common import log
LOG = log.getLogger(__name__)

View File

@ -17,6 +17,7 @@ import os
import fixtures
from oslo_config import cfg
from oslo_log import log
import six
import testtools
@ -77,6 +78,7 @@ class TestBase(testtools.TestCase):
:returns: Project's config object.
"""
conf = cfg.ConfigOpts()
log.register_options(conf)
conf(args=[], default_config_files=[cls.conf_path(filename)])
return conf

View File

@ -16,6 +16,7 @@
import os
from oslo_config import cfg
from oslo_log import log
_DEFAULT = (
@ -49,6 +50,9 @@ def load_config():
conf.register_opts(_AUTH_OPTIONS, group="auth")
conf.register_opts(_ZAQAR_OPTIONS, group="zaqar")
conf.register_opts(_HEADERS_OPTIONS, group="headers")
log.register_options(conf)
conf_path = os.path.join(os.environ["ZAQAR_TESTS_CONFIGS_DIR"],
"functional-tests.conf")
conf(args=[], default_config_files=[conf_path])

View File

@ -18,8 +18,7 @@
from keystoneclient import auth
from keystonemiddleware import auth_token
from keystonemiddleware import opts
from zaqar.openstack.common import log
from oslo_log import log
STRATEGIES = {}

View File

@ -14,6 +14,7 @@
# limitations under the License.
from oslo_config import cfg
from oslo_log import log as logging
try:
import asyncio
@ -22,7 +23,6 @@ except ImportError:
from zaqar.common import decorators
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.transport.websocket import factory

View File

@ -14,6 +14,7 @@
# limitations under the License.
from autobahn.asyncio import websocket
from oslo_log import log as logging
import json
@ -21,7 +22,6 @@ from zaqar.api.v1_1 import request as schema_validator
from zaqar.common.api import request
from zaqar.common.api import response
from zaqar.common import errors
import zaqar.openstack.common.log as logging
LOG = logging.getLogger(__name__)
@ -102,4 +102,4 @@ class MessagingProtocol(websocket.WebSocketServerProtocol):
@staticmethod
def _dummy_request():
action = 'None'
return request.Request(action)
return request.Request(action)

View File

@ -18,11 +18,11 @@ from wsgiref import simple_server
import falcon
from oslo_config import cfg
from oslo_log import log as logging
from zaqar.common import decorators
from zaqar.common.transport.wsgi import helpers
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar import transport
from zaqar.transport import auth
from zaqar.transport import validation

View File

@ -14,9 +14,9 @@
import falcon
import jsonschema
from oslo_log import log as logging
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.transport import utils
from zaqar.transport.wsgi import errors

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -14,11 +14,11 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.common.transport.wsgi import helpers as wsgi_helpers
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -37,10 +37,10 @@ registered, there is an optional field::
import falcon
import jsonschema
from oslo_log import log
from zaqar.common.api.schemas import pools as schema
from zaqar.common import utils as common_utils
from zaqar.openstack.common import log
from zaqar.storage import errors
from zaqar.storage import utils as storage_utils
from zaqar.transport import utils as transport_utils

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.transport import utils
from zaqar.transport import validation
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -14,9 +14,9 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -15,11 +15,11 @@
import falcon
import jsonschema
from oslo_log import log
from zaqar.common.api.schemas import flavors as schema
from zaqar.common import utils as common_utils
from zaqar.i18n import _
from zaqar.openstack.common import log
from zaqar.storage import errors
from zaqar.transport import utils as transport_utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -13,8 +13,9 @@
# License for the specific language governing permissions and limitations under
# the License.
from oslo_log import log as logging
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from zaqar.transport import utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -14,11 +14,11 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.common.transport.wsgi import helpers as wsgi_helpers
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -38,11 +38,11 @@ registered, there is an optional field:
import falcon
import jsonschema
from oslo_log import log
from zaqar.common.api.schemas import pools as schema
from zaqar.common import utils as common_utils
from zaqar.i18n import _
from zaqar.openstack.common import log
from zaqar.storage import errors
from zaqar.storage import utils as storage_utils
from zaqar.transport import utils as transport_utils

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -14,9 +14,9 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -15,11 +15,11 @@
import falcon
import jsonschema
from oslo_log import log
from zaqar.common.api.schemas import flavors as schema
from zaqar.common import utils as common_utils
from zaqar.i18n import _
from zaqar.openstack.common import log
from zaqar.storage import errors
from zaqar.transport import utils as transport_utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -13,8 +13,9 @@
# License for the specific language governing permissions and limitations under
# the License.
from oslo_log import log as logging
from zaqar.i18n import _
from zaqar.openstack.common import log as logging
from zaqar.transport import utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -14,11 +14,11 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.common.transport.wsgi import helpers as wsgi_helpers
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -38,11 +38,11 @@ registered, there is an optional field:
import falcon
import jsonschema
from oslo_log import log
from zaqar.common.api.schemas import pools as schema
from zaqar.common import utils as common_utils
from zaqar.i18n import _
from zaqar.openstack.common import log
from zaqar.storage import errors
from zaqar.storage import utils as storage_utils
from zaqar.transport import utils as transport_utils

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation

View File

@ -14,9 +14,9 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport.wsgi import errors as wsgi_errors

View File

@ -14,10 +14,10 @@
# limitations under the License.
import falcon
from oslo_log import log as logging
import six
from zaqar.i18n import _
import zaqar.openstack.common.log as logging
from zaqar.storage import errors as storage_errors
from zaqar.transport import utils
from zaqar.transport import validation