首页 > 解决方案 > Django 将环境值传递给 Logstash

问题描述

加入了一个已经有书面记录器的项目。为了方便过滤,需要在logger的任何消息前加上环境值的传递。

预期结果

现在

我怎么能这样做?

设置:

APP_ENV = os.getenv("APP_ENV")

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
    'verbose': {
        'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
    },
    'simple': {
        'format': '%(levelname)s %(message)s'
    },
},
'handlers': {
    'graypy': {
        'level': 'INFO',
        'class': 'graypy.GELFHandler',
        'host': 'logstash...',
        'port': 12222,
    },
    'console': {
        'level': 'INFO',
        'class': 'logging.StreamHandler',
        'formatter': 'simple',
    },
},
'loggers': {
    'django': {
        'handlers': ['graypy', 'console'],
        'level': 'WARNING'
    },
    'mts_marketplace': {
        'handlers': ['graypy', 'console'],
        'level': 'INFO',
        'propagate': True,
    },
    'mts_marketplace.processing': {
        'handlers': ['graypy', 'console'],
        'level': 'INFO',
        'propagate': False,
    },
    'mts_marketplace.internal_api': {
        'handlers': ['graypy', 'console'],
        'level': 'INFO',
        'propagate': False,
    },
    'mts_marketplace.trustedgoods': {
        'handlers': ['graypy', 'console'],
        'level': 'INFO',
        'propagate': False,
    },
    'mts_marketplace.fka': {
        'handlers': ['graypy', 'console'],
        'level': 'INFO',
        'propagate': False,
    },
  },
}

标签: django

解决方案


Django 使用 Python 的日志记录机制,因此这部分也适用于 Django: https ://docs.python.org/3/howto/logging-cookbook.html#using-loggeradapters-to-impart-contextual-information

使用 LoggerAdapters 传递上下文信息

传递上下文信息以与日志事件信息一起输出的一种简单方法是使用 LoggerAdapter 类。这个类被设计成看起来像一个 Logger,所以你可以调用 debug()、info()、warning()、error()、exception()、critical() 和 log()。这些方法与 Logger 中的对应方法具有相同的签名,因此您可以互换使用这两种类型的实例。

或者,正如@dirkgroten 已经建议的那样:

https://docs.python.org/3/howto/logging-cookbook.html#using-filters-to-impart-contextual-information

使用过滤器传递上下文信息

您还可以使用用户定义的过滤器将上下文信息添加到日志输出。过滤器实例可以修改传递给它们的 LogRecords,包括添加额外的属性,这些属性可以使用合适的格式字符串输出,或者如果需要自定义 Formatter。

这两部分都提供了示例代码。


推荐阅读