diff --git a/bigchaindb/__init__.py b/bigchaindb/__init__.py index 4fa1df02..c751469f 100644 --- a/bigchaindb/__init__.py +++ b/bigchaindb/__init__.py @@ -97,6 +97,7 @@ config = { 'fmt_console': log_config['formatters']['console']['format'], 'fmt_logfile': log_config['formatters']['file']['format'], 'granular_levels': {}, + 'port': log_config['root']['port'] }, 'graphite': { 'host': os.environ.get('BIGCHAINDB_GRAPHITE_HOST', 'localhost'), diff --git a/bigchaindb/log/configs.py b/bigchaindb/log/configs.py index 034256a4..687d49d1 100644 --- a/bigchaindb/log/configs.py +++ b/bigchaindb/log/configs.py @@ -62,6 +62,7 @@ SUBSCRIBER_LOGGING_CONFIG = { 'loggers': {}, 'root': { 'level': logging.DEBUG, - 'handlers': ['console', 'file', 'errors'] + 'handlers': ['console', 'file', 'errors'], + 'port': 9020 }, } diff --git a/bigchaindb/log/loggers.py b/bigchaindb/log/loggers.py index f8c18320..156a4c41 100644 --- a/bigchaindb/log/loggers.py +++ b/bigchaindb/log/loggers.py @@ -22,11 +22,14 @@ class HttpServerLogger(Logger): 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.access_log) def _set_socklog_handler(self, log): socket_handler = logging.handlers.SocketHandler( - DEFAULT_SOCKET_LOGGING_HOST, DEFAULT_SOCKET_LOGGING_PORT) + DEFAULT_SOCKET_LOGGING_HOST, self.log_port) socket_handler._gunicorn = True log.addHandler(socket_handler) diff --git a/bigchaindb/log/setup.py b/bigchaindb/log/setup.py index b6b45b00..b6e45ef1 100644 --- a/bigchaindb/log/setup.py +++ b/bigchaindb/log/setup.py @@ -25,17 +25,29 @@ def _normalize_log_level(level): 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) socket_handler = logging.handlers.SocketHandler( - DEFAULT_SOCKET_LOGGING_HOST, DEFAULT_SOCKET_LOGGING_PORT) + DEFAULT_SOCKET_LOGGING_HOST, logging_port) socket_handler.setLevel(logging.DEBUG) logger = logging.getLogger() logger.addHandler(socket_handler) 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: server_proc = Process( target=server.serve_forever, @@ -45,7 +57,8 @@ def setup_sub_logger(*, 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) diff --git a/bigchaindb/processes.py b/bigchaindb/processes.py index 550342e5..f93cd5ce 100644 --- a/bigchaindb/processes.py +++ b/bigchaindb/processes.py @@ -63,7 +63,8 @@ def start(): election.start(events_queue=exchange.get_publisher_queue()) # 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.start() diff --git a/bigchaindb/web/server.py b/bigchaindb/web/server.py index 91892807..a776afd4 100644 --- a/bigchaindb/web/server.py +++ b/bigchaindb/web/server.py @@ -37,6 +37,11 @@ class StandaloneApplication(gunicorn.app.base.BaseApplication): super().__init__() 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() if key in self.cfg.settings and value is not None) @@ -74,7 +79,7 @@ def create_app(*, debug=False, threads=1): return app -def create_server(settings): +def create_server(settings, log_config=None): """Wrap and return an application ready to be run. Args: @@ -97,6 +102,7 @@ def create_server(settings): settings['threads'] = 1 settings['logger_class'] = 'bigchaindb.log.loggers.HttpServerLogger' + settings['custom_log_config'] = log_config app = create_app(debug=settings.get('debug', False), threads=settings['threads']) standalone = StandaloneApplication(app, options=settings) diff --git a/tests/log/test_loggers.py b/tests/log/test_loggers.py index 795de046..83a32252 100644 --- a/tests/log/test_loggers.py +++ b/tests/log/test_loggers.py @@ -7,9 +7,9 @@ class TestHttpServerLogger: from bigchaindb.log.configs import ( DEFAULT_SOCKET_LOGGING_ADDR as expected_socket_address) from bigchaindb.log.loggers import HttpServerLogger - mocked_config = mocker.patch( - 'gunicorn.config.Config', autospec=True, spec_set=True) - logger = HttpServerLogger(mocked_config.return_value) + from gunicorn import config + logger_config = config.Config() + logger = HttpServerLogger(logger_config) assert len(logger.access_log.handlers) == 1 assert len(logger.error_log.handlers) == 1 assert isinstance(logger.access_log.handlers[0], SocketHandler) diff --git a/tests/log/test_setup.py b/tests/log/test_setup.py index 0e608d26..063fb16f 100644 --- a/tests/log/test_setup.py +++ b/tests/log/test_setup.py @@ -70,7 +70,7 @@ def log_record_bytes(log_record_dict): def test_setup_logging(mocked_setup_pub_logger, mocked_setup_sub_logger): from bigchaindb.log.setup import 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) diff --git a/tests/test_config_utils.py b/tests/test_config_utils.py index 3caa7777..8e71bc21 100644 --- a/tests/test_config_utils.py +++ b/tests/test_config_utils.py @@ -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_logfile': log_config['formatters']['file']['format'], 'granular_levels': {}, + 'port': 9020 }, 'graphite': {'host': 'localhost'}, }