【问题标题】:Cannot change oslo_log log format无法更改 oslo_log 日志格式
【发布时间】:2021-10-05 14:50:23
【问题描述】:

我试图为 oslo_log.log 配置日志格式以让日志上下文包含 文件名和行号。

日志配置好像变了,但是控制台的输出还是一样。

from oslo_config import cfg
from oslo_log import log 
import oslo_log

CONF = cfg.CONF
DOMAIN = "demo"
log.register_options(CONF)

LOG = log.getLogger(__name__)

_DEFAULT_LOGGING_CONTEXT_FORMAT = ('%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s')

log.set_defaults(_DEFAULT_LOGGING_CONTEXT_FORMAT, _DEFAULT_LOG_LEVELS)

log.setup(CONF, DOMAIN)

LOG.info("Welcome to Oslo Logging")
LOG.debug("A debugging message")
LOG.warning("A warning occurred")
LOG.error("An error occurred")

print(CONF.logging_context_format_string)

没有 log.set_defaults() 的输出:

2021-10-05 10:48:02.438 28234 INFO __main__ [-] Welcome to Oslo Logging
2021-10-05 10:48:02.439 28234 WARNING __main__ [-] A warning occurred
2021-10-05 10:48:02.439 28234 ERROR __main__ [-] An error occurred
%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s

使用 log.set_defaults() 输出:

2021-10-05 10:48:31.376 28246 INFO __main__ [-] Welcome to Oslo Logging
2021-10-05 10:48:31.377 28246 WARNING __main__ [-] A warning occurred
2021-10-05 10:48:31.378 28246 ERROR __main__ [-] An error occurred
%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s

为什么对象 LOG 的行为与配置未更改时的行为相同?

【问题讨论】:

  • 不确定我是否理解您的问题。配置不会改变日志的输出吗?
  • 是的,我调用了 set_defaults(),试图覆盖 logging_context_format_string 的默认值。
  • 看我的回答,但你真的想做CONF.set_override('logging_default_format_string', '%(asctime)s')之类的事情
  • 如果答案不够,请告诉我。

标签: python logging formatting openstack


【解决方案1】:

您正在更改默认上下文日志(又名logging_context_format_string)的日志格式,该格式用于附加了oslo.context 对象的日志行。带有上下文的日志行可以记录更详细的信息;例如执行请求的项目或用户 ID。这不会影响像这样没有附加上下文的常规日志行。

2021-10-05 10:48:31.378 28246 错误 ma​​in [-] 发生错误

如果您尝试更改常规日志行(又名logging_default_format_string),则需要使用oslo.configsset_override 覆盖它。

例如

CONF.set_override('logging_default_format_string', '%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s')

或者你可以在你的配置文件中设置它,例如

[DEFAULT]
log_date_format = %Y-%m-%d %H:%M:%S
logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
logging_default_format_string = %(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s

您可以为您的项目加载这样的配置文件。

cfg.CONF(sys.argv[1:], default_config_files=['test.conf'])

您无法使用log.set_defaults 执行此操作的原因是该功能仅允许您修改基于上下文的日志行。可以看到实现here

作为奖励,这是一个完整的示例。

from oslo_config import cfg
from oslo_log import log

_DEFAULT_LOGGING_CONTEXT_FORMAT = (
    '%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
    '%(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s'
)

CONF = cfg.CONF
log.register_options(CONF)
LOG = log.getLogger(__name__)
log.setup(CONF, 'test')
CONF.set_override(
    'logging_default_format_string', '%(asctime)s,%(msecs)d %(levelname)-8s '
                                     '[%(filename)s:%(lineno)d] %(message)s'
)

log.set_defaults(
    logging_context_format_string=_DEFAULT_LOGGING_CONTEXT_FORMAT,
)

# Log something
LOG.info("Welcome to Oslo Logging")
LOG.debug("A debugging message")
LOG.warning("A warning occurred")
LOG.error("An error occurred")

print('logging_default_format_string:', CONF.logging_default_format_string)
print('logging_context_format_string:', CONF.logging_context_format_string)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2021-09-01
    • 2013-09-13
    • 2021-01-18
    • 1970-01-01
    • 2011-12-12
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多