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
@ -1173,11 +1184,11 @@ libraries may be installed using setuptools' ``extra_require`` feature.
A string referring to one of the following bundled classes: A string referring to one of the following bundled classes:
* ``sync`` * ``sync``
* ``eventlet`` - Requires eventlet >= 0.9.7 (or install it via * ``eventlet`` - Requires eventlet >= 0.9.7 (or install it via
``pip install gunicorn[eventlet]``) ``pip install gunicorn[eventlet]``)
* ``gevent`` - Requires gevent >= 0.13 (or install it via * ``gevent`` - Requires gevent >= 0.13 (or install it via
``pip install gunicorn[gevent]``) ``pip install gunicorn[gevent]``)
* ``tornado`` - Requires tornado >= 0.2 (or install it via * ``tornado`` - Requires tornado >= 0.2 (or install it via
``pip install gunicorn[tornado]``) ``pip install gunicorn[tornado]``)
* ``gthread`` - Python 2 requires the futures package to be installed * ``gthread`` - Python 2 requires the futures package to be installed
(or install it via ``pip install gunicorn[gthread]``) (or install it via ``pip install gunicorn[gthread]``)

View File

@ -627,11 +627,11 @@ class WorkerClass(Setting):
A string referring to one of the following bundled classes: A string referring to one of the following bundled classes:
* ``sync`` * ``sync``
* ``eventlet`` - Requires eventlet >= 0.9.7 (or install it via * ``eventlet`` - Requires eventlet >= 0.9.7 (or install it via
``pip install gunicorn[eventlet]``) ``pip install gunicorn[eventlet]``)
* ``gevent`` - Requires gevent >= 0.13 (or install it via * ``gevent`` - Requires gevent >= 0.13 (or install it via
``pip install gunicorn[gevent]``) ``pip install gunicorn[gevent]``)
* ``tornado`` - Requires tornado >= 0.2 (or install it via * ``tornado`` - Requires tornado >= 0.2 (or install it via
``pip install gunicorn[tornado]``) ``pip install gunicorn[tornado]``)
* ``gthread`` - Python 2 requires the futures package to be installed * ``gthread`` - Python 2 requires the futures package to be installed
(or install it via ``pip install gunicorn[gthread]``) (or install it via ``pip install gunicorn[gthread]``)
@ -668,7 +668,7 @@ class WorkerThreads(Setting):
If it is not defined, the default is ``1``. If it is not defined, the default is ``1``.
This setting only affects the Gthread worker type. This setting only affects the Gthread worker type.
.. note:: .. note::
If you try to use the ``sync`` worker type and set the ``threads`` If you try to use the ``sync`` worker type and set the ``threads``
setting to more than 1, the ``gthread`` worker type will be used setting to more than 1, the ``gthread`` worker type will be used
@ -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