Provide log server port as config paramter

This commit is contained in:
kansi 2017-10-23 09:17:58 +05:30
parent cafbb5c944
commit 0c0d3049f2
9 changed files with 38 additions and 12 deletions

View File

@ -97,6 +97,7 @@ config = {
'fmt_console': log_config['formatters']['console']['format'], 'fmt_console': log_config['formatters']['console']['format'],
'fmt_logfile': log_config['formatters']['file']['format'], 'fmt_logfile': log_config['formatters']['file']['format'],
'granular_levels': {}, 'granular_levels': {},
'port': log_config['root']['port']
}, },
'graphite': { 'graphite': {
'host': os.environ.get('BIGCHAINDB_GRAPHITE_HOST', 'localhost'), 'host': os.environ.get('BIGCHAINDB_GRAPHITE_HOST', 'localhost'),

View File

@ -62,6 +62,7 @@ SUBSCRIBER_LOGGING_CONFIG = {
'loggers': {}, 'loggers': {},
'root': { 'root': {
'level': logging.DEBUG, 'level': logging.DEBUG,
'handlers': ['console', 'file', 'errors'] 'handlers': ['console', 'file', 'errors'],
'port': 9020
}, },
} }

View File

@ -22,11 +22,14 @@ class HttpServerLogger(Logger):
object. *Ignored*. object. *Ignored*.
""" """
log_cfg = self.cfg.env_orig.get('custom_log_config', {})
self.log_port = log_cfg.get('port', DEFAULT_SOCKET_LOGGING_PORT)
self._set_socklog_handler(self.error_log) self._set_socklog_handler(self.error_log)
self._set_socklog_handler(self.access_log) self._set_socklog_handler(self.access_log)
def _set_socklog_handler(self, log): def _set_socklog_handler(self, log):
socket_handler = logging.handlers.SocketHandler( socket_handler = logging.handlers.SocketHandler(
DEFAULT_SOCKET_LOGGING_HOST, DEFAULT_SOCKET_LOGGING_PORT) DEFAULT_SOCKET_LOGGING_HOST, self.log_port)
socket_handler._gunicorn = True socket_handler._gunicorn = True
log.addHandler(socket_handler) log.addHandler(socket_handler)

View File

@ -25,17 +25,29 @@ def _normalize_log_level(level):
raise ConfigurationError('Log level must be a string!') from exc raise ConfigurationError('Log level must be a string!') from exc
def setup_pub_logger(): def setup_pub_logger(logging_port=None):
if logging_port is None:
logging_port = DEFAULT_SOCKET_LOGGING_PORT
dictConfig(PUBLISHER_LOGGING_CONFIG) dictConfig(PUBLISHER_LOGGING_CONFIG)
socket_handler = logging.handlers.SocketHandler( socket_handler = logging.handlers.SocketHandler(
DEFAULT_SOCKET_LOGGING_HOST, DEFAULT_SOCKET_LOGGING_PORT) DEFAULT_SOCKET_LOGGING_HOST, logging_port)
socket_handler.setLevel(logging.DEBUG) socket_handler.setLevel(logging.DEBUG)
logger = logging.getLogger() logger = logging.getLogger()
logger.addHandler(socket_handler) logger.addHandler(socket_handler)
def setup_sub_logger(*, user_log_config=None): def setup_sub_logger(*, user_log_config=None):
server = LogRecordSocketServer() kwargs = {}
logging_port = None
if user_log_config is not None:
logging_port = user_log_config.get('port')
if logging_port is not None:
kwargs['port'] = logging_port
server = LogRecordSocketServer(**kwargs)
with server: with server:
server_proc = Process( server_proc = Process(
target=server.serve_forever, target=server.serve_forever,
@ -45,7 +57,8 @@ def setup_sub_logger(*, user_log_config=None):
def setup_logging(*, user_log_config=None): def setup_logging(*, user_log_config=None):
setup_pub_logger() port = user_log_config.get('port') if user_log_config is not None else None
setup_pub_logger(logging_port=port)
setup_sub_logger(user_log_config=user_log_config) setup_sub_logger(user_log_config=user_log_config)

View File

@ -63,7 +63,8 @@ def start():
election.start(events_queue=exchange.get_publisher_queue()) election.start(events_queue=exchange.get_publisher_queue())
# start the web api # start the web api
app_server = server.create_server(bigchaindb.config['server']) app_server = server.create_server(settings=bigchaindb.config['server'],
log_config=bigchaindb.config['log'])
p_webapi = mp.Process(name='webapi', target=app_server.run) p_webapi = mp.Process(name='webapi', target=app_server.run)
p_webapi.start() p_webapi.start()

View File

@ -37,6 +37,11 @@ class StandaloneApplication(gunicorn.app.base.BaseApplication):
super().__init__() super().__init__()
def load_config(self): def load_config(self):
# find a better way to pass this such that
# the custom logger class can access it.
custom_log_config = self.options.get('custom_log_config')
self.cfg.env_orig['custom_log_config'] = custom_log_config
config = dict((key, value) for key, value in self.options.items() config = dict((key, value) for key, value in self.options.items()
if key in self.cfg.settings and value is not None) if key in self.cfg.settings and value is not None)
@ -74,7 +79,7 @@ def create_app(*, debug=False, threads=1):
return app return app
def create_server(settings): def create_server(settings, log_config=None):
"""Wrap and return an application ready to be run. """Wrap and return an application ready to be run.
Args: Args:
@ -97,6 +102,7 @@ def create_server(settings):
settings['threads'] = 1 settings['threads'] = 1
settings['logger_class'] = 'bigchaindb.log.loggers.HttpServerLogger' settings['logger_class'] = 'bigchaindb.log.loggers.HttpServerLogger'
settings['custom_log_config'] = log_config
app = create_app(debug=settings.get('debug', False), app = create_app(debug=settings.get('debug', False),
threads=settings['threads']) threads=settings['threads'])
standalone = StandaloneApplication(app, options=settings) standalone = StandaloneApplication(app, options=settings)

View File

@ -7,9 +7,9 @@ class TestHttpServerLogger:
from bigchaindb.log.configs import ( from bigchaindb.log.configs import (
DEFAULT_SOCKET_LOGGING_ADDR as expected_socket_address) DEFAULT_SOCKET_LOGGING_ADDR as expected_socket_address)
from bigchaindb.log.loggers import HttpServerLogger from bigchaindb.log.loggers import HttpServerLogger
mocked_config = mocker.patch( from gunicorn import config
'gunicorn.config.Config', autospec=True, spec_set=True) logger_config = config.Config()
logger = HttpServerLogger(mocked_config.return_value) logger = HttpServerLogger(logger_config)
assert len(logger.access_log.handlers) == 1 assert len(logger.access_log.handlers) == 1
assert len(logger.error_log.handlers) == 1 assert len(logger.error_log.handlers) == 1
assert isinstance(logger.access_log.handlers[0], SocketHandler) assert isinstance(logger.access_log.handlers[0], SocketHandler)

View File

@ -70,7 +70,7 @@ def log_record_bytes(log_record_dict):
def test_setup_logging(mocked_setup_pub_logger, mocked_setup_sub_logger): def test_setup_logging(mocked_setup_pub_logger, mocked_setup_sub_logger):
from bigchaindb.log.setup import setup_logging from bigchaindb.log.setup import setup_logging
setup_logging() setup_logging()
mocked_setup_pub_logger.assert_called_once_with() mocked_setup_pub_logger.assert_called_once_with(logging_port=None)
mocked_setup_sub_logger.assert_called_once_with(user_log_config=None) mocked_setup_sub_logger.assert_called_once_with(user_log_config=None)

View File

@ -302,6 +302,7 @@ def test_autoconfigure_read_both_from_file_and_env(monkeypatch, request, certs_d
'fmt_console': log_config['formatters']['console']['format'], 'fmt_console': log_config['formatters']['console']['format'],
'fmt_logfile': log_config['formatters']['file']['format'], 'fmt_logfile': log_config['formatters']['file']['format'],
'granular_levels': {}, 'granular_levels': {},
'port': 9020
}, },
'graphite': {'host': 'localhost'}, 'graphite': {'host': 'localhost'},
} }