用法

oslo.context 与 oslo.log 结合使用,以便在指定 RequestContext 对象时提供感知上下文的日志记录。

此代码示例演示了两个 INFO 日志记录,由于使用了 RequestContext,其输出格式有所不同。

 1from oslo_config import cfg
 2from oslo_context import context
 3from oslo_log import log as logging
 4
 5CONF = cfg.CONF
 6DOMAIN = "demo"
 7
 8logging.register_options(CONF)
 9logging.setup(CONF, DOMAIN)
10
11LOG = logging.getLogger(__name__)
12
13LOG.info("Message without context")
14context.RequestContext()
15LOG.info("Message with context")

来源:usage_simple.py

示例日志输出

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

这些日志记录的格式由 logging_default_format_stringlogging_context_format_string 配置选项分别定义。 logging_user_identity_format 选项也提供了进一步的感知上下文的定义灵活性。

上下文变量

logging_context_format_stringlogging_user_identity_format 配置选项中使用的 oslo.context 变量包括

  • global_request_id - 一个请求 ID(例如 req-9f2c484a-b504-4fd9-b44c-4357544cca50),可能已从另一个服务发送过来,以指示这是请求链的一部分。

  • request_id - 一个请求 ID(例如 req-9f2c484a-b504-4fd9-b44c-4357544cca50)

  • user - 一个用户 ID(例如 e5bc7033e6b7473c9fe8ee1bd4df79a3)

  • tenant - 一个租户/项目 ID(例如 79e338475db84f7c91ee4e86b79b34c1)

  • domain - 一个域 ID

  • user_domain - 一个用户域 ID

  • project_domain - 一个项目域 ID

此代码示例演示了定义具有特定属性的上下文,这些属性显示在输出日志记录中。

 1from oslo_config import cfg
 2from oslo_context import context
 3from oslo_log import log as logging
 4
 5CONF = cfg.CONF
 6DOMAIN = "demo"
 7
 8logging.register_options(CONF)
 9logging.setup(CONF, DOMAIN)
10
11LOG = logging.getLogger(__name__)
12
13LOG.info("Message without context")
14# ids in Openstack are 32 characters long
15# For readability a shorter id value is used
16context.RequestContext(
17    user_id='6ce90b4d', project_id='d6134462', project_domain_id='a6b9360e'
18)
19LOG.info("Message with context")

来源:usage.py

示例日志输出

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

上下文对象也可以作为参数传递给任何日志级别消息。

1context = context.RequestContext(
2    user_id='ace90b4d', project_id='b6134462', project_domain_id='c6b9360e'
3)
4LOG.info("Message with passed context", context=context)

示例日志输出

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

注意

为了维护跨多个 OpenStack 项目对操作员的一致日志消息,强烈建议不要从 oslo.log 默认值修改 logging_default_format_stringlogging_context_format_string

项目特定变量

各个项目还可以子类化 RequestContext 以提供可以使用 oslo.log 的其他属性。 例如,Nova RequestContext 类提供了额外的变量,包括 user_name 和 project_name。

例如,这可以启用定义 logging_user_identity_format = %(user_name)s %(project_name)s,这将生成一个日志记录,其中包含使用名称而不是 ID 的上下文部分,例如 [req-e4b9a194-a9b1-4829-b7d0-35226fc101fc admin demo]

以下代码示例显示了修改后的 logging_user_identity_format 配置如何更改日志记录的上下文部分。

 1from oslo_config import cfg
 2from oslo_context import context
 3from oslo_log import log as logging
 4
 5CONF = cfg.CONF
 6DOMAIN = "demo"
 7
 8logging.register_options(CONF)
 9CONF.logging_user_identity_format = (
10    "%(user_id)s/%(project_id)s@%(project_domain)s"
11)
12logging.setup(CONF, DOMAIN)
13
14LOG = logging.getLogger(__name__)
15
16LOG.info("Message without context")
17# ids in Openstack are 32 characters long
18# For readability a shorter id value is used
19context.RequestContext(
20    request_id='req-abc',
21    user_id='6ce90b4d',

来源:usage_user_identity.py

示例日志输出

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