Skip to content

Commit c7b3d88

Browse files
authored
RSDK-5985 - per-resource logging (#769)
1 parent ec7d994 commit c7b3d88

File tree

6 files changed

+24
-6
lines changed

6 files changed

+24
-6
lines changed

src/viam/components/board/client.py

-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from grpclib.client import Channel
66
from grpclib.client import Stream as ClientStream
77

8-
from viam.logging import getLogger
98
from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
109
from viam.proto.component.board import (
1110
BoardServiceStub,
@@ -33,8 +32,6 @@
3332

3433
from .board import Board, TickStream
3534

36-
LOGGER = getLogger(__name__)
37-
3835

3936
class AnalogClient(Board.Analog):
4037
def __init__(self, name: str, board: "BoardClient"):

src/viam/components/component_base.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import abc
2+
from logging import Logger
23
from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Mapping, Optional, SupportsBytes, SupportsFloat, Union, cast
34

45
from typing_extensions import Self
56

67
from viam.errors import MethodNotImplementedError
8+
from viam.logging import getLogger
79
from viam.proto.common import Geometry
810
from viam.resource.base import ResourceBase
911

@@ -23,8 +25,9 @@ class ComponentBase(abc.ABC, ResourceBase):
2325

2426
SUBTYPE: ClassVar["Subtype"]
2527

26-
def __init__(self, name: str):
28+
def __init__(self, name: str, *, logger: Optional[Logger] = None):
2729
self.name = name
30+
self.logger = logger if logger is not None else getLogger(f'{self.SUBTYPE}.{name}')
2831

2932
@classmethod
3033
def from_robot(cls, robot: "RobotClient", name: str) -> Self:

src/viam/logging.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ async def handle_task_result(self, task: asyncio.Task):
8383

8484
def emit(self, record: logging.LogRecord):
8585
assert isinstance(record, logging.LogRecord)
86-
name = record.name.split(".")[-1]
86+
# Fully qualified name of form "{subtype triplet}/{name}", e.g. "rdk:component:arm/myarm"
87+
name = record.name.replace('.', '/')
8788
message = f"{record.filename}:{record.lineno}\t{record.getMessage()}"
8889
stack = f"exc_info: {record.exc_info}, exc_text: {record.exc_text}, stack_info: {record.stack_info}"
8990
time = datetime.fromtimestamp(record.created)
@@ -151,6 +152,14 @@ def addHandlers(logger: logging.Logger, use_default_handlers=False):
151152
_addHandlers([logger], use_default_handlers)
152153

153154

155+
def update_log_level(logger: logging.Logger, level: Union[int, str]):
156+
if level == '':
157+
level = LOG_LEVEL
158+
logger.setLevel(level)
159+
for handler in logger.handlers:
160+
handler.setLevel(level)
161+
162+
154163
def _addHandlers(loggers: Iterable[logging.Logger], use_default_handlers=False):
155164
format = _ColorFormatter("%(asctime)s\t\t" + "%(levelname)s\t" + "%(name)s (%(filename)s:%(lineno)d)\t" + "%(message)s\t")
156165

src/viam/module/module.py

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from viam import logging
1313
from viam.errors import ResourceNotFoundError, ValidationError
14+
from viam.logging import update_log_level
1415
from viam.proto.app.robot import ComponentConfig
1516
from viam.proto.module import (
1617
AddResourceRequest,
@@ -183,6 +184,7 @@ async def add_resource(self, request: AddResourceRequest):
183184
model = Model.from_string(config.model, ignore_errors=True)
184185
creator = Registry.lookup_resource_creator(subtype, model)
185186
resource = creator(config, dependencies)
187+
update_log_level(resource.logger, config.log_configuration.level.upper())
186188
self.server.register(resource)
187189

188190
async def reconfigure_resource(self, request: ReconfigureResourceRequest):

src/viam/resource/base.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from abc import abstractmethod
22
from typing import TYPE_CHECKING, Any, ClassVar, Mapping, Optional, Protocol, runtime_checkable
3+
from logging import Logger
34

45
from typing_extensions import Self
56

@@ -25,6 +26,9 @@ class ResourceBase(Protocol):
2526
name: str
2627
"""The name of the Resource"""
2728

29+
logger: Logger
30+
"""A logger allowing for setting log levels on a per-resource basis"""
31+
2832
@classmethod
2933
def get_resource_name(cls, name: str) -> ResourceName:
3034
"""

src/viam/services/service_base.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import abc
2+
from logging import Logger
23
from typing import TYPE_CHECKING, ClassVar, Mapping, Optional, cast
34

45
from typing_extensions import Self
56

7+
from viam.logging import getLogger
68
from viam.resource.base import ResourceBase
79
from viam.utils import ValueTypes
810

@@ -18,8 +20,9 @@ class ServiceBase(abc.ABC, ResourceBase):
1820

1921
SUBTYPE: ClassVar["Subtype"]
2022

21-
def __init__(self, name: str) -> None:
23+
def __init__(self, name: str, *, logger: Optional[Logger] = None) -> None:
2224
self.name = name
25+
self.logger = logger if logger is not None else getLogger(f'{self.SUBTYPE}.{name}')
2326

2427
@classmethod
2528
def from_robot(cls, robot: "RobotClient", name: str) -> Self:

0 commit comments

Comments
 (0)