Skip to content

Commit f015dda

Browse files
Refactor logging (#21)
1 parent a489c95 commit f015dda

7 files changed

Lines changed: 78 additions & 83 deletions

File tree

hello/advertizer.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@
1212

1313
from hello import Service, Group, Sender, Receiver, ServiceMatcher, ServiceQuery, AbstractScheduler
1414

15-
log = get_logger('Advertizer')
16-
1715

1816
class Advertizer:
1917

18+
def __enter__(self) -> 'Advertizer':
19+
return self
20+
21+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
22+
self.stop()
23+
2024
def start(self, group: Group, service: Service | None = None) -> None:
2125
raise NotImplementedError()
2226

@@ -33,36 +37,31 @@ def __init__(self, sender: Sender) -> None:
3337
self._sender = sender
3438
self._group: Group | None = None
3539
self._service: Service | None = None
36-
37-
def __enter__(self) -> Advertizer:
38-
return self
39-
40-
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
41-
self.stop()
40+
self.log = get_logger(type(self).__name__)
4241

4342
def start(self, group: Group, service: Service | None = None) -> None:
4443
self._sender.start(group.hello())
4544
self._group = group
4645
self._service = service
47-
log.info('Advertizer started', group=self._group, service=self._service)
46+
self.log.info('Advertizer started', group=self._group, service=self._service)
4847

4948
def stop(self) -> None:
5049
self._group = None
5150
self._service = None
5251
self._sender.stop()
53-
log.info('Advertizer stopped')
52+
self.log.info('Advertizer stopped')
5453

5554
def advertise(self, service: Service | None = None, log_level: int = INFO) -> None:
5655
if self._group:
5756
if service:
5857
self._service = service
5958
if self._service:
6059
self._sender.send(self._service)
61-
log.log(log_level, 'Service advertised', service=self._service, group=self._group)
60+
self.log.log(log_level, 'Service advertised', service=self._service, group=self._group)
6261
else:
63-
log.warning('Cannot advertise service, no service provided', group=self._group)
62+
self.log.warning('Cannot advertise service, no service provided', group=self._group)
6463
else:
65-
log.warning('Cannot advertise service, advertizer not started', service=service)
64+
self.log.warning('Cannot advertise service, advertizer not started', service=service)
6665

6766

6867
class RespondingAdvertizer(DefaultAdvertizer):
@@ -87,17 +86,17 @@ def _handle_message(self, message: dict[str, Any]) -> None:
8786
try:
8887
query = ServiceQuery(**message)
8988
matcher = ServiceMatcher(query)
90-
log.debug('Service query received', group=self._group, query=query)
89+
self.log.debug('Service query received', group=self._group, query=query)
9190
self._handle_query(matcher, self._service)
9291
except Exception as error:
93-
log.warning('Invalid service query received', group=self._group, received=message, error=error)
92+
self.log.warning('Invalid service query received', group=self._group, received=message, error=error)
9493

9594
def _handle_query(self, matcher: ServiceMatcher, service: Service) -> None:
9695
if matcher.matches(service):
9796
delay = round(self._max_delay * random.random(), 3)
98-
log.info('Responding to query', group=self._group, query=matcher.query, service=service, delay=delay)
97+
self.log.info('Responding to query', group=self._group, query=matcher.query, delay=delay)
9998
time.sleep(delay)
100-
self.advertise(service)
99+
self.advertise(service, DEBUG)
101100

102101

103102
class ScheduledAdvertizer(AbstractScheduler[Service], Advertizer):

hello/api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from zmq import Context
1010

1111
from hello import RadioSender, DishReceiver, DefaultAdvertizer, DefaultDiscoverer, \
12-
RespondingAdvertizer, ScheduledAdvertizer, ScheduledDiscoverer
12+
RespondingAdvertizer, ScheduledAdvertizer, ScheduledDiscoverer, Advertizer, Discoverer
1313

1414

1515
@dataclass
@@ -25,7 +25,7 @@ class HelloConfig:
2525
class Hello(object):
2626

2727
@classmethod
28-
def default_advertizer(cls, config: HelloConfig) -> DefaultAdvertizer:
28+
def default_advertizer(cls, config: HelloConfig) -> Advertizer:
2929
sender = RadioSender(config.context)
3030
if config.advertizer_responder:
3131
receiver = DishReceiver(config.context, config.receiver_max_workers, config.receiver_poll_timeout)
@@ -39,7 +39,7 @@ def scheduled_advertizer(cls, config: HelloConfig) -> ScheduledAdvertizer:
3939
return ScheduledAdvertizer(advertizer, ReusableTimer())
4040

4141
@classmethod
42-
def default_discoverer(cls, config: HelloConfig) -> DefaultDiscoverer:
42+
def default_discoverer(cls, config: HelloConfig) -> Discoverer:
4343
sender = RadioSender(config.context)
4444
receiver = DishReceiver(config.context, config.receiver_max_workers, config.receiver_poll_timeout)
4545
return DefaultDiscoverer(sender, receiver, config.discoverer_max_workers)
@@ -59,7 +59,7 @@ class AdvertizerBuilder(object):
5959
def __init__(self, config: HelloConfig) -> None:
6060
self._config = config
6161

62-
def default(self) -> DefaultAdvertizer:
62+
def default(self) -> Advertizer:
6363
return Hello.default_advertizer(self._config)
6464

6565
def scheduled(self) -> ScheduledAdvertizer:
@@ -71,7 +71,7 @@ class DiscovererBuilder(object):
7171
def __init__(self, config: HelloConfig) -> None:
7272
self._config = config
7373

74-
def default(self) -> DefaultDiscoverer:
74+
def default(self) -> Discoverer:
7575
return Hello.default_discoverer(self._config)
7676

7777
def scheduled(self) -> ScheduledDiscoverer:

hello/discoverer.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414

1515
from hello import Group, ServiceQuery, Sender, Receiver, Service, ServiceMatcher, AbstractScheduler
1616

17-
log = get_logger('Discoverer')
18-
1917

2018
class DiscoveryEventType(Enum):
2119
DISCOVERED = 'discovered'
@@ -37,6 +35,12 @@ def __call__(self, event: DiscoveryEvent) -> None: ...
3735

3836
class Discoverer:
3937

38+
def __enter__(self) -> 'Discoverer':
39+
return self
40+
41+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
42+
self.stop()
43+
4044
def start(self, group: Group, query: ServiceQuery | None = None) -> None:
4145
raise NotImplementedError()
4246

@@ -68,12 +72,7 @@ def __init__(self, sender: Sender, receiver: Receiver, max_workers: int = 8) ->
6872
event_type: [] for event_type in DiscoveryEventType
6973
}
7074
self._handler_executor = ThreadPoolExecutor(max_workers=max_workers)
71-
72-
def __enter__(self) -> Discoverer:
73-
return self
74-
75-
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
76-
self.stop()
75+
self.log = get_logger(type(self).__name__)
7776

7877
def start(self, group: Group, query: ServiceQuery | None = None) -> None:
7978
self._group = group
@@ -82,27 +81,27 @@ def start(self, group: Group, query: ServiceQuery | None = None) -> None:
8281
self._sender.start(group.query())
8382
self._receiver.register(self._handle_message)
8483
self._receiver.start(group.hello())
85-
log.info('Discoverer started', group=self._group, query=query)
84+
self.log.info('Discoverer started', group=self._group, query=query)
8685

8786
def stop(self) -> None:
8887
self._group = None
8988
self._matcher = None
9089
self._sender.stop()
9190
self._receiver.deregister(self._handle_message)
9291
self._receiver.stop()
93-
log.info('Discoverer stopped')
92+
self.log.info('Discoverer stopped')
9493

9594
def discover(self, query: ServiceQuery | None = None, log_level: int = INFO) -> None:
9695
if self._group:
9796
if query:
9897
self._matcher = ServiceMatcher(query)
9998
if self._matcher:
10099
self._sender.send(self._matcher.query)
101-
log.log(log_level, 'Service discovery initiated', group=self._group, query=self._matcher.query)
100+
self.log.log(log_level, 'Service discovery initiated', group=self._group, query=self._matcher.query)
102101
else:
103-
log.warning('Cannot discover services, no query provided', group=self._group)
102+
self.log.warning('Cannot discover services, no query provided', group=self._group)
104103
else:
105-
log.warning('Cannot discover services, discoverer not started', query=query)
104+
self.log.warning('Cannot discover services, discoverer not started', query=query)
106105

107106
def register(self, handler: OnDiscoveryEvent, types: set[DiscoveryEventType] | None = None) -> None:
108107
for event_type in types if types else self._get_event_types():
@@ -123,10 +122,10 @@ def _handle_message(self, message: dict[str, Any]) -> None:
123122
try:
124123
service = Service(UUID(message['uuid']), message['name'], message['role'],
125124
message.get('urls', {}), message.get('info', {}), message['address'])
126-
log.debug('Service received', service=service, group=self._group)
125+
self.log.debug('Service received', service=service, group=self._group)
127126
self._handle_service(service, self._group, self._matcher)
128127
except Exception as error:
129-
log.warn('Invalid service received', group=self._group, data=message, error=error)
128+
self.log.warn('Invalid service received', group=self._group, data=message, error=error)
130129

131130
def _handle_service(self, service: Service, group: Group, matcher: ServiceMatcher) -> None:
132131
if matcher.matches(service):
@@ -138,13 +137,13 @@ def _create_event(self, group: Group, matcher: ServiceMatcher, stored: Service |
138137
service: Service) -> DiscoveryEvent:
139138
if stored:
140139
if stored != service:
141-
log.info('Service updated', group=group, old_service=stored, new_service=service)
140+
self.log.info('Service updated', group=group, old_service=stored, new_service=service)
142141
return DiscoveryEvent(group, matcher.query, service, DiscoveryEventType.UPDATED)
143142
else:
144-
log.debug('Service unchanged', group=group, service=service)
143+
self.log.debug('Service unchanged', group=group, service=service)
145144
return DiscoveryEvent(group, matcher.query, service, DiscoveryEventType.UNCHANGED)
146145
else:
147-
log.info('Service discovered', group=group, service=service)
146+
self.log.info('Service discovered', group=group, service=service)
148147
return DiscoveryEvent(group, matcher.query, service, DiscoveryEventType.DISCOVERED)
149148

150149
def _handle_event(self, event: DiscoveryEvent) -> None:
@@ -157,7 +156,7 @@ def _execute_handler(self, handler: OnDiscoveryEvent, event: DiscoveryEvent) ->
157156
try:
158157
handler(event)
159158
except Exception as error:
160-
log.warn('Error in event handler execution', event=event, error=error)
159+
self.log.warn('Error in event handler execution', event=event, error=error)
161160

162161

163162
class ScheduledDiscoverer(AbstractScheduler[ServiceQuery], Discoverer):

hello/receiver.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,19 @@
1010

1111
from hello import PrefixedGroup
1212

13-
log = get_logger('Receiver')
14-
1513

1614
class OnMessage(Protocol):
1715
def __call__(self, message: dict[str, Any]) -> None: ...
1816

1917

2018
class Receiver:
2119

20+
def __enter__(self) -> 'Receiver':
21+
return self
22+
23+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
24+
self.stop()
25+
2226
def start(self, group: PrefixedGroup) -> None:
2327
raise NotImplementedError()
2428

@@ -43,12 +47,7 @@ def __init__(self, context: Context[Any], max_workers: int = 8, poll_timeout: fl
4347
self._poll_timeout = int(poll_timeout * 1000)
4448
self._group: str | None = None
4549
self._handlers: list[OnMessage] = []
46-
47-
def __enter__(self) -> Receiver:
48-
return self
49-
50-
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
51-
self.stop()
50+
self.log = get_logger(type(self).__name__)
5251

5352
def start(self, group: PrefixedGroup) -> None:
5453
try:
@@ -59,19 +58,19 @@ def start(self, group: PrefixedGroup) -> None:
5958
self._dish.join(group.name)
6059
self._group = group.name
6160
self._loop_executor.submit(self._receive_loop)
62-
log.debug('Receiver started', url=group.url, group=group.name)
61+
self.log.debug('Receiver started', url=group.url, group=group.name)
6362
except Exception as error:
64-
log.error('Failed to start receiver', url=group.url, group=group.name, error=error)
63+
self.log.error('Failed to start receiver', url=group.url, group=group.name, error=error)
6564
raise error
6665

6766
def stop(self) -> None:
6867
try:
6968
self._group = None
7069
self._loop_executor.shutdown()
7170
self._dish.close()
72-
log.debug('Receiver stopped')
71+
self.log.debug('Receiver stopped')
7372
except Exception as error:
74-
log.error('Failed to stop receiver', error=error)
73+
self.log.error('Failed to stop receiver', error=error)
7574
raise error
7675

7776
def register(self, handler: OnMessage) -> None:
@@ -88,15 +87,15 @@ def _receive_loop(self) -> None:
8887
message = self._dish.recv_json()
8988
self._handle_message(message)
9089
except Exception as error:
91-
log.error('Failed to receive message', group=self._group, error=error)
90+
self.log.error('Failed to receive message', group=self._group, error=error)
9291

9392
def _handle_message(self, message: dict[str, Any]) -> None:
94-
log.debug('Message received', data=message, group=self._group)
93+
self.log.debug('Message received', data=message, group=self._group)
9594
for handler in self._handlers:
9695
self._handler_executor.submit(self._execute_handler, handler, message)
9796

9897
def _execute_handler(self, handler: OnMessage, message: dict[str, Any]) -> None:
9998
try:
10099
handler(message)
101100
except Exception as error:
102-
log.warn('Handler failed to process message', data=message, group=self._group, error=error)
101+
self.log.warn('Handler failed to process message', data=message, group=self._group, error=error)

hello/scheduler.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
from common_utility import IReusableTimer
88
from context_logger import get_logger
99

10-
log = get_logger('Scheduler')
11-
1210
T = TypeVar('T')
1311

1412

@@ -29,6 +27,7 @@ class AbstractScheduler(Scheduler[T]):
2927
def __init__(self, timer: IReusableTimer, interval: float = 60) -> None:
3028
self._timer = timer
3129
self._interval = interval
30+
self.log = get_logger(type(self).__name__)
3231

3332
def __enter__(self) -> Scheduler[T]:
3433
return self
@@ -37,14 +36,14 @@ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
3736
self.stop()
3837

3938
def schedule_one_shot(self, data: T | None = None, interval: float | None = None) -> None:
40-
interval = interval or self._interval
41-
self._timer.start(interval, self._safe_execute, [data])
42-
log.info('One-shot execution scheduled', data=data, interval=interval)
39+
resolved_interval: float = self._interval if interval is None else interval
40+
self._timer.start(resolved_interval, self._safe_execute, [data])
41+
self.log.info('One-shot execution scheduled', data=data, interval=resolved_interval)
4342

4443
def schedule_periodic(self, data: T | None = None, interval: float | None = None) -> None:
45-
interval = interval or self._interval
46-
self._timer.start(interval, self._execute_and_restart, [data])
47-
log.info('Periodic execution scheduled', data=data, interval=interval)
44+
resolved_interval: float = self._interval if interval is None else interval
45+
self._timer.start(resolved_interval, self._execute_and_restart, [data])
46+
self.log.info('Periodic execution scheduled', data=data, interval=resolved_interval)
4847

4948
def stop(self) -> None:
5049
self._timer.cancel()
@@ -60,4 +59,4 @@ def _safe_execute(self, data: T | None = None) -> None:
6059
try:
6160
self._execute(data)
6261
except Exception as e:
63-
log.error('Error during scheduled execution', error=e, data=data)
62+
self.log.error('Error during scheduled execution', error=e, data=data)

0 commit comments

Comments
 (0)