diff --git a/src/viam/module/module.py b/src/viam/module/module.py index 463986c78..bf0f5fc5d 100644 --- a/src/viam/module/module.py +++ b/src/viam/module/module.py @@ -241,6 +241,7 @@ async def reconfigure_resource(self, request: ReconfigureResourceRequest): resource = self.server.get_resource(ResourceBase, rn) if isinstance(resource, Reconfigurable): resource.reconfigure(config, dependencies) + update_log_level(resource.logger, config.log_configuration.level.upper()) else: if isinstance(resource, Stoppable): if iscoroutinefunction(resource.stop): diff --git a/tests/test_module.py b/tests/test_module.py index a0c4d59db..cf420d0db 100644 --- a/tests/test_module.py +++ b/tests/test_module.py @@ -1,4 +1,5 @@ import datetime +import logging import os import uuid from unittest import mock @@ -10,7 +11,7 @@ from viam.module import Module from viam.module.resource_data_consumer import ResourceDataConsumer from viam.module.service import ModuleRPCService -from viam.proto.app.robot import ComponentConfig +from viam.proto.app.robot import ComponentConfig, LogConfiguration from viam.proto.module import ( AddResourceRequest, ModuleServiceStub, @@ -138,6 +139,68 @@ async def test_reconfigure_resource(self, module: Module): await module.reconfigure_resource(req) assert summer.subtract is True + async def test_add_resource_applies_log_level(self, module: Module): + req = AddResourceRequest( + config=ComponentConfig( + name="gizmo_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg1", "motor": "motor1"}), + api="acme:component:gizmo", + log_configuration=LogConfiguration(level="debug"), + ) + ) + await module.add_resource(req) + gizmo = module.server.get_resource(MyGizmo, Gizmo.get_resource_name("gizmo_log")) + assert gizmo.logger.level == logging.DEBUG + + async def test_reconfigure_resource_applies_log_level(self, module: Module): + # Add a resource with default (INFO) log level + req = AddResourceRequest( + config=ComponentConfig( + name="gizmo_reconf_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg1", "motor": "motor1"}), + api="acme:component:gizmo", + ) + ) + await module.add_resource(req) + gizmo = module.server.get_resource(MyGizmo, Gizmo.get_resource_name("gizmo_reconf_log")) + assert gizmo.logger.level != logging.DEBUG + + # Reconfigure with debug log level + req = ReconfigureResourceRequest( + config=ComponentConfig( + name="gizmo_reconf_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg2", "motor": "motor1"}), + api="acme:component:gizmo", + log_configuration=LogConfiguration(level="debug"), + ) + ) + await module.reconfigure_resource(req) + assert gizmo.my_arg == "arg2" + assert gizmo.logger.level == logging.DEBUG + + # Reconfigure with no log_configuration + req = ReconfigureResourceRequest( + config=ComponentConfig( + name="gizmo_reconf_log", + namespace="acme", + type="gizmo", + model="acme:demo:mygizmo", + attributes=dict_to_struct({"arg1": "arg2", "motor": "motor1"}), + api="acme:component:gizmo", + ) + ) + await module.reconfigure_resource(req) + assert gizmo.logger.level == logging.INFO + async def test_add_resource_with_deps(self, robot_service: RobotService, module: Module): # noqa: F811 async with ChannelFor([robot_service]) as channel: _ = mock.patch("viam.module.module.Module._connect_to_parent")