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

View File

@ -1368,8 +1368,8 @@ class LogConfigDict(Setting):
desc = """\ desc = """\
The log config dictionary to use, using the standard Python The log config dictionary to use, using the standard Python
logging module's dictionary configuration format. This option logging module's dictionary configuration format. This option
takes precedence over the :ref:`logconfig` option, which uses the takes precedence over the :ref:`logconfig` and :ref:`logConfigJson` options, which uses the
older file configuration format. older file configuration format and JSON respectively.
Format: https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig 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): class SyslogTo(Setting):
name = "syslog_addr" name = "syslog_addr"
section = "Logging" section = "Logging"

View File

@ -5,6 +5,7 @@
import base64 import base64
import binascii import binascii
import json
import time import time
import logging import logging
logging.Logger.manager.emittedNoHandlerWarning = 1 logging.Logger.manager.emittedNoHandlerWarning = 1
@ -238,6 +239,21 @@ class Logger(object):
TypeError TypeError
) as exc: ) as exc:
raise RuntimeError(str(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: elif cfg.logconfig:
if os.path.exists(cfg.logconfig): if os.path.exists(cfg.logconfig):
defaults = CONFIG_DEFAULTS.copy() defaults = CONFIG_DEFAULTS.copy()
@ -330,7 +346,7 @@ class Logger(object):
""" """
if not (self.cfg.accesslog or self.cfg.logconfig or 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)): (self.cfg.syslog and not self.cfg.disable_redirect_access_to_syslog)):
return return