Usage

Usage

oslo.context is used in conjunction with oslo.log to provide context aware log records when specifying a RequestContext object.

This code example demonstrates two INFO log records with varying output format due to the use of RequestContext.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from oslo_config import cfg
from oslo_context import context
from oslo_log import log as logging

CONF = cfg.CONF
DOMAIN = "demo"

logging.register_options(CONF)
logging.setup(CONF, DOMAIN)

LOG = logging.getLogger(__name__)

LOG.info("Message without context")
context.RequestContext()
LOG.info("Message with context")

Source: usage_simple.py

Example Logging Output:

2016-01-20 21:56:29.283 8428 INFO __main__ [-] Message without context
2016-01-20 21:56:29.284 8428 INFO __main__ [req-929d23e9-f50e-46ae-a8a7-02bc8c3fd2c8 - - - - -] Message with context

The format of these log records are defined by the logging_default_format_string and logging_context_format_string configuration options respectively. The logging_user_identity_format option also provides further context aware definition flexibility.

Context Variables

The oslo.context variables used in the logging_context_format_string and logging_user_identity_format configuration options include:

  • global_request_id - A request id (e.g. req-9f2c484a-b504-4fd9-b44c-4357544cca50) which may have been sent in from another service to indicate this is part of a chain of requests.
  • request_id - A request id (e.g. req-9f2c484a-b504-4fd9-b44c-4357544cca50)
  • user - A user id (e.g. e5bc7033e6b7473c9fe8ee1bd4df79a3)
  • tenant - A tenant/project id (e.g. 79e338475db84f7c91ee4e86b79b34c1)
  • domain - A domain id
  • user_domain - A user domain id
  • project_domain - A project domain id

This code example demonstrates defining a context with specific attributes that are presented in the output log record.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from oslo_config import cfg
from oslo_context import context
from oslo_log import log as logging

CONF = cfg.CONF
DOMAIN = "demo"

logging.register_options(CONF)
logging.setup(CONF, DOMAIN)

LOG = logging.getLogger(__name__)

LOG.info("Message without context")
# ids in Openstack are 32 characters long
# For readability a shorter id value is used
context.RequestContext(user='6ce90b4d',
                       tenant='d6134462',
                       project_domain='a6b9360e')
LOG.info("Message with context")

Source: usage.py

Example Logging Output:

2016-01-21 17:30:50.263 12201 INFO __main__ [-] Message without context
2016-01-21 17:30:50.264 12201 INFO __main__ [req-e591e881-36c3-4627-a5d8-54df200168ef 6ce90b4d d6134462 - - a6b9360e] Message with context

A context object can also be passed as an argument to any logging level message.

1
2
3
4
context = context.RequestContext(user='ace90b4d',
                                 tenant='b6134462',
                                 project_domain='c6b9360e')
LOG.info("Message with passed context", context=context)

Example Logging Output:

2016-01-21 22:43:55.621 17295 INFO __main__ [req-ac2d4a3a-ff3c-4c2b-97a0-2b76b33d9e72 ace90b4d b6134462 - - c6b9360e] Message with passed context

Note

To maintain consistent log messages for operators across multiple OpenStack projects it is highly recommended that logging_default_format_string and logging_context_format_string are not modified from oslo.log default values.

Project Specific Variables

Individual projects can also subclass RequestContext to provide additional attributes that can be using with oslo.log. The Nova RequestContext class for example provides additional variables including user_name and project_name.

This can for example enable the defining of logging_user_identity_format = %(user_name)s %(project_name)s which would produce a log record containing a context portion using names instead of ids such as [req-e4b9a194-a9b1-4829-b7d0-35226fc101fc admin demo]

This following code example shows how a modified logging_user_identity_format configuration alters the context portion of the log record.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from oslo_config import cfg
from oslo_context import context
from oslo_log import log as logging

CONF = cfg.CONF
DOMAIN = "demo"

logging.register_options(CONF)
CONF.logging_user_identity_format = "%(user)s/%(tenant)s@%(project_domain)s"
logging.setup(CONF, DOMAIN)

LOG = logging.getLogger(__name__)

LOG.info("Message without context")
# ids in Openstack are 32 characters long
# For readability a shorter id value is used
context.RequestContext(request_id='req-abc',
                       user='6ce90b4d',
                       tenant='d6134462',
                       project_domain='a6b9360e')
LOG.info("Message with context")

Source: usage_user_identity.py

Example Logging Output:

2016-01-21 20:56:43.964 14816 INFO __main__ [-] Message without context
2016-01-21 20:56:43.965 14816 INFO __main__ [req-abc 6ce90b4d/d6134462@a6b9360e] Message with context
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.