Skip to content

Commit 7bf2896

Browse files
authored
Merge pull request #59 from adf-python/feature/logger
ロガーを整備する
2 parents fce835c + bae36db commit 7bf2896

File tree

9 files changed

+207
-83
lines changed

9 files changed

+207
-83
lines changed

adf_core_python/core/agent/platoon/platoon.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from logging import Logger, getLogger
2-
31
from rcrs_core.agents.agent import Agent
42
from rcrs_core.commands.Command import Command
53
from rcrs_core.config.config import Config as RCRSConfig
@@ -16,6 +14,7 @@
1614
from adf_core_python.core.agent.precompute.precompute_data import PrecomputeData
1715
from adf_core_python.core.component.tactics.tactics_agent import TacticsAgent
1816
from adf_core_python.core.config.config import Config
17+
from adf_core_python.core.logger.logger import get_agent_logger
1918

2019

2120
class Platoon(Agent):
@@ -41,11 +40,15 @@ def __init__(
4140
self._develop_data = develop_data
4241

4342
def post_connect(self) -> None:
44-
self._logger: Logger = getLogger(__name__)
4543
self._agent_info: AgentInfo = AgentInfo(self, self.world_model)
4644
self._world_info: WorldInfo = WorldInfo(self.world_model)
4745
self._precompute_data: PrecomputeData = PrecomputeData(self._data_storage_name)
4846

47+
self._logger = get_agent_logger(
48+
f"{self.__class__.__module__}.{self.__class__.__qualname__}",
49+
self._agent_info,
50+
)
51+
4952
if self._is_precompute:
5053
self._mode = Mode.PRECOMPUTATION
5154
else:
@@ -106,6 +109,9 @@ def post_connect(self) -> None:
106109
def think(self, time: int, change_set: ChangeSet, hear: list[Command]) -> None:
107110
self._agent_info.set_change_set(change_set)
108111
self._world_info.set_change_set(change_set)
112+
self._agent_info.set_time(time)
113+
self._agent_info.set_heard_commands(hear)
114+
109115
action: Action = self._tactics_agent.think(
110116
self._agent_info,
111117
self._world_info,

adf_core_python/core/component/tactics/tactics_agent.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from abc import ABC, abstractmethod
44
from typing import TYPE_CHECKING, Any, Optional
55

6+
from adf_core_python.core.logger.logger import get_agent_logger
7+
68
if TYPE_CHECKING:
79
from adf_core_python.core.agent.action.action import Action
810
from adf_core_python.core.agent.communication.message_manager import MessageManager
@@ -34,7 +36,9 @@ def initialize(
3436
message_manager: MessageManager,
3537
develop_data: DevelopData,
3638
) -> None:
37-
raise NotImplementedError
39+
self._logger = get_agent_logger(
40+
f"{self.__class__.__module__}.{self.__class__.__qualname__}", agent_info
41+
)
3842

3943
@abstractmethod
4044
def precompute(

adf_core_python/core/launcher/agent_launcher.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import importlib
22
import threading
3-
from logging import Logger, getLogger
43

54
from rcrs_core.connection.componentLauncher import ComponentLauncher
65

@@ -15,6 +14,7 @@
1514
from adf_core_python.core.launcher.connect.connector_ambulance_team import (
1615
ConnectorAmbulanceTeam,
1716
)
17+
from adf_core_python.core.logger.logger import get_logger
1818

1919
# from adf_core_python.core.launcher.connect.connector_fire_brigade import (
2020
# ConnectorFireBrigade,
@@ -33,7 +33,7 @@
3333
class AgentLauncher:
3434
def __init__(self, config: Config):
3535
self.config = config
36-
self.logger: Logger = getLogger(__name__)
36+
self.logger = get_logger(__name__)
3737
self.connectors: list[Connector] = []
3838
self.thread_list: list[threading.Thread] = []
3939

@@ -67,14 +67,9 @@ def launch(self) -> None:
6767
for connector in self.connectors:
6868
threads = connector.connect(component_launcher, self.config, self.loader)
6969
for thread in threads:
70+
thread.daemon = True
7071
thread.start()
7172
self.thread_list.extend(threads)
7273

7374
for thread in self.thread_list:
7475
thread.join()
75-
76-
connected_agent_count = 0
77-
for connector in self.connectors:
78-
connected_agent_count += connector.get_connected_agent_count()
79-
80-
self.logger.info(f"Connected agent count: {connected_agent_count}")

adf_core_python/core/launcher/connect/connector_ambulance_team.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import threading
2-
from logging import Logger, getLogger
32

43
from rcrs_core.connection.componentLauncher import ComponentLauncher
54

@@ -13,12 +12,13 @@
1312
from adf_core_python.core.config.config import Config
1413
from adf_core_python.core.launcher.config_key import ConfigKey
1514
from adf_core_python.core.launcher.connect.connector import Connector
15+
from adf_core_python.core.logger.logger import get_logger
1616

1717

1818
class ConnectorAmbulanceTeam(Connector):
1919
def __init__(self) -> None:
2020
super().__init__()
21-
self.logger: Logger = getLogger(__name__)
21+
self.logger = get_logger(__name__)
2222

2323
def connect(
2424
self,
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import logging
2+
import sys
3+
4+
import structlog
5+
from structlog.dev import ConsoleRenderer
6+
from structlog.processors import JSONRenderer
7+
8+
from adf_core_python.core.agent.info.agent_info import AgentInfo
9+
10+
11+
def get_logger(name: str) -> structlog.BoundLogger:
12+
"""
13+
Get a logger with the given name.
14+
For kernel logging, use this function to get a logger.
15+
16+
Parameters
17+
----------
18+
name : str
19+
The name of the logger.
20+
21+
Returns
22+
-------
23+
structlog.BoundLogger
24+
The logger with the given name.
25+
"""
26+
return structlog.get_logger(name)
27+
28+
29+
def get_agent_logger(name: str, agent_info: AgentInfo) -> structlog.BoundLogger:
30+
"""
31+
Get a logger with the given name and agent information.
32+
For agent logging, use this function to get a logger.
33+
34+
Parameters
35+
----------
36+
name : str
37+
The name of the logger.
38+
agent_info : AgentInfo
39+
The agent information.
40+
41+
Returns
42+
-------
43+
structlog.BoundLogger
44+
The logger with the given name and agent information.
45+
"""
46+
return structlog.get_logger(name).bind(
47+
agent_id=str(agent_info.get_entity_id()),
48+
agent_type=str(agent_info.get_myself().get_urn().name),
49+
)
50+
51+
52+
def configure_logger() -> None:
53+
structlog.configure(
54+
processors=[
55+
structlog.stdlib.add_log_level,
56+
structlog.stdlib.add_logger_name,
57+
structlog.stdlib.PositionalArgumentsFormatter(),
58+
structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M.%S", utc=False),
59+
structlog.processors.StackInfoRenderer(),
60+
structlog.processors.UnicodeDecoder(),
61+
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
62+
],
63+
logger_factory=structlog.stdlib.LoggerFactory(),
64+
wrapper_class=structlog.stdlib.BoundLogger,
65+
cache_logger_on_first_use=True,
66+
)
67+
handler_stdout = logging.StreamHandler(sys.stdout)
68+
handler_stdout.setFormatter(
69+
structlog.stdlib.ProcessorFormatter(processor=ConsoleRenderer())
70+
)
71+
72+
handler_file = logging.FileHandler("agent.log")
73+
handler_file.setFormatter(
74+
structlog.stdlib.ProcessorFormatter(processor=JSONRenderer())
75+
)
76+
77+
root_logger = logging.getLogger()
78+
root_logger.addHandler(handler_stdout)
79+
root_logger.addHandler(handler_file)
80+
root_logger.setLevel(logging.DEBUG)

adf_core_python/implement/tactics/default_tactics_ambulance_team.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ def initialize(
3030
develop_data: DevelopData,
3131
) -> None:
3232
# world_info.index_class()
33+
super().initialize(
34+
agent_info,
35+
world_info,
36+
scenario_info,
37+
module_manager,
38+
precompute_data,
39+
message_manager,
40+
develop_data,
41+
)
3342
match scenario_info.get_mode():
3443
case Mode.NON_PRECOMPUTE:
3544
self._search: Search = cast(
@@ -118,6 +127,7 @@ def think(
118127
.get_action()
119128
)
120129
if action is not None:
130+
self._logger.debug(f"action: {action}", time=agent_info.get_time())
121131
return action
122132

123133
target_entity_id = self._search.calculate().get_target_entity_id()
@@ -128,6 +138,7 @@ def think(
128138
.get_action()
129139
)
130140
if action is not None:
141+
self._logger.debug(f"action: {action}", time=agent_info.get_time())
131142
return action
132143

133144
return ActionRest()

adf_core_python/main.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import argparse
2-
import logging
32

43
from adf_core_python.core.config.config import Config
54
from adf_core_python.core.launcher.agent_launcher import AgentLauncher
65
from adf_core_python.core.launcher.config_key import ConfigKey
6+
from adf_core_python.core.logger.logger import configure_logger, get_logger
77

88

99
class Main:
1010
def __init__(self) -> None:
11+
self.logger = get_logger(__name__)
1112
parser = argparse.ArgumentParser(description="Agent Launcher")
1213

1314
parser.add_argument(
@@ -56,32 +57,41 @@ def __init__(self) -> None:
5657
metavar="",
5758
)
5859
parser.add_argument(
59-
"--verbose", type=bool, default=False, help="verbose flag", metavar=""
60+
"--debug", type=bool, default=False, help="debug flag", metavar=""
6061
)
6162
args = parser.parse_args()
62-
print(args)
63+
self.logger.info(f"Arguments: {args}")
64+
6365
self.config = Config()
6466
self.config.set_value(ConfigKey.KEY_KERNEL_HOST, args.host)
6567
self.config.set_value(ConfigKey.KEY_KERNEL_PORT, args.port)
6668
self.config.set_value(ConfigKey.KEY_AMBULANCE_CENTRE_COUNT, args.ambulance)
6769
self.config.set_value(ConfigKey.KEY_FIRE_STATION_COUNT, args.firebrigade)
6870
self.config.set_value(ConfigKey.KEY_POLICE_OFFICE_COUNT, args.policeforce)
6971
self.config.set_value(ConfigKey.KEY_PRECOMPUTE, args.precompute)
70-
self.config.set_value(ConfigKey.KEY_DEBUG_FLAG, args.verbose)
72+
self.config.set_value(ConfigKey.KEY_DEBUG_FLAG, args.debug)
73+
self.logger.info(f"Config: {self.config}")
7174

7275
def launch(self) -> None:
7376
agent_launcher: AgentLauncher = AgentLauncher(
7477
self.config,
7578
)
7679
agent_launcher.init_connector()
77-
agent_launcher.launch()
80+
81+
try:
82+
agent_launcher.launch()
83+
except KeyboardInterrupt:
84+
self.logger.info("Agent launcher interrupted")
85+
except Exception as e:
86+
self.logger.exception("Agent launcher failed", exc_info=e)
87+
raise e
88+
self.logger.info("Agent launcher finished")
7889

7990

8091
if __name__ == "__main__":
81-
logging.basicConfig(
82-
level=logging.DEBUG,
83-
format="%(threadName)s[%(levelname)s][%(name)s]: %(message)s",
84-
)
92+
configure_logger()
93+
logger = get_logger(__name__)
94+
logger.info("Starting the agent launcher")
8595

8696
main = Main()
8797
main.launch()

0 commit comments

Comments
 (0)