added capability to take JSON as log's config

This commit is contained in:
Cuong Tran 2018-11-13 14:27:43 +00:00
parent c66957bbe9
commit e98f6a039c
3 changed files with 55 additions and 12 deletions

View File

@ -264,6 +264,16 @@ The log config file to use.
Gunicorn uses the standard Python logging module's Configuration
file format.
.. _logconfig-json:
logiconfig_json
~~~~~~~~~
* ``--log-config-json FILE``
* ``None``
The log config file written in JSON.
.. _logconfig-dict:
logconfig_dict
@ -274,8 +284,9 @@ logconfig_dict
The log config dictionary to use, using the standard Python
logging module's dictionary configuration format. This option
takes precedence over the :ref:`logconfig` option, which uses the
older file configuration format.
takes precedence over the :ref:`logconfig` and :ref:`logConfigJson` options, which uses the
older file configuration format and JSON respectively.
Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig

View File

@ -1368,8 +1368,8 @@ class LogConfigDict(Setting):
desc = """\
The log config dictionary to use, using the standard Python
logging module's dictionary configuration format. This option
takes precedence over the :ref:`logconfig` option, which uses the
older file configuration format.
takes precedence over the :ref:`logconfig` and :ref:`logConfigJson` options, which uses the
older file configuration format and JSON respectively.
Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig
@ -1377,6 +1377,22 @@ class LogConfigDict(Setting):
"""
class LogConfigJson(Setting):
name = "logconfig_json"
section = "Logging"
cli = ["--log-config-json"]
meta = "FILE"
validator = validate_string
default = None
desc = """\
The log config JSON reads config from a JSON file
Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig
.. versionadded:: 19.9
"""
class SyslogTo(Setting):
name = "syslog_addr"
section = "Logging"

View File

@ -5,6 +5,7 @@
import base64
import binascii
import json
import time
import logging
logging.Logger.manager.emittedNoHandlerWarning = 1
@ -238,6 +239,21 @@ class Logger(object):
TypeError
) as exc:
raise RuntimeError(str(exc))
elif cfg.logconfig_json:
config = CONFIG_DEFAULTS.copy()
if os.path.exists(cfg.logconfig_json):
try:
config_json = json.load(open(cfg.logconfig_json))
config.update(config_json)
dictConfig(config)
except(
json.JSONDecodeError,
AttributeError,
ImportError,
ValueError,
TypeError
) as exc:
raise RuntimeError(str(exc))
elif cfg.logconfig:
if os.path.exists(cfg.logconfig):
defaults = CONFIG_DEFAULTS.copy()
@ -330,7 +346,7 @@ class Logger(object):
"""
if not (self.cfg.accesslog or self.cfg.logconfig or
self.cfg.logconfig_dict or
self.cfg.logconfig_dict or self.cfg.logconfig_json or
(self.cfg.syslog and not self.cfg.disable_redirect_access_to_syslog)):
return