Add ability to configure app logs to be written to a file (#903)

It gives users the option to send Patroni application logs to a File instead of Standard Out. There are three environment variables that can be set to enable and configure file logging.
1. `PATRONI_FILE_LOG_DIR`: Path to a directory that is writeable by the executing user. Having this variable set is what activates file logging.
2. `PATRONI_FILE_LOG_NUM`: This is a rolling file logger. This variable dictates how many log files are retained.
3. `PATRONI_FILE_LOG_SIZE`: This variable dictates the size at which the logs will roll.

If `PATRONI_FILE_LOG_DIR` is not set than Patroni will log to stderr (default behavior does not change)

Closes https://github.com/zalando/patroni/issues/902
This commit is contained in:
Lucas Capistrant
2018-12-21 15:38:29 +01:00
committed by Alexander Kukushkin
parent 491f230711
commit f3da6de129
3 changed files with 22 additions and 4 deletions
+3
View File
@@ -51,3 +51,6 @@ scm-source.json
docs/build/
docs/source/_static/
docs/source/_templates/
# Pycharm IDE
.idea/
+3 -1
View File
@@ -8,11 +8,13 @@ It is possible to override some of the configuration parameters defined in the P
Global/Universal
----------------
- **PATRONI\_CONFIGURATION**: it is possible to set the entire configuration for the Patroni via ``PATRONI_CONFIGURATION`` environment variable. In this case any other environment variables will not be considered!
- **PATRONI\_FILE\_LOG\_DIR**: Directory to write application logs to. The directory must exist and be writable by the user executing Patroni. If you set this env variable, the application will retain 4 25MB logs by default. You can tune those retention values with PATRONI_LOG_FILE_NUM and PATRONI_LOG_FILE_SIZE (see below).
- **PATRONI\_FILE\_LOG\_NUM**: The number of application logs to retain.
- **PATRONI\_FILE\_LOG\_SIZE**: Size of log application log file that triggers a log rolling.
- **PATRONI\_NAME**: name of the node where the current instance of Patroni is running. Must be unique for the cluster.
- **PATRONI\_NAMESPACE**: path within the configuration store where Patroni will keep information about the cluster. Default value: "/service"
- **PATRONI\_SCOPE**: cluster name
- **PATRONI\_LOGLEVEL**: sets the general logging level (see `the docs for Python logging <https://docs.python.org/3.6/library/logging.html#levels>`_)
- **PATRONI\_REQUESTS_LOGLEVEL**: sets the logging level for all HTTP requests e.g. Kubernetes API calls (see `the docs for Python logging <https://docs.python.org/3.6/library/logging.html#levels>`_)
Bootstrap configuration
-----------------------
+16 -3
View File
@@ -1,3 +1,4 @@
from logging.handlers import RotatingFileHandler
import logging
import os
import signal
@@ -138,11 +139,22 @@ class Patroni(object):
def patroni_main():
logdir = os.environ.get('PATRONI_FILE_LOG_DIR', None)
logformat = os.environ.get('PATRONI_LOGFORMAT', '%(asctime)s %(levelname)s: %(message)s')
loglevel = os.environ.get('PATRONI_LOGLEVEL', 'INFO')
requests_loglevel = os.environ.get('PATRONI_REQUESTS_LOGLEVEL', 'WARNING')
logging.basicConfig(format=logformat, level=loglevel)
logging.getLogger('requests').setLevel(requests_loglevel)
if not logdir:
logging.basicConfig(format=logformat, level=loglevel)
else:
logsize = os.environ.get('PATRONI_FILE_LOG_SIZE', 25000000)
lognum = os.environ.get('PATRONI_FILE_LOG_NUM', 4)
root_logger = logging.getLogger()
root_logger.setLevel(loglevel)
handler = RotatingFileHandler(os.path.join(logdir, 'patroni.log'), mode='a', maxBytes=logsize,
backupCount=lognum)
handler.setFormatter(logging.Formatter(logformat))
root_logger.addHandler(handler)
patroni = Patroni()
try:
@@ -151,6 +163,7 @@ def patroni_main():
pass
finally:
patroni.shutdown()
logging.shutdown()
def pg_ctl_start(args):