diff --git a/src/openflexure_microscope_server/logging.py b/src/openflexure_microscope_server/logging.py index a32061b7..0d4375f4 100644 --- a/src/openflexure_microscope_server/logging.py +++ b/src/openflexure_microscope_server/logging.py @@ -23,17 +23,26 @@ LOGGER = logging.getLogger(__name__) OFM_LOG_FILE: Optional[str] = None -def configure_logging(log_folder: str) -> None: +def configure_logging(log_folder: str, debug: bool = False) -> None: """Configure logging for the server while it is running. - This modifies the root logger to have a rotating file handler and + Params: + - log_folder: This modifies the root logger to have a rotating file handler and adds a custom handler that prints and stores all records except ``uvicorn.access`` logs. + - debug: This modifies the root logger to change its logging level. It is + set to True by starting the server with the cli argument `--debug`. It is important not to let Uvicorn override these settings. + """ root_logger = logging.getLogger() - root_logger.setLevel(logging.INFO) + + if debug: + root_logger.setLevel(logging.DEBUG) + else: + root_logger.setLevel(logging.INFO) + # Explicitly make OFM_LOG_FILE a global so it can be updated based on log settings # This requires silencing PLW0603 which disallows globals. global OFM_LOG_FILE # noqa: PLW0603 @@ -44,6 +53,7 @@ def configure_logging(log_folder: str) -> None: ofm_format_str = "[%(asctime)s] [%(levelname)s] %(message)s" OFM_HANDLER.setFormatter(logging.Formatter(ofm_format_str)) OFM_HANDLER.addFilter(UvicornAccessFilter()) + OFM_HANDLER.level = root_logger.level root_logger.addHandler(OFM_HANDLER) try: @@ -63,7 +73,7 @@ def configure_logging(log_folder: str) -> None: except PermissionError as e: LOGGER.error(f"Cannot create log file at {OFM_LOG_FILE}: {e}") - LOGGER.info("OFM server root logger has been set up at INFO level") + LOGGER.info("OFM server root logger has been set up at %s level", logging.getLevelName(root_logger.level)) def retrieve_log() -> PlainTextResponse: diff --git a/src/openflexure_microscope_server/server/__init__.py b/src/openflexure_microscope_server/server/__init__.py index 01028715..2e1849bf 100644 --- a/src/openflexure_microscope_server/server/__init__.py +++ b/src/openflexure_microscope_server/server/__init__.py @@ -88,11 +88,6 @@ def customise_server( add_v2_endpoints(server) add_static_files(server, application_config.data_folder) - # Configure logging to DEBUG if LT server is set up - # with debug = true - if server.debug: - lt.logs.configure_thing_logger(logging.DEBUG) - # Add an endpoint to get the logs - (directly calling the FastAPI decorator) server.app.get(str(server.api_prefix.rstrip("/")) + "/log/")(retrieve_log) server.app.get(str(server.api_prefix.rstrip("/")) + "/logfile/")( @@ -114,13 +109,14 @@ def serve_from_cli(argv: Optional[list[str]] = None) -> None: server = None try: lt_config = _full_config_from_args(args) + debug = bool(args.debug) # Validate our application data if lt_config.application_config is None: raise ValueError("No application configuration was supplied.") application_config = OFMApplicationData(**lt_config.application_config) - configure_logging(application_config.log_folder) + configure_logging(application_config.log_folder, debug) - server = lt.ThingServer.from_config(lt_config, args.debug) + server = lt.ThingServer.from_config(lt_config, debug) customise_server(server, application_config) def shutdown_call() -> None: diff --git a/tests/unit_tests/test_server_cli.py b/tests/unit_tests/test_server_cli.py index b7837781..b9eda4f3 100644 --- a/tests/unit_tests/test_server_cli.py +++ b/tests/unit_tests/test_server_cli.py @@ -109,6 +109,7 @@ def test_failed_customise(mocker): # An that it has the error to display assert str(fallback_app._context.error) == "Can't touch this" + def test_debug_mode(mocker): """Test that --debug flag triggers lt.logs.configure_thing_logger.""" diff --git a/webapp/src/components/tabContentComponents/loggingContent.vue b/webapp/src/components/tabContentComponents/loggingContent.vue index 21b0421d..56cb3ee3 100644 --- a/webapp/src/components/tabContentComponents/loggingContent.vue +++ b/webapp/src/components/tabContentComponents/loggingContent.vue @@ -121,7 +121,7 @@ export default { ...mapState(useSettingsStore, ["baseUri"]), filteredLevels: function () { let cutoffIndex = this.allLevels.indexOf(this.filterLevel); - return this.allLevels.slice(cutoffIndex, -1); + return this.allLevels.slice(cutoffIndex); }, filteredItems: function () { var items = [];