From fab6347adfae00d92eb0c6b956bb6f4afaa7ba90 Mon Sep 17 00:00:00 2001 From: Sean Yang Date: Wed, 4 Dec 2024 13:47:57 -0800 Subject: [PATCH] Logger hierarchy (#3081) * convert to logger hierarchy * add functions to log_utils --- docs/resources/log.config | 9 +- nvflare/apis/fl_component.py | 5 +- nvflare/apis/fl_context.py | 5 +- nvflare/apis/impl/task_manager.py | 4 +- nvflare/apis/utils/fl_context_utils.py | 4 +- nvflare/apis/utils/reliable_message.py | 4 +- .../app_common/abstract/params_converter.py | 4 +- .../app_common/aggregators/dxo_aggregator.py | 4 +- .../executors/multi_process_executor.py | 4 +- .../executors/task_script_runner.py | 5 +- .../launchers/subprocess_launcher.py | 4 +- nvflare/app_common/np/np_validator.py | 4 +- nvflare/app_common/streamers/file_streamer.py | 6 +- nvflare/app_common/tie/process_mgr.py | 4 +- .../confidential_computing/cc_helper.py | 5 +- nvflare/app_opt/flower/grpc_client.py | 4 +- nvflare/app_opt/flower/grpc_server.py | 4 +- nvflare/app_opt/flower/mock/echo_servicer.py | 4 +- nvflare/app_opt/lightning/callbacks.py | 5 +- nvflare/app_opt/pt/model_reader_writer.py | 5 +- nvflare/app_opt/pt/utils.py | 5 +- .../histogram_based_v2/adaptors/adaptor.py | 5 +- .../xgboost/histogram_based_v2/grpc_client.py | 4 +- .../xgboost/histogram_based_v2/grpc_server.py | 4 +- .../histogram_based_v2/mock/aggr_servicer.py | 4 +- .../runners/xgb_client_runner.py | 4 +- nvflare/client/ex_process/api.py | 4 +- nvflare/client/flare_agent.py | 4 +- nvflare/client/in_process/api.py | 4 +- nvflare/client/ipc/ipc_agent.py | 4 +- nvflare/fuel/f3/cellnet/cell.py | 6 +- nvflare/fuel/f3/cellnet/connector_manager.py | 4 +- nvflare/fuel/f3/cellnet/core_cell.py | 5 +- nvflare/fuel/f3/cellnet/net_agent.py | 4 +- nvflare/fuel/f3/drivers/aio_context.py | 4 +- nvflare/fuel/f3/drivers/aio_grpc_driver.py | 10 +- nvflare/fuel/f3/drivers/grpc/qq.py | 5 +- nvflare/fuel/f3/drivers/grpc_driver.py | 10 +- nvflare/fuel/f3/mpm.py | 4 +- nvflare/fuel/f3/qat/server.py | 5 +- nvflare/fuel/hci/server/binary_transfer.py | 4 +- nvflare/fuel/utils/class_utils.py | 4 +- nvflare/fuel/utils/config_factory.py | 5 +- nvflare/fuel/utils/config_service.py | 4 +- nvflare/fuel/utils/json_config_loader.py | 4 +- nvflare/fuel/utils/json_scanner.py | 4 +- nvflare/fuel/utils/log_utils.py | 114 +++++++++++++++++- nvflare/fuel/utils/obj_utils.py | 5 - nvflare/fuel/utils/pipe/cell_pipe.py | 4 +- nvflare/fuel/utils/pipe/pipe_handler.py | 4 +- nvflare/ha/ha_admin_cmds.py | 4 +- nvflare/ha/overseer_agent.py | 4 +- nvflare/job_config/fed_job_config.py | 4 +- nvflare/lighter/impl/master_template.yml | 9 +- .../fed/app/client/sub_worker_process.py | 6 +- .../private/fed/app/client/worker_process.py | 4 +- .../fed/app/deployer/server_deployer.py | 4 +- .../private/fed/app/server/runner_process.py | 5 +- nvflare/private/fed/app/simulator/log.config | 11 +- .../private/fed/client/client_app_runner.py | 4 +- nvflare/private/fed/client/client_engine.py | 4 +- nvflare/private/fed/client/client_executor.py | 4 +- .../private/fed/client/client_run_manager.py | 4 +- nvflare/private/fed/client/command_agent.py | 5 +- nvflare/private/fed/client/communicator.py | 4 +- nvflare/private/fed/client/fed_client_base.py | 4 +- nvflare/private/fed/server/client_manager.py | 4 +- nvflare/private/fed/server/fed_server.py | 4 +- nvflare/private/fed/server/job_cmds.py | 4 +- .../fed/server/server_command_agent.py | 5 +- nvflare/private/fed/server/server_commands.py | 4 +- nvflare/private/fed/server/server_engine.py | 4 +- nvflare/private/fed/server/server_state.py | 4 +- nvflare/private/fed/server/training_cmds.py | 4 +- nvflare/private/stream_runner.py | 4 +- 75 files changed, 285 insertions(+), 176 deletions(-) diff --git a/docs/resources/log.config b/docs/resources/log.config index 4fd98dcb48..07c2963686 100644 --- a/docs/resources/log.config +++ b/docs/resources/log.config @@ -5,7 +5,7 @@ keys=root keys=consoleHandler,errorFileHandler [formatters] -keys=fullFormatter +keys=baseFormatter [logger_root] level=INFO @@ -14,14 +14,15 @@ handlers=consoleHandler,errorFileHandler [handler_consoleHandler] class=StreamHandler level=DEBUG -formatter=fullFormatter +formatter=baseFormatter args=(sys.stdout,) [handler_errorFileHandler] class=FileHandler level=ERROR -formatter=fullFormatter +formatter=baseFormatter args=('error_log.txt', 'a') -[formatter_fullFormatter] +[formatter_baseFormatter] +class=nvflare.fuel.utils.log_utils.BaseFormatter format=%(asctime)s - %(name)s - %(levelname)s - %(message)s \ No newline at end of file diff --git a/nvflare/apis/fl_component.py b/nvflare/apis/fl_component.py index 5d89ebd05e..c126bd51ec 100644 --- a/nvflare/apis/fl_component.py +++ b/nvflare/apis/fl_component.py @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from nvflare.apis.utils.fl_context_utils import generate_log_message +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_traceback from .analytix import AnalyticsData, AnalyticsDataType @@ -35,7 +34,7 @@ def __init__(self): FLComponents have the capability to handle and fire events and contain various methods for logging. """ self._name = self.__class__.__name__ - self.logger = logging.getLogger(self._name) + self.logger = get_obj_logger(self) @property def name(self): diff --git a/nvflare/apis/fl_context.py b/nvflare/apis/fl_context.py index 2021eed65a..9d24062c40 100644 --- a/nvflare/apis/fl_context.py +++ b/nvflare/apis/fl_context.py @@ -12,10 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading from typing import Any, Dict, List +from nvflare.fuel.utils.log_utils import get_obj_logger + from .fl_constant import ReservedKey _update_lock = threading.Lock() @@ -72,7 +73,7 @@ def __init__(self): """ self.model = None self.props = {} - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def get_prop_keys(self) -> List[str]: return list(self.props.keys()) diff --git a/nvflare/apis/impl/task_manager.py b/nvflare/apis/impl/task_manager.py index cc085b12f8..f68aa0c4ba 100644 --- a/nvflare/apis/impl/task_manager.py +++ b/nvflare/apis/impl/task_manager.py @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging from enum import Enum from typing import Tuple from nvflare.apis.controller_spec import ClientTask, Task, TaskCompletionStatus from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import Shareable +from nvflare.fuel.utils.log_utils import get_obj_logger class TaskCheckStatus(Enum): @@ -39,7 +39,7 @@ def __init__(self): app-defined props. """ self._name = self.__class__.__name__ - self.logger = logging.getLogger(self._name) + self.logger = get_obj_logger(self) def check_task_send(self, client_task: ClientTask, fl_ctx: FLContext) -> TaskCheckStatus: """Determine whether the task should be sent to the client. diff --git a/nvflare/apis/utils/fl_context_utils.py b/nvflare/apis/utils/fl_context_utils.py index 819e69186b..c1f7a1f472 100644 --- a/nvflare/apis/utils/fl_context_utils.py +++ b/nvflare/apis/utils/fl_context_utils.py @@ -13,16 +13,16 @@ # limitations under the License. import copy -import logging from nvflare.apis.fl_constant import FLContextKey, NonSerializableKeys from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import Shareable from nvflare.fuel.sec.audit import AuditService from nvflare.fuel.utils import fobs +from nvflare.fuel.utils.log_utils import get_module_logger from nvflare.security.logging import secure_format_exception -logger = logging.getLogger("fl_context_utils") +logger = get_module_logger() def get_serializable_data(fl_ctx: FLContext): diff --git a/nvflare/apis/utils/reliable_message.py b/nvflare/apis/utils/reliable_message.py index 782c97bfee..8d3923bf04 100644 --- a/nvflare/apis/utils/reliable_message.py +++ b/nvflare/apis/utils/reliable_message.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. import concurrent.futures -import logging import threading import time import uuid @@ -23,6 +22,7 @@ from nvflare.apis.signal import Signal from nvflare.apis.utils.fl_context_utils import generate_log_message from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_module_logger from nvflare.fuel.utils.validation_utils import check_positive_number from nvflare.security.logging import secure_format_exception, secure_format_traceback @@ -236,7 +236,7 @@ class ReliableMessage: _reply_receivers = {} # tx id => receiver _tx_lock = threading.Lock() _shutdown_asked = False - _logger = logging.getLogger("ReliableMessage") + _logger = get_module_logger(__module__, __qualname__) @classmethod def register_request_handler(cls, topic: str, handler_f, fl_ctx: FLContext): diff --git a/nvflare/app_common/abstract/params_converter.py b/nvflare/app_common/abstract/params_converter.py index 31ed54b9fa..9bcf32e463 100644 --- a/nvflare/app_common/abstract/params_converter.py +++ b/nvflare/app_common/abstract/params_converter.py @@ -12,19 +12,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging from abc import ABC, abstractmethod from typing import Any, List from nvflare.apis.dxo import from_shareable from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import Shareable +from nvflare.fuel.utils.log_utils import get_obj_logger class ParamsConverter(ABC): def __init__(self, supported_tasks: List[str] = None): self.supported_tasks = supported_tasks - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def process(self, task_name: str, shareable: Shareable, fl_ctx: FLContext) -> Shareable: if not self.supported_tasks or task_name in self.supported_tasks: diff --git a/nvflare/app_common/aggregators/dxo_aggregator.py b/nvflare/app_common/aggregators/dxo_aggregator.py index 35388a78c1..2495ccfc4d 100644 --- a/nvflare/app_common/aggregators/dxo_aggregator.py +++ b/nvflare/app_common/aggregators/dxo_aggregator.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging from typing import Any, Dict, Optional from nvflare.apis.dxo import DXO, DataKind, MetaKey @@ -20,6 +19,7 @@ from nvflare.apis.fl_context import FLContext from nvflare.app_common.aggregators.weighted_aggregation_helper import WeightedAggregationHelper from nvflare.app_common.app_constant import AppConstants +from nvflare.fuel.utils.log_utils import get_module_logger class DXOAggregator(FLComponent): @@ -61,7 +61,7 @@ def __init__( if name_postfix: self._name += name_postfix - self.logger = logging.getLogger(self._name) + self.logger = get_module_logger(self.__module__, f"{self.__class__.__qualname__}{name_postfix}") def reset_aggregation_helper(self): if self.aggregation_helper: diff --git a/nvflare/app_common/executors/multi_process_executor.py b/nvflare/app_common/executors/multi_process_executor.py index c41e78efc5..eaeb20acee 100644 --- a/nvflare/app_common/executors/multi_process_executor.py +++ b/nvflare/app_common/executors/multi_process_executor.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import shlex import subprocess @@ -41,6 +40,7 @@ from nvflare.fuel.utils.class_utils import ModuleScanner from nvflare.fuel.utils.component_builder import ComponentBuilder from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import CellChannel, CellChannelTopic, new_cell_message from nvflare.security.logging import secure_format_exception @@ -85,7 +85,7 @@ def __init__(self, executor_id=None, num_of_processes=1, components=None): self.execute_complete = None self.engine = None - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.conn_clients = [] self.exe_process = None diff --git a/nvflare/app_common/executors/task_script_runner.py b/nvflare/app_common/executors/task_script_runner.py index e94b29f600..c4a3c62d38 100644 --- a/nvflare/app_common/executors/task_script_runner.py +++ b/nvflare/app_common/executors/task_script_runner.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. import builtins -import logging import os import runpy import sys @@ -21,12 +20,13 @@ from nvflare.client.in_process.api import TOPIC_ABORT from nvflare.fuel.data_event.data_bus import DataBus from nvflare.fuel.data_event.event_manager import EventManager +from nvflare.fuel.utils.log_utils import get_module_logger print_fn = builtins.print class TaskScriptRunner: - logger = logging.getLogger(__name__) + logger = get_module_logger(__module__, __qualname__) def __init__(self, custom_dir: str, script_path: str, script_args: str = None, redirect_print_to_log=True): """Wrapper for function given function path and args @@ -41,7 +41,6 @@ def __init__(self, custom_dir: str, script_path: str, script_args: str = None, r self.event_manager = EventManager(DataBus()) self.script_args = script_args self.custom_dir = custom_dir - self.logger = logging.getLogger(self.__class__.__name__) self.script_path = script_path self.script_full_path = self.get_script_full_path(self.custom_dir, self.script_path) diff --git a/nvflare/app_common/launchers/subprocess_launcher.py b/nvflare/app_common/launchers/subprocess_launcher.py index 97ce6366ce..faf6151f38 100644 --- a/nvflare/app_common/launchers/subprocess_launcher.py +++ b/nvflare/app_common/launchers/subprocess_launcher.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import shlex import subprocess @@ -24,6 +23,7 @@ from nvflare.apis.shareable import Shareable from nvflare.apis.signal import Signal from nvflare.app_common.abstract.launcher import Launcher, LauncherRunStatus +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.utils.job_launcher_utils import add_custom_dir_to_path @@ -47,7 +47,7 @@ def __init__(self, script: str, launch_once: bool = True, clean_up_script: Optio self._script = script self._launch_once = launch_once self._clean_up_script = clean_up_script - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def initialize(self, fl_ctx: FLContext): self._app_dir = self.get_app_dir(fl_ctx) diff --git a/nvflare/app_common/np/np_validator.py b/nvflare/app_common/np/np_validator.py index b136466ff5..54efe2d040 100755 --- a/nvflare/app_common/np/np_validator.py +++ b/nvflare/app_common/np/np_validator.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import time import numpy as np @@ -24,6 +23,7 @@ from nvflare.apis.shareable import Shareable, make_reply from nvflare.apis.signal import Signal from nvflare.app_common.app_constant import AppConstants +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception from .constants import NPConstants @@ -41,7 +41,7 @@ def __init__( # for long time. super().__init__() - self.logger = logging.getLogger("NPValidator") + self.logger = get_obj_logger(self) self._random_epsilon = epsilon self._sleep_time = sleep_time self._validate_task_name = validate_task_name diff --git a/nvflare/app_common/streamers/file_streamer.py b/nvflare/app_common/streamers/file_streamer.py index fe88b93d12..a955195f9a 100644 --- a/nvflare/app_common/streamers/file_streamer.py +++ b/nvflare/app_common/streamers/file_streamer.py @@ -19,7 +19,7 @@ from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import ReturnCode, Shareable, make_reply from nvflare.apis.streaming import ConsumerFactory, ObjectConsumer, ObjectProducer, StreamableEngine, StreamContext -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.validation_utils import check_positive_int, check_positive_number from .streamer_base import StreamerBase @@ -36,7 +36,7 @@ class _ChunkConsumer(ObjectConsumer): def __init__(self, stream_ctx: StreamContext, dest_dir): file_name = stream_ctx.get(_KEY_FILE_NAME) - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.file_name = file_name self.dest_dir = dest_dir self.file_size = stream_ctx.get(_KEY_FILE_SIZE) @@ -101,7 +101,7 @@ def __init__(self, file, chunk_size, timeout): self.chunk_size = chunk_size self.timeout = timeout self.eof = False - self.logger = get_logger(self) + self.logger = get_obj_logger(self) def produce( self, diff --git a/nvflare/app_common/tie/process_mgr.py b/nvflare/app_common/tie/process_mgr.py index e8c300925f..2feb29e97b 100644 --- a/nvflare/app_common/tie/process_mgr.py +++ b/nvflare/app_common/tie/process_mgr.py @@ -20,7 +20,7 @@ from nvflare.apis.fl_constant import FLContextKey from nvflare.apis.fl_context import FLContext from nvflare.apis.workspace import Workspace -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.validation_utils import check_object_type, check_str @@ -87,7 +87,7 @@ def __init__(self, cmd_desc: CommandDescriptor): self.log_file = None self.msg_prefix = None self.file_lock = threading.Lock() - self.logger = get_logger(self) + self.logger = get_obj_logger(self) def start( self, diff --git a/nvflare/app_opt/confidential_computing/cc_helper.py b/nvflare/app_opt/confidential_computing/cc_helper.py index 90450e40f5..c01d0146e0 100644 --- a/nvflare/app_opt/confidential_computing/cc_helper.py +++ b/nvflare/app_opt/confidential_computing/cc_helper.py @@ -13,12 +13,13 @@ # limitations under the License. # import os.path -import logging import os from typing import Dict from nv_attestation_sdk.attestation import Attestation, Devices, Environment +from nvflare.fuel.utils.log_utils import get_obj_logger + class VerifierProp: @@ -64,7 +65,7 @@ def __init__(self, site_name: str, verifiers: list): attestation.set_name(site_name) self.attestation = attestation self.token = None - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) for v in verifiers: assert isinstance(v, dict) url = None diff --git a/nvflare/app_opt/flower/grpc_client.py b/nvflare/app_opt/flower/grpc_client.py index 67f14fe72e..b1600d1844 100644 --- a/nvflare/app_opt/flower/grpc_client.py +++ b/nvflare/app_opt/flower/grpc_client.py @@ -16,7 +16,7 @@ from nvflare.app_opt.flower.defs import GRPC_DEFAULT_OPTIONS from nvflare.fuel.utils.grpc_utils import create_channel -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from .utils import reply_should_exit @@ -39,7 +39,7 @@ def __init__(self, server_addr, grpc_options=None): self.server_addr = server_addr self.grpc_options = grpc_options self.started = False - self.logger = get_logger(self) + self.logger = get_obj_logger(self) def start(self, ready_timeout=10): """Start the gRPC client and wait for the server to be ready. diff --git a/nvflare/app_opt/flower/grpc_server.py b/nvflare/app_opt/flower/grpc_server.py index 0eb09a9f7a..261da5c6ec 100644 --- a/nvflare/app_opt/flower/grpc_server.py +++ b/nvflare/app_opt/flower/grpc_server.py @@ -18,7 +18,7 @@ from flwr.proto.grpcadapter_pb2_grpc import GrpcAdapterServicer, add_GrpcAdapterServicer_to_server from nvflare.app_opt.flower.defs import GRPC_DEFAULT_OPTIONS -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.validation_utils import check_object_type, check_positive_int from nvflare.security.logging import secure_format_exception @@ -42,7 +42,7 @@ def __init__(self, addr, max_workers: int, grpc_options, servicer): check_positive_int("max_workers", max_workers) self.grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers), options=grpc_options) add_GrpcAdapterServicer_to_server(servicer, self.grpc_server) - self.logger = get_logger(self) + self.logger = get_obj_logger(self) try: # TBD: will be enhanced to support secure port diff --git a/nvflare/app_opt/flower/mock/echo_servicer.py b/nvflare/app_opt/flower/mock/echo_servicer.py index e8a798e6d3..f13851f7ff 100644 --- a/nvflare/app_opt/flower/mock/echo_servicer.py +++ b/nvflare/app_opt/flower/mock/echo_servicer.py @@ -15,12 +15,12 @@ import flwr.proto.grpcadapter_pb2 as pb2 from flwr.proto.grpcadapter_pb2_grpc import GrpcAdapterServicer -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger class EchoServicer(GrpcAdapterServicer): def __init__(self, num_rounds): - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.num_rounds = num_rounds self.server = None self.stopped = False diff --git a/nvflare/app_opt/lightning/callbacks.py b/nvflare/app_opt/lightning/callbacks.py index 28a77bea99..3c60da6270 100755 --- a/nvflare/app_opt/lightning/callbacks.py +++ b/nvflare/app_opt/lightning/callbacks.py @@ -12,19 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging from copy import deepcopy import pytorch_lightning as pl from pytorch_lightning.callbacks import Callback +from nvflare.fuel.utils.log_utils import get_obj_logger + class RestoreState(Callback): """Callback to restore the local optimizer and learning rate scheduler states at each round of FL""" def __init__(self): super().__init__() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.optimizer_states = [] self.scaler_states = [] diff --git a/nvflare/app_opt/pt/model_reader_writer.py b/nvflare/app_opt/pt/model_reader_writer.py index da832e122e..ae66e9ce31 100644 --- a/nvflare/app_opt/pt/model_reader_writer.py +++ b/nvflare/app_opt/pt/model_reader_writer.py @@ -12,11 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from nvflare.apis.fl_context import FLContext from nvflare.app_common.abstract.model_processor import ModelProcessor from nvflare.app_opt.pt.utils import feed_vars +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception @@ -24,7 +23,7 @@ class PTModelReaderWriter(ModelProcessor): def __init__(self): """Perform the actual read/write operation for PyTorch-based models.""" self._name = self.__class__.__name__ - self.logger = logging.getLogger(self._name) + self.logger = get_obj_logger(self) def extract_model(self, network, multi_processes: bool, model_vars: dict, fl_ctx: FLContext) -> dict: net = network diff --git a/nvflare/app_opt/pt/utils.py b/nvflare/app_opt/pt/utils.py index a06e7a495c..f97102ad7a 100644 --- a/nvflare/app_opt/pt/utils.py +++ b/nvflare/app_opt/pt/utils.py @@ -12,11 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - import torch import torch.nn as nn +from nvflare.fuel.utils.log_utils import get_module_logger from nvflare.security.logging import secure_format_exception @@ -30,7 +29,7 @@ def feed_vars(model: nn.Module, model_params): Returns: a list of params and a dictionary of vars to params """ - _logger = logging.getLogger("AssignVariables") + _logger = get_module_logger(__name__, "AssignVariables") _logger.debug("AssignVariables...") to_assign = [] diff --git a/nvflare/app_opt/xgboost/histogram_based_v2/adaptors/adaptor.py b/nvflare/app_opt/xgboost/histogram_based_v2/adaptors/adaptor.py index 4550e2e51e..f252ffdb92 100644 --- a/nvflare/app_opt/xgboost/histogram_based_v2/adaptors/adaptor.py +++ b/nvflare/app_opt/xgboost/histogram_based_v2/adaptors/adaptor.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import logging import multiprocessing import os import sys @@ -28,7 +27,7 @@ from nvflare.apis.workspace import Workspace from nvflare.app_opt.xgboost.histogram_based_v2.defs import Constant from nvflare.app_opt.xgboost.histogram_based_v2.runners.xgb_runner import AppRunner -from nvflare.fuel.utils.log_utils import add_log_file_handler, configure_logging +from nvflare.fuel.utils.log_utils import add_log_file_handler, configure_logging, get_obj_logger from nvflare.fuel.utils.validation_utils import check_object_type from nvflare.security.logging import secure_format_exception, secure_log_traceback @@ -49,7 +48,7 @@ def __init__(self, app_name: str, runner, in_process: bool, workspace: Workspace self.started = True self.stopped = False self.exit_code = 0 - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def start(self, ctx: dict): """Start the runner and wait for it to finish. diff --git a/nvflare/app_opt/xgboost/histogram_based_v2/grpc_client.py b/nvflare/app_opt/xgboost/histogram_based_v2/grpc_client.py index ee81e278a4..f6de1eda25 100644 --- a/nvflare/app_opt/xgboost/histogram_based_v2/grpc_client.py +++ b/nvflare/app_opt/xgboost/histogram_based_v2/grpc_client.py @@ -17,7 +17,7 @@ import nvflare.app_opt.xgboost.histogram_based_v2.proto.federated_pb2 as pb2 from nvflare.app_opt.xgboost.histogram_based_v2.defs import GRPC_DEFAULT_OPTIONS from nvflare.app_opt.xgboost.histogram_based_v2.proto.federated_pb2_grpc import FederatedStub -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger class GrpcClient: @@ -39,7 +39,7 @@ def __init__(self, server_addr, grpc_options=None): self.server_addr = server_addr self.grpc_options = grpc_options self.started = False - self.logger = get_logger(self) + self.logger = get_obj_logger(self) def start(self, ready_timeout=10): """Start the gRPC client and wait for the server to be ready. diff --git a/nvflare/app_opt/xgboost/histogram_based_v2/grpc_server.py b/nvflare/app_opt/xgboost/histogram_based_v2/grpc_server.py index 5728439a33..7da122f943 100644 --- a/nvflare/app_opt/xgboost/histogram_based_v2/grpc_server.py +++ b/nvflare/app_opt/xgboost/histogram_based_v2/grpc_server.py @@ -21,7 +21,7 @@ FederatedServicer, add_FederatedServicer_to_server, ) -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.validation_utils import check_object_type, check_positive_int from nvflare.security.logging import secure_format_exception @@ -46,7 +46,7 @@ def __init__(self, addr, max_workers: int, servicer, grpc_options=None): check_positive_int("max_workers", max_workers) self.grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers), options=grpc_options) add_FederatedServicer_to_server(servicer, self.grpc_server) - self.logger = get_logger(self) + self.logger = get_obj_logger(self) try: # TBD: will be enhanced to support secure port diff --git a/nvflare/app_opt/xgboost/histogram_based_v2/mock/aggr_servicer.py b/nvflare/app_opt/xgboost/histogram_based_v2/mock/aggr_servicer.py index 549cf48505..8b271fee9b 100644 --- a/nvflare/app_opt/xgboost/histogram_based_v2/mock/aggr_servicer.py +++ b/nvflare/app_opt/xgboost/histogram_based_v2/mock/aggr_servicer.py @@ -16,7 +16,7 @@ import nvflare.app_opt.xgboost.histogram_based_v2.proto.federated_pb2 as pb2 from nvflare.app_opt.xgboost.histogram_based_v2.proto.federated_pb2_grpc import FederatedServicer -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger class ReqWaiter: @@ -60,7 +60,7 @@ def wait(self, timeout): class AggrServicer(FederatedServicer): def __init__(self, num_clients, aggr_timeout=10.0): - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.num_clients = num_clients self.aggr_timeout = aggr_timeout self.req_lock = threading.Lock() diff --git a/nvflare/app_opt/xgboost/histogram_based_v2/runners/xgb_client_runner.py b/nvflare/app_opt/xgboost/histogram_based_v2/runners/xgb_client_runner.py index f4fb01a441..c0b735b985 100644 --- a/nvflare/app_opt/xgboost/histogram_based_v2/runners/xgb_client_runner.py +++ b/nvflare/app_opt/xgboost/histogram_based_v2/runners/xgb_client_runner.py @@ -29,7 +29,7 @@ from nvflare.app_opt.xgboost.histogram_based_v2.runners.xgb_runner import AppRunner from nvflare.app_opt.xgboost.metrics_cb import MetricsCallback from nvflare.fuel.utils.config_service import ConfigService -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.utils.cli_utils import get_package_root PLUGIN_PARAM_KEY = "federated_plugin" @@ -63,7 +63,7 @@ def __init__( FLComponent.__init__(self) self.model_file_name = model_file_name self.data_loader_id = data_loader_id - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.fl_ctx = None self._client_name = None diff --git a/nvflare/client/ex_process/api.py b/nvflare/client/ex_process/api.py index 4b5e4b1bb9..d3688c0bfe 100644 --- a/nvflare/client/ex_process/api.py +++ b/nvflare/client/ex_process/api.py @@ -28,7 +28,7 @@ from nvflare.client.model_registry import ModelRegistry from nvflare.fuel.utils import fobs from nvflare.fuel.utils.import_utils import optional_import -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.pipe.pipe import Pipe @@ -63,7 +63,7 @@ def _register_tensor_decomposer(): class ExProcessClientAPI(APISpec): def __init__(self): self.process_model_registry = None - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.receive_called = False def get_model_registry(self) -> ModelRegistry: diff --git a/nvflare/client/flare_agent.py b/nvflare/client/flare_agent.py index 23ca4e79e8..60bef07579 100644 --- a/nvflare/client/flare_agent.py +++ b/nvflare/client/flare_agent.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time import traceback @@ -26,6 +25,7 @@ from nvflare.app_common.app_constant import AppConstants from nvflare.app_common.decomposers import common_decomposers from nvflare.fuel.utils.constants import PipeChannelName +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.pipe.cell_pipe import CellPipe from nvflare.fuel.utils.pipe.pipe import Message, Mode, Pipe from nvflare.fuel.utils.pipe.pipe_handler import PipeHandler @@ -112,7 +112,7 @@ def __init__( if decomposer_module: register_ext_decomposers(decomposer_module) - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.pipe = pipe self.pipe_handler = None if self.pipe: diff --git a/nvflare/client/in_process/api.py b/nvflare/client/in_process/api.py index 858e0e630e..83d9c4cdb1 100644 --- a/nvflare/client/in_process/api.py +++ b/nvflare/client/in_process/api.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import time from typing import Any, Dict, Optional @@ -28,6 +27,7 @@ from nvflare.client.utils import DIFF_FUNCS from nvflare.fuel.data_event.data_bus import DataBus from nvflare.fuel.data_event.event_manager import EventManager +from nvflare.fuel.utils.log_utils import get_obj_logger TOPIC_LOG_DATA = "LOG_DATA" TOPIC_STOP = "STOP" @@ -54,7 +54,7 @@ def __init__(self, task_metadata: dict, result_check_interval: float = 2.0): self.fl_model = None self.sys_info = {} self.client_config: Optional[ClientConfig] = None - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.event_manager = EventManager(self.data_bus) self.abort_reason = "" self.stop_reason = "" diff --git a/nvflare/client/ipc/ipc_agent.py b/nvflare/client/ipc/ipc_agent.py index a125434ae4..1c103b2dc2 100644 --- a/nvflare/client/ipc/ipc_agent.py +++ b/nvflare/client/ipc/ipc_agent.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time import traceback @@ -26,6 +25,7 @@ from nvflare.fuel.f3.cellnet.utils import make_reply from nvflare.fuel.f3.drivers.driver_params import DriverParams from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.fed.utils.fed_utils import register_ext_decomposers _SSL_ROOT_CERT = "rootCA.pem" @@ -61,7 +61,7 @@ def __init__( """ ConfigService.initialize(section_files={}, config_path=[workspace_dir]) - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.cell_name = defs.agent_site_fqcn(flare_site_name, agent_id) self.workspace_dir = workspace_dir self.secure_mode = secure_mode diff --git a/nvflare/fuel/f3/cellnet/cell.py b/nvflare/fuel/f3/cellnet/cell.py index 3d2bdcc414..cc657fa31f 100644 --- a/nvflare/fuel/f3/cellnet/cell.py +++ b/nvflare/fuel/f3/cellnet/cell.py @@ -14,7 +14,6 @@ import concurrent.futures import copy -import logging import threading import uuid from typing import Dict, List, Union @@ -27,6 +26,7 @@ from nvflare.fuel.f3.stream_cell import StreamCell from nvflare.fuel.f3.streaming.stream_const import StreamHeaderKey from nvflare.fuel.f3.streaming.stream_types import StreamFuture +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.waiter_utils import WaiterRC, conditional_wait from nvflare.security.logging import secure_format_exception @@ -65,7 +65,7 @@ def __init__(self, cb, my_info, cell): self.cb = cb self.my_info = my_info self.cell = cell - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def call(self, future): # this will be called by StreamCell upon receiving the first byte of blob headers = future.headers @@ -116,7 +116,7 @@ def __init__(self, *args, **kwargs): self.core_cell = CoreCell(*args, **kwargs) super().__init__(self.core_cell) self.requests_dict = dict() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.register_blob_cb(CellChannel.RETURN_ONLY, "*", self._process_reply) # this should be one-time registration def __getattr__(self, func): diff --git a/nvflare/fuel/f3/cellnet/connector_manager.py b/nvflare/fuel/f3/cellnet/connector_manager.py index 46282dc65f..d44fb530ad 100644 --- a/nvflare/fuel/f3/cellnet/connector_manager.py +++ b/nvflare/fuel/f3/cellnet/connector_manager.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import time from typing import Union @@ -21,6 +20,7 @@ from nvflare.fuel.f3.cellnet.fqcn import FqcnInfo from nvflare.fuel.f3.comm_config import CommConfigurator from nvflare.fuel.f3.communicator import CommError, Communicator, Mode +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception, secure_format_traceback _KEY_RESOURCES = "resources" @@ -55,7 +55,7 @@ class ConnectorManager: def __init__(self, communicator: Communicator, secure: bool, comm_configurator: CommConfigurator): self._name = self.__class__.__name__ - self.logger = logging.getLogger(self._name) + self.logger = get_obj_logger(self) self.communicator = communicator self.secure = secure diff --git a/nvflare/fuel/f3/cellnet/core_cell.py b/nvflare/fuel/f3/cellnet/core_cell.py index 0820df71de..b60c4b0fa3 100644 --- a/nvflare/fuel/f3/cellnet/core_cell.py +++ b/nvflare/fuel/f3/cellnet/core_cell.py @@ -49,6 +49,7 @@ from nvflare.fuel.f3.message import Message from nvflare.fuel.f3.mpm import MainProcessMonitor from nvflare.fuel.f3.stats_pool import StatsPoolManager +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception, secure_format_traceback _CHANNEL = "cellnet.channel" @@ -155,7 +156,7 @@ def __init__(self, cell, target: str, max_queue_size, secure=False): self.messages = [] self.last_send_time = 0 self.lock = threading.Lock() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def queue_message(self, channel: str, topic: str, message: Message): if self.secure: @@ -318,7 +319,7 @@ def __init__( comm_configurator = CommConfigurator() self._name = self.__class__.__name__ - self.logger = logging.getLogger(self._name) + self.logger = get_obj_logger(self) self.max_msg_size = comm_configurator.get_max_message_size() self.comm_configurator = comm_configurator diff --git a/nvflare/fuel/f3/cellnet/net_agent.py b/nvflare/fuel/f3/cellnet/net_agent.py index 98bbb2f1ca..6b8285a163 100644 --- a/nvflare/fuel/f3/cellnet/net_agent.py +++ b/nvflare/fuel/f3/cellnet/net_agent.py @@ -14,7 +14,6 @@ import copy import hashlib -import logging import os import random import resource @@ -31,6 +30,7 @@ from nvflare.fuel.f3.cellnet.utils import make_reply from nvflare.fuel.f3.stats_pool import StatsPoolManager from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_obj_logger _CHANNEL = "_net_manager" _TOPIC_PEERS = "peers" @@ -119,7 +119,7 @@ def __init__(self, cell, change_root_cb=None, agent_closed_cb=None): self.cell = cell self.change_root_cb = change_root_cb self.agent_closed_cb = agent_closed_cb - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) cell.register_request_cb( channel=_CHANNEL, diff --git a/nvflare/fuel/f3/drivers/aio_context.py b/nvflare/fuel/f3/drivers/aio_context.py index 6f91cf41d6..7aea649dc2 100644 --- a/nvflare/fuel/f3/drivers/aio_context.py +++ b/nvflare/fuel/f3/drivers/aio_context.py @@ -16,7 +16,7 @@ import threading import time -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception @@ -31,7 +31,7 @@ def __init__(self, name): self.name = name self.loop = None self.ready = threading.Event() - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.logger.debug(f"{os.getpid()}: ******** Created AioContext {name}") def get_event_loop(self): diff --git a/nvflare/fuel/f3/drivers/aio_grpc_driver.py b/nvflare/fuel/f3/drivers/aio_grpc_driver.py index 9c91f3271f..972e8fc05f 100644 --- a/nvflare/fuel/f3/drivers/aio_grpc_driver.py +++ b/nvflare/fuel/f3/drivers/aio_grpc_driver.py @@ -31,7 +31,7 @@ StreamerStub, add_StreamerServicer_to_server, ) -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception, secure_format_traceback from .base_driver import BaseDriver @@ -60,7 +60,7 @@ class AioStreamSession(Connection): def __init__(self, aio_ctx: AioContext, connector: ConnectorInfo, conn_props: dict, context=None, channel=None): super().__init__(connector) self.aio_ctx = aio_ctx - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.oq = asyncio.Queue(16) self.closing = False @@ -183,7 +183,7 @@ class Servicer(StreamerServicer): def __init__(self, server, aio_ctx: AioContext): self.server = server self.aio_ctx = aio_ctx - self.logger = get_logger(self) + self.logger = get_obj_logger(self) async def Stream(self, request_iterator, context): connection = None @@ -226,7 +226,7 @@ async def Stream(self, request_iterator, context): class Server: def __init__(self, driver, connector, aio_ctx: AioContext, options, conn_ctx: _ConnCtx): - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.driver = driver self.connector = connector self.grpc_server = grpc.aio.server(options=options) @@ -285,7 +285,7 @@ def __init__(self): self.server = None self.options = GRPC_DEFAULT_OPTIONS - self.logger = get_logger(self) + self.logger = get_obj_logger(self) configurator = CommConfigurator() config = configurator.get_config() if config: diff --git a/nvflare/fuel/f3/drivers/grpc/qq.py b/nvflare/fuel/f3/drivers/grpc/qq.py index ca0eeb25f2..51b9c1b6ab 100644 --- a/nvflare/fuel/f3/drivers/grpc/qq.py +++ b/nvflare/fuel/f3/drivers/grpc/qq.py @@ -12,9 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import queue +from nvflare.fuel.utils.log_utils import get_obj_logger + class QueueClosed(Exception): pass @@ -24,7 +25,7 @@ class QQ: def __init__(self): self.q = queue.Queue() self.closed = False - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def close(self): self.closed = True diff --git a/nvflare/fuel/f3/drivers/grpc_driver.py b/nvflare/fuel/f3/drivers/grpc_driver.py index 2ec4009fbf..2cd2d0bb1b 100644 --- a/nvflare/fuel/f3/drivers/grpc_driver.py +++ b/nvflare/fuel/f3/drivers/grpc_driver.py @@ -28,7 +28,7 @@ StreamerStub, add_StreamerServicer_to_server, ) -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception from .base_driver import BaseDriver @@ -57,7 +57,7 @@ def __init__(self, oq: QQ, connector: ConnectorInfo, conn_props: dict, side: str self.context = context # for server side self.channel = channel # for client side self.lock = threading.Lock() - self.logger = get_logger(self) + self.logger = get_obj_logger(self) def get_conn_properties(self) -> dict: return self.conn_props @@ -124,7 +124,7 @@ def generate_output(self): class Servicer(StreamerServicer): def __init__(self, server): self.server = server - self.logger = get_logger(self) + self.logger = get_obj_logger(self) def Stream(self, request_iterator, context): connection = None @@ -169,7 +169,7 @@ def __init__( options, ): self.driver = driver - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.connector = connector self.grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers), options=options) servicer = Servicer(self) @@ -209,7 +209,7 @@ def __init__(self): self.closing = False self.max_workers = 100 self.options = GRPC_DEFAULT_OPTIONS - self.logger = get_logger(self) + self.logger = get_obj_logger(self) configurator = CommConfigurator() config = configurator.get_config() if config: diff --git a/nvflare/fuel/f3/mpm.py b/nvflare/fuel/f3/mpm.py index 046836f65c..f012567b1e 100644 --- a/nvflare/fuel/f3/mpm.py +++ b/nvflare/fuel/f3/mpm.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import signal import threading @@ -21,6 +20,7 @@ from nvflare.fuel.common.excepts import ComponentNotAuthorized, ConfigError from nvflare.fuel.common.exit_codes import ProcessExitCode from nvflare.fuel.f3.drivers.aio_context import AioContext +from nvflare.fuel.utils.log_utils import get_module_logger from nvflare.security.logging import secure_format_exception, secure_format_traceback @@ -54,7 +54,7 @@ def get_aio_context(cls): @classmethod def logger(cls): if not cls._logger: - cls._logger = logging.getLogger(cls.name) + cls._logger = get_module_logger(cls.__module__, cls.name) return cls._logger @classmethod diff --git a/nvflare/fuel/f3/qat/server.py b/nvflare/fuel/f3/qat/server.py index aa0e5c9a3a..0b17e6264c 100644 --- a/nvflare/fuel/f3/qat/server.py +++ b/nvflare/fuel/f3/qat/server.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from nvflare.fuel.f3.cellnet.fqcn import FQCN from nvflare.fuel.f3.cellnet.net_manager import NetManager from nvflare.fuel.f3.mpm import MainProcessMonitor @@ -21,6 +19,7 @@ from nvflare.fuel.hci.server.builtin import new_command_register_with_builtin_module from nvflare.fuel.hci.server.hci import AdminServer from nvflare.fuel.hci.server.login import LoginModule, SessionManager, SimpleAuthenticator +from nvflare.fuel.utils.log_utils import get_obj_logger from .cell_runner import CellRunner, NetConfig @@ -28,7 +27,7 @@ class Server(CellRunner): def __init__(self, config_path: str, config_file: str, log_level: str): self._name = self.__class__.__name__ - self.logger = logging.getLogger(self._name) + self.logger = get_obj_logger(self) net_config = NetConfig(config_file) admin_host, admin_port = net_config.get_admin() diff --git a/nvflare/fuel/hci/server/binary_transfer.py b/nvflare/fuel/hci/server/binary_transfer.py index 933e09aef6..72887b8497 100644 --- a/nvflare/fuel/hci/server/binary_transfer.py +++ b/nvflare/fuel/hci/server/binary_transfer.py @@ -12,18 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os from nvflare.fuel.hci.binary_proto import send_binary_file from nvflare.fuel.hci.conn import Connection from nvflare.fuel.hci.proto import MetaKey, MetaStatusValue, make_meta from nvflare.fuel.hci.server.constants import ConnProps +from nvflare.fuel.utils.log_utils import get_obj_logger class BinaryTransfer: def __init__(self): - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def download_file(self, conn: Connection, tx_id: str, folder_name: str, file_name: str): conn.binary_mode = True diff --git a/nvflare/fuel/utils/class_utils.py b/nvflare/fuel/utils/class_utils.py index 47a26d050a..e82162ada2 100644 --- a/nvflare/fuel/utils/class_utils.py +++ b/nvflare/fuel/utils/class_utils.py @@ -14,13 +14,13 @@ import importlib import inspect -import logging import pkgutil from typing import Dict, List, Optional from nvflare.apis.fl_component import FLComponent from nvflare.fuel.common.excepts import ConfigError from nvflare.fuel.utils.components_utils import create_classes_table_static +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception DEPRECATED_PACKAGES = ["nvflare.app_common.pt", "nvflare.app_common.homomorphic_encryption"] @@ -76,7 +76,7 @@ def __init__(self, base_pkgs: List[str], module_names: List[str], exclude_libs=T self.module_names = module_names self.exclude_libs = exclude_libs - self._logger = logging.getLogger(self.__class__.__name__) + self._logger = get_obj_logger(self) self._class_table = create_classes_table_static() def create_classes_table(self): diff --git a/nvflare/fuel/utils/config_factory.py b/nvflare/fuel/utils/config_factory.py index 1f30894690..681ad168e8 100644 --- a/nvflare/fuel/utils/config_factory.py +++ b/nvflare/fuel/utils/config_factory.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import pathlib from typing import List, Optional, Tuple @@ -20,10 +19,12 @@ from nvflare.fuel.utils.config import Config, ConfigFormat, ConfigLoader from nvflare.fuel.utils.import_utils import optional_import from nvflare.fuel.utils.json_config_loader import JsonConfigLoader +from nvflare.fuel.utils.log_utils import get_module_logger class ConfigFactory: - logger = logging.getLogger(__qualname__) + logger = get_module_logger(__module__, __qualname__) + OmegaConfLoader, omega_import_ok = optional_import( module="nvflare.fuel_opt.utils.omegaconf_loader", name="OmegaConfLoader" ) diff --git a/nvflare/fuel/utils/config_service.py b/nvflare/fuel/utils/config_service.py index 6a9efb8586..7095c59e8f 100644 --- a/nvflare/fuel/utils/config_service.py +++ b/nvflare/fuel/utils/config_service.py @@ -13,12 +13,12 @@ # limitations under the License. import argparse import json -import logging import os from typing import Dict, List, Optional, Union from nvflare.fuel.utils.config import Config, ConfigFormat from nvflare.fuel.utils.config_factory import ConfigFactory +from nvflare.fuel.utils.log_utils import get_module_logger ENV_VAR_PREFIX = "NVFLARE_" @@ -69,7 +69,7 @@ class ConfigService: Only JSON file loading is supported. """ - logger = logging.getLogger(__name__) + logger = get_module_logger(__module__, __qualname__) _sections = {} _config_path = [] _cmd_args = None diff --git a/nvflare/fuel/utils/json_config_loader.py b/nvflare/fuel/utils/json_config_loader.py index edf82d508b..5f17e44d9c 100644 --- a/nvflare/fuel/utils/json_config_loader.py +++ b/nvflare/fuel/utils/json_config_loader.py @@ -13,10 +13,10 @@ # limitations under the License. import json -import logging from typing import Dict, Optional from nvflare.fuel.utils.config import Config, ConfigFormat, ConfigLoader +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception @@ -37,7 +37,7 @@ def to_str(self, element: Optional[Dict] = None) -> str: class JsonConfigLoader(ConfigLoader): def __init__(self): super(JsonConfigLoader, self).__init__(fmt=ConfigFormat.JSON) - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def load_config(self, file_path: str) -> Config: conf_dict = self._from_file(file_path) diff --git a/nvflare/fuel/utils/json_scanner.py b/nvflare/fuel/utils/json_scanner.py index 03df80626e..d39f30323d 100644 --- a/nvflare/fuel/utils/json_scanner.py +++ b/nvflare/fuel/utils/json_scanner.py @@ -13,11 +13,11 @@ # limitations under the License. import copy -import logging from abc import ABC, abstractmethod from nvflare.fuel.common.excepts import ComponentNotAuthorized, ConfigError from nvflare.fuel.utils.config_factory import ConfigFactory +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception, secure_log_traceback @@ -92,7 +92,7 @@ def __init__(self, json_data: dict, location=None): raise ValueError("json_data must be dict") self.location = location self.data = json_data - self.logger = logging.getLogger("JsonScanner") + self.logger = get_obj_logger(self) def _do_scan(self, node: Node): try: diff --git a/nvflare/fuel/utils/log_utils.py b/nvflare/fuel/utils/log_utils.py index 00a76f9c4f..77a855e126 100644 --- a/nvflare/fuel/utils/log_utils.py +++ b/nvflare/fuel/utils/log_utils.py @@ -10,14 +10,84 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License.import logging +# limitations under the License. +import inspect +import logging import logging.config import os +from logging import Logger from logging.handlers import RotatingFileHandler from nvflare.apis.workspace import Workspace +class ANSIColor: + GREY = "38" + YELLOW = "33" + RED = "31" + BOLD_RED = "31;1" + CYAN = "36" + RESET = "0" + + +DEFAULT_LEVEL_COLORS = { + "DEBUG": ANSIColor.GREY, + "INFO": ANSIColor.GREY, + "WARNING": ANSIColor.YELLOW, + "ERROR": ANSIColor.RED, + "CRITICAL": ANSIColor.BOLD_RED, +} + + +class BaseFormatter(logging.Formatter): + def __init__(self, fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt=None, style="%"): + """BaseFormatter is the default formatter for log records. + + Shortens logger %(name)s to the suffix, full name can be accessed with %(fullName)s + + Args: + fmt: format string which uses LogRecord attributes. + datefmt: date/time format string. Defaults to '%Y-%m-%d %H:%M:%S'. + style: style character '%' '{' or '$' for format string. + + """ + super().__init__(fmt=fmt, datefmt=datefmt, style=style) + + def format(self, record): + if not hasattr(record, "fullName"): + record.fullName = record.name + record.name = record.name.split(".")[-1] + + return super().format(record) + + +def ansi_sgr(code): + # ANSI Select Graphics Rendition + return "\x1b[" + code + "m" + + +def get_module_logger(module=None, name=None): + if module is None: + caller_globals = inspect.stack()[1].frame.f_globals + module = caller_globals.get("__name__", "") + + return logging.getLogger(f"{module}.{name}" if name else module) + + +def get_obj_logger(obj): + return logging.getLogger(f"{obj.__module__}.{obj.__class__.__qualname__}") + + +def get_script_logger(): + caller_frame = inspect.stack()[1] + package = caller_frame.frame.f_globals.get("__package__", "") + file = caller_frame.frame.f_globals.get("__file__", "") + + return logging.getLogger( + f"{package + '.' if package else ''}{os.path.splitext(os.path.basename(file))[0] if file else ''}" + ) + + def configure_logging(workspace: Workspace): log_config_file_path = workspace.get_log_config_file_path() assert os.path.isfile(log_config_file_path), f"missing log config file {log_config_file_path}" @@ -31,3 +101,45 @@ def add_log_file_handler(log_file_name): file_handler.setLevel(main_handler.level) file_handler.setFormatter(main_handler.formatter) root_logger.addHandler(file_handler) + + +def print_logger_hierarchy(package_name="nvflare", level_colors=DEFAULT_LEVEL_COLORS): + all_loggers = logging.root.manager.loggerDict + + # Filter for package loggers based on package_name + package_loggers = {name: logger for name, logger in all_loggers.items() if name.startswith(package_name)} + sorted_package_loggers = sorted(package_loggers.keys()) + + # Print package loggers with hierarcjy + print(f"hierarchical loggers ({len(package_loggers)}):") + + def get_effective_level(logger_name): + # Search for effective level from parent loggers + parts = logger_name.split(".") + for i in range(len(parts), 0, -1): + parent_name = ".".join(parts[:i]) + parent_logger = package_loggers.get(parent_name) + if isinstance(parent_logger, Logger) and parent_logger.level != logging.NOTSET: + return logging.getLevelName(parent_logger.level) + + # If no parent has a set level, default to the root logger's effective level + return logging.getLevelName(logging.root.level) + + def print_hierarchy(logger_name, indent_level=0): + logger = package_loggers.get(logger_name) + level_name = get_effective_level(logger_name) + + # Indicate "(unset)" placeholders if logger.level == NOTSET + is_unset = isinstance(logger, Logger) and logger.level == logging.NOTSET or not isinstance(logger, Logger) + level_display = f"{level_name} (SET)" if not is_unset else level_name + + # Print the logger with color and indentation + color = level_colors.get(level_name, ANSIColor.RESET) + print(" " * indent_level + f"{ansi_sgr(color)}{logger_name} [{level_display}]{ansi_sgr(ANSIColor.RESET)}") + + # Find child loggers based on the current hierarchy level + for name in sorted_package_loggers: + if name.startswith(logger_name + ".") and name.count(".") == logger_name.count(".") + 1: + print_hierarchy(name, indent_level + 1) + + print_hierarchy(package_name) diff --git a/nvflare/fuel/utils/obj_utils.py b/nvflare/fuel/utils/obj_utils.py index 29aca970bf..f88b2477a0 100644 --- a/nvflare/fuel/utils/obj_utils.py +++ b/nvflare/fuel/utils/obj_utils.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import sys @@ -35,7 +34,3 @@ def get_size(obj, seen=None): elif hasattr(obj, "__iter__") and not isinstance(obj, (str, bytes, bytearray)): size += sum([get_size(i, seen) for i in obj]) return size - - -def get_logger(obj): - return logging.getLogger(f"{obj.__module__}.{obj.__class__.__qualname__}") diff --git a/nvflare/fuel/utils/pipe/cell_pipe.py b/nvflare/fuel/utils/pipe/cell_pipe.py index 2d0151e27e..9b62c8aeb6 100644 --- a/nvflare/fuel/utils/pipe/cell_pipe.py +++ b/nvflare/fuel/utils/pipe/cell_pipe.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import queue import threading import time @@ -28,6 +27,7 @@ from nvflare.fuel.utils.attributes_exportable import ExportMode from nvflare.fuel.utils.config_service import search_file from nvflare.fuel.utils.constants import Mode +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.validation_utils import check_object_type, check_str from .pipe import Message, Pipe, Topic @@ -176,7 +176,7 @@ def __init__( workspace_dir (str): the directory that contains startup for joining the cellnet. Required only in secure_mode """ super().__init__(mode) - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.site_name = site_name self.token = token diff --git a/nvflare/fuel/utils/pipe/pipe_handler.py b/nvflare/fuel/utils/pipe/pipe_handler.py index 8f87674bc2..a780369172 100644 --- a/nvflare/fuel/utils/pipe/pipe_handler.py +++ b/nvflare/fuel/utils/pipe/pipe_handler.py @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time from collections import deque from typing import Optional from nvflare.apis.signal import Signal +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.pipe.pipe import Message, Pipe, Topic from nvflare.fuel.utils.validation_utils import ( check_callable, @@ -91,7 +91,7 @@ def __init__( if 0 < heartbeat_timeout <= heartbeat_interval: raise ValueError(f"heartbeat_interval {heartbeat_interval} must < heartbeat_timeout {heartbeat_timeout}") - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.pipe = pipe self.read_interval = read_interval self.heartbeat_interval = heartbeat_interval diff --git a/nvflare/ha/ha_admin_cmds.py b/nvflare/ha/ha_admin_cmds.py index 6e2b5194b5..6a63511b00 100644 --- a/nvflare/ha/ha_admin_cmds.py +++ b/nvflare/ha/ha_admin_cmds.py @@ -13,7 +13,6 @@ # limitations under the License. import json -import logging from nvflare.apis.fl_constant import AdminCommandNames from nvflare.apis.overseer_spec import OverseerAgent @@ -21,6 +20,7 @@ from nvflare.fuel.hci.client.api_status import APIStatus from nvflare.fuel.hci.proto import MetaStatusValue, ProtoKey, make_meta from nvflare.fuel.hci.reg import CommandModule, CommandModuleSpec, CommandSpec +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception @@ -29,7 +29,7 @@ class HACommandModule(CommandModule): def __init__(self, overseer_agent: OverseerAgent): self.overseer_agent = overseer_agent - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def get_spec(self): return CommandModuleSpec( diff --git a/nvflare/ha/overseer_agent.py b/nvflare/ha/overseer_agent.py index 2e5236f39e..9ce96204c6 100644 --- a/nvflare/ha/overseer_agent.py +++ b/nvflare/ha/overseer_agent.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time from typing import Any, Dict, Optional @@ -21,6 +20,7 @@ from requests.adapters import HTTPAdapter from nvflare.apis.overseer_spec import SP, OverseerAgent +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.security.logging import secure_format_exception @@ -51,7 +51,7 @@ def __init__( self._prv_key_path = None self._last_service_session_id = "" self._asked_to_exit = False - self._logger = logging.getLogger(self.__class__.__name__) + self._logger = get_obj_logger(self) self._retry_delay = 4 self._asked_to_stop_retrying = False self._update_callback = None diff --git a/nvflare/job_config/fed_job_config.py b/nvflare/job_config/fed_job_config.py index 165f8e356a..940a773a63 100644 --- a/nvflare/job_config/fed_job_config.py +++ b/nvflare/job_config/fed_job_config.py @@ -14,7 +14,6 @@ import builtins import inspect import json -import logging import os import shlex import shutil @@ -25,6 +24,7 @@ from typing import Dict from nvflare.fuel.utils.class_utils import get_component_init_parameters +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.job_config.base_app_config import BaseAppConfig from nvflare.job_config.fed_app_config import FedAppConfig from nvflare.private.fed.app.fl_conf import FL_PACKAGES @@ -61,7 +61,7 @@ def __init__(self, job_name, min_clients, mandatory_clients=None) -> None: self.resource_specs: Dict[str, Dict] = {} self.custom_modules = [] - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def add_fed_app(self, app_name: str, fed_app: FedAppConfig): if not isinstance(fed_app, FedAppConfig): diff --git a/nvflare/lighter/impl/master_template.yml b/nvflare/lighter/impl/master_template.yml index 44f5b5d42d..09ee86230e 100644 --- a/nvflare/lighter/impl/master_template.yml +++ b/nvflare/lighter/impl/master_template.yml @@ -310,7 +310,7 @@ log_config: | keys=consoleHandler,errorFileHandler [formatters] - keys=fullFormatter + keys=baseFormatter [logger_root] level=INFO @@ -319,16 +319,17 @@ log_config: | [handler_consoleHandler] class=StreamHandler level=DEBUG - formatter=fullFormatter + formatter=baseFormatter args=(sys.stdout,) [handler_errorFileHandler] class=FileHandler level=ERROR - formatter=fullFormatter + formatter=baseFormatter args=('error_log.txt', 'a') - [formatter_fullFormatter] + [formatter_baseFormatter] + class=nvflare.fuel.utils.log_utils.BaseFormatter format=%(asctime)s - %(name)s - %(levelname)s - %(message)s start_ovsr_sh: | diff --git a/nvflare/private/fed/app/client/sub_worker_process.py b/nvflare/private/fed/app/client/sub_worker_process.py index aeb6d297aa..bd2ce4cf8d 100644 --- a/nvflare/private/fed/app/client/sub_worker_process.py +++ b/nvflare/private/fed/app/client/sub_worker_process.py @@ -16,7 +16,6 @@ import argparse import copy -import logging import os import threading import time @@ -44,6 +43,7 @@ from nvflare.fuel.f3.mpm import MainProcessMonitor as mpm from nvflare.fuel.sec.audit import AuditService from nvflare.fuel.sec.security_content_service import SecurityContentService +from nvflare.fuel.utils.log_utils import get_obj_logger, get_script_logger from nvflare.private.defs import CellChannel, CellChannelTopic, new_cell_message from nvflare.private.fed.app.fl_conf import create_privacy_manager from nvflare.private.fed.app.utils import monitor_parent_process @@ -180,7 +180,7 @@ def __init__(self, args, workspace, num_of_processes, local_rank) -> None: MultiProcessCommandNames.CLOSE: self._close, } - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def execute_command(self, request: CellMessage) -> CellMessage: command_name = request.get_header(MessageHeaderKey.TOPIC) @@ -341,7 +341,7 @@ def main(args): job_id = args.job_id log_file = workspace.get_app_log_file_path(job_id) add_logfile_handler(log_file) - logger = logging.getLogger("sub_worker_process") + logger = get_script_logger() sub_executor.run() diff --git a/nvflare/private/fed/app/client/worker_process.py b/nvflare/private/fed/app/client/worker_process.py index 0e018f042f..e438e8e8f1 100644 --- a/nvflare/private/fed/app/client/worker_process.py +++ b/nvflare/private/fed/app/client/worker_process.py @@ -15,7 +15,6 @@ """Provides a command line interface for a federated client trainer.""" import argparse -import logging import os import sys import threading @@ -26,6 +25,7 @@ from nvflare.fuel.f3.mpm import MainProcessMonitor as mpm from nvflare.fuel.utils.argument_utils import parse_vars from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_script_logger from nvflare.private.defs import EngineConstant from nvflare.private.fed.app.fl_conf import FLClientStarterConfiger from nvflare.private.fed.app.utils import monitor_parent_process @@ -100,7 +100,7 @@ def main(args): log_file = workspace.get_app_log_file_path(args.job_id) add_logfile_handler(log_file) - logger = logging.getLogger("worker_process") + logger = get_script_logger() logger.info("Worker_process started.") deployer = conf.base_deployer diff --git a/nvflare/private/fed/app/deployer/server_deployer.py b/nvflare/private/fed/app/deployer/server_deployer.py index acee8d8834..561dc718ed 100644 --- a/nvflare/private/fed/app/deployer/server_deployer.py +++ b/nvflare/private/fed/app/deployer/server_deployer.py @@ -18,7 +18,7 @@ from nvflare.apis.event_type import EventType from nvflare.apis.fl_constant import FLContextKey, SiteType, SystemComponents from nvflare.apis.workspace import Workspace -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.fed.app.utils import component_security_check from nvflare.private.fed.server.fed_server import FederatedServer from nvflare.private.fed.server.job_runner import JobRunner @@ -33,7 +33,7 @@ class ServerDeployer: def __init__(self): """Init the ServerDeployer.""" self.cmd_modules = ServerCommandModules.cmd_modules - self.logger = get_logger(self) + self.logger = get_obj_logger(self) self.server_config = None self.secure_train = None self.app_validator = None diff --git a/nvflare/private/fed/app/server/runner_process.py b/nvflare/private/fed/app/server/runner_process.py index 848d04e648..76dbf73f01 100644 --- a/nvflare/private/fed/app/server/runner_process.py +++ b/nvflare/private/fed/app/server/runner_process.py @@ -26,6 +26,7 @@ from nvflare.fuel.f3.mpm import MainProcessMonitor as mpm from nvflare.fuel.utils.argument_utils import parse_vars from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_script_logger from nvflare.private.defs import AppFolderConstants from nvflare.private.fed.app.fl_conf import FLServerStarterConfiger from nvflare.private.fed.app.utils import monitor_parent_process @@ -79,7 +80,7 @@ def main(args): ) log_file = workspace.get_app_log_file_path(args.job_id) add_logfile_handler(log_file) - logger = logging.getLogger("runner_process") + logger = get_script_logger() logger.info("Runner_process started.") log_level = os.environ.get("FL_LOG_LEVEL", "") @@ -133,7 +134,7 @@ def main(args): logger.warning(err) except ConfigError as e: - logger = logging.getLogger("runner_process") + logger = get_script_logger() logger.exception(f"ConfigError: {secure_format_exception(e)}") secure_log_traceback(logger) raise e diff --git a/nvflare/private/fed/app/simulator/log.config b/nvflare/private/fed/app/simulator/log.config index 19a5f1ab13..07c2963686 100644 --- a/nvflare/private/fed/app/simulator/log.config +++ b/nvflare/private/fed/app/simulator/log.config @@ -5,7 +5,7 @@ keys=root keys=consoleHandler,errorFileHandler [formatters] -keys=fullFormatter +keys=baseFormatter [logger_root] level=INFO @@ -14,14 +14,15 @@ handlers=consoleHandler,errorFileHandler [handler_consoleHandler] class=StreamHandler level=DEBUG -formatter=fullFormatter +formatter=baseFormatter args=(sys.stdout,) [handler_errorFileHandler] class=FileHandler level=ERROR -formatter=fullFormatter +formatter=baseFormatter args=('error_log.txt', 'a') -[formatter_fullFormatter] -format=%(asctime)s - %(name)s - %(levelname)s - %(message)s +[formatter_baseFormatter] +class=nvflare.fuel.utils.log_utils.BaseFormatter +format=%(asctime)s - %(name)s - %(levelname)s - %(message)s \ No newline at end of file diff --git a/nvflare/private/fed/client/client_app_runner.py b/nvflare/private/fed/client/client_app_runner.py index e6ec6335fd..5dca67bf14 100644 --- a/nvflare/private/fed/client/client_app_runner.py +++ b/nvflare/private/fed/client/client_app_runner.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import logging import os from nvflare.apis.fl_constant import FLContextKey, SystemConfigs @@ -19,6 +18,7 @@ from nvflare.apis.workspace import Workspace from nvflare.fuel.f3.cellnet.fqcn import FQCN from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_module_logger from nvflare.private.admin_defs import Message from nvflare.private.defs import CellChannel, EngineConstant, RequestHeader, TrainingTopic, new_cell_message from nvflare.private.fed.app.fl_conf import create_privacy_manager @@ -34,7 +34,7 @@ class ClientAppRunner(Runner): - logger = logging.getLogger("ClientAppRunner") + logger = get_module_logger(__module__, __qualname__) def __init__(self, time_out=60.0) -> None: super().__init__() diff --git a/nvflare/private/fed/client/client_engine.py b/nvflare/private/fed/client/client_engine.py index c91b9e68e4..9e7580f0b2 100644 --- a/nvflare/private/fed/client/client_engine.py +++ b/nvflare/private/fed/client/client_engine.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import re import shutil @@ -31,6 +30,7 @@ from nvflare.fuel.f3.cellnet.cell import Cell from nvflare.fuel.f3.cellnet.defs import CellChannel, MessageHeaderKey, ReturnCode from nvflare.fuel.f3.message import Message as CellMessage +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.aux_runner import AuxMsgTarget, AuxRunner from nvflare.private.defs import ERROR_MSG_PREFIX, ClientStatusKey, EngineConstant, new_cell_message from nvflare.private.event import fire_event @@ -96,7 +96,7 @@ def __init__(self, client: FederatedClient, args, rank, workers=5): if workers < 1: raise ValueError("workers must >= 1") - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.fl_components = [x for x in self.client.components.values() if isinstance(x, FLComponent)] def fire_event(self, event_type: str, fl_ctx: FLContext): diff --git a/nvflare/private/fed/client/client_executor.py b/nvflare/private/fed/client/client_executor.py index 7cef99031a..d7ca4ef4a2 100644 --- a/nvflare/private/fed/client/client_executor.py +++ b/nvflare/private/fed/client/client_executor.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time from abc import ABC, abstractmethod @@ -26,6 +25,7 @@ from nvflare.fuel.f3.cellnet.core_cell import FQCN from nvflare.fuel.f3.cellnet.defs import MessageHeaderKey, ReturnCode from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import CellChannel, CellChannelTopic, JobFailureMsgKey, new_cell_message from nvflare.private.fed.utils.fed_utils import get_job_launcher, get_return_code from nvflare.security.logging import secure_format_exception, secure_log_traceback @@ -130,7 +130,7 @@ def __init__(self, client, startup): startup: startup folder """ self.client = client - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.startup = startup self.run_processes = {} self.lock = threading.Lock() diff --git a/nvflare/private/fed/client/client_run_manager.py b/nvflare/private/fed/client/client_run_manager.py index d68204d42c..cebbdd188f 100644 --- a/nvflare/private/fed/client/client_run_manager.py +++ b/nvflare/private/fed/client/client_run_manager.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import time from typing import Dict, List, Optional, Union @@ -25,6 +24,7 @@ from nvflare.fuel.f3.cellnet.core_cell import FQCN from nvflare.fuel.f3.cellnet.defs import MessageHeaderKey from nvflare.fuel.f3.cellnet.defs import ReturnCode as CellReturnCode +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.aux_runner import AuxMsgTarget, AuxRunner from nvflare.private.defs import CellChannel, CellMessageHeaderKeys, new_cell_message from nvflare.private.event import fire_event @@ -116,7 +116,7 @@ def __init__( for _, widget in self.widgets.items(): self.handlers.append(widget) - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def get_task_assignment(self, fl_ctx: FLContext, timeout=None) -> TaskAssignment: pull_success, task_name, return_shareable = self.client.fetch_task(fl_ctx, timeout) diff --git a/nvflare/private/fed/client/command_agent.py b/nvflare/private/fed/client/command_agent.py index 724b21a449..2ff32fc318 100644 --- a/nvflare/private/fed/client/command_agent.py +++ b/nvflare/private/fed/client/command_agent.py @@ -12,14 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from nvflare.apis.fl_constant import FLContextKey from nvflare.apis.fl_context import FLContext from nvflare.apis.utils.fl_context_utils import gen_new_peer_ctx from nvflare.fuel.f3.cellnet.core_cell import Message as CellMessage from nvflare.fuel.f3.cellnet.core_cell import MessageHeaderKey, ReturnCode from nvflare.fuel.f3.cellnet.core_cell import make_reply as make_cellnet_reply +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import CellChannel, new_cell_message from .admin_commands import AdminCommands @@ -37,7 +36,7 @@ def __init__(self, federated_client) -> None: self.asked_to_stop = False self.commands = AdminCommands.commands - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def start(self, fl_ctx: FLContext): self.engine = fl_ctx.get_engine() diff --git a/nvflare/private/fed/client/communicator.py b/nvflare/private/fed/client/communicator.py index aa8ff11683..6c31f31b90 100644 --- a/nvflare/private/fed/client/communicator.py +++ b/nvflare/private/fed/client/communicator.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import socket import time import traceback @@ -32,6 +31,7 @@ from nvflare.fuel.f3.cellnet.defs import IdentityChallengeKey, MessageHeaderKey, ReturnCode from nvflare.fuel.f3.cellnet.fqcn import FQCN from nvflare.fuel.f3.cellnet.utils import format_size +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import CellChannel, CellChannelTopic, CellMessageHeaderKeys, SpecialTaskName, new_cell_message from nvflare.private.fed.client.client_engine_internal_spec import ClientEngineInternalSpec from nvflare.private.fed.utils.fed_utils import get_scope_prop @@ -94,7 +94,7 @@ def __init__( self.timeout = timeout self.maint_msg_timeout = maint_msg_timeout - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def _challenge_server(self, client_name, expected_host, root_cert_file): # ask server for its info and make sure that it matches expected host diff --git a/nvflare/private/fed/client/fed_client_base.py b/nvflare/private/fed/client/fed_client_base.py index 50afe9add2..ed10e65f9f 100644 --- a/nvflare/private/fed/client/fed_client_base.py +++ b/nvflare/private/fed/client/fed_client_base.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time from typing import List, Optional @@ -31,6 +30,7 @@ from nvflare.fuel.f3.drivers.driver_params import DriverParams from nvflare.fuel.f3.mpm import MainProcessMonitor as mpm from nvflare.fuel.utils.argument_utils import parse_vars +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import EngineConstant from nvflare.private.fed.utils.fed_utils import set_scope_prop from nvflare.security.logging import secure_format_exception @@ -73,7 +73,7 @@ def __init__( compression: communication compression algorithm cell: CellNet communicator """ - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.client_name = client_name self.token = None diff --git a/nvflare/private/fed/server/client_manager.py b/nvflare/private/fed/server/client_manager.py index dccb98ae3d..1e1c58ad11 100644 --- a/nvflare/private/fed/server/client_manager.py +++ b/nvflare/private/fed/server/client_manager.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import threading import time import uuid @@ -23,6 +22,7 @@ from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import Shareable from nvflare.fuel.f3.cellnet.defs import IdentityChallengeKey, MessageHeaderKey +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import CellMessageHeaderKeys, ClientRegSession, InternalFLContextKey from nvflare.private.fed.utils.identity_utils import IdentityVerifier, load_crt_bytes from nvflare.security.logging import secure_format_exception @@ -45,7 +45,7 @@ def __init__(self, project_name=None, min_num_clients=2, max_num_clients=10): self.id_verifier = None self.lock = threading.Lock() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def authenticate(self, request, fl_ctx: FLContext) -> Optional[Client]: client = self.login_client(request, fl_ctx) diff --git a/nvflare/private/fed/server/fed_server.py b/nvflare/private/fed/server/fed_server.py index c305a955e7..21820212f6 100644 --- a/nvflare/private/fed/server/fed_server.py +++ b/nvflare/private/fed/server/fed_server.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging import os import shutil import threading @@ -55,6 +54,7 @@ from nvflare.fuel.f3.mpm import MainProcessMonitor as mpm from nvflare.fuel.utils.argument_utils import parse_vars from nvflare.fuel.utils.config_service import ConfigService +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.zip_utils import unzip_all_from_bytes from nvflare.ha.overseer_agent import HttpOverseerAgent from nvflare.private.defs import ( @@ -125,7 +125,7 @@ def __init__( self.abort_signal = None self.executor = None - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def get_all_clients(self) -> Dict[str, Client]: """Get the list of registered clients. diff --git a/nvflare/private/fed/server/job_cmds.py b/nvflare/private/fed/server/job_cmds.py index e1f1f892a4..74d55ed10a 100644 --- a/nvflare/private/fed/server/job_cmds.py +++ b/nvflare/private/fed/server/job_cmds.py @@ -14,7 +14,6 @@ import datetime import json -import logging import shutil import uuid from typing import Dict, List @@ -34,6 +33,7 @@ from nvflare.fuel.hci.server.binary_transfer import BinaryTransfer from nvflare.fuel.hci.server.constants import ConnProps from nvflare.fuel.utils.argument_utils import SafeArgumentParser +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import RequestHeader, TrainingTopic from nvflare.private.fed.server.admin import new_message from nvflare.private.fed.server.job_meta_validator import JobMetaValidator @@ -77,7 +77,7 @@ class JobCommandModule(CommandModule, CommandUtil, BinaryTransfer): def __init__(self): super().__init__() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def get_spec(self): return CommandModuleSpec( diff --git a/nvflare/private/fed/server/server_command_agent.py b/nvflare/private/fed/server/server_command_agent.py index 6fb55d7e50..52125ebc70 100644 --- a/nvflare/private/fed/server/server_command_agent.py +++ b/nvflare/private/fed/server/server_command_agent.py @@ -12,13 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging - from nvflare.apis.fl_constant import FLContextKey, ServerCommandKey from nvflare.apis.utils.fl_context_utils import gen_new_peer_ctx from nvflare.fuel.f3.cellnet.cell import Cell from nvflare.fuel.f3.cellnet.core_cell import MessageHeaderKey, ReturnCode, make_reply from nvflare.fuel.f3.message import Message as CellMessage +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import CellChannel, CellMessageHeaderKeys, new_cell_message from .server_commands import ServerCommands @@ -31,7 +30,7 @@ def __init__(self, engine, cell: Cell) -> None: Args: listen_port: port to listen the command """ - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.asked_to_stop = False self.engine = engine self.cell = cell diff --git a/nvflare/private/fed/server/server_commands.py b/nvflare/private/fed/server/server_commands.py index b57e0e16f4..cf1361971c 100644 --- a/nvflare/private/fed/server/server_commands.py +++ b/nvflare/private/fed/server/server_commands.py @@ -14,7 +14,6 @@ """FL Admin commands.""" -import logging import time from abc import ABC, abstractmethod from typing import List @@ -30,6 +29,7 @@ from nvflare.apis.fl_context import FLContext from nvflare.apis.shareable import Shareable, make_reply from nvflare.apis.utils.fl_context_utils import gen_new_peer_ctx +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.defs import SpecialTaskName, TaskConstant from nvflare.security.logging import secure_format_exception, secure_format_traceback from nvflare.widgets.widget import WidgetID @@ -41,7 +41,7 @@ class CommandProcessor(ABC): """The CommandProcessor is responsible for processing a command from parent process.""" def __init__(self) -> None: - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) @abstractmethod def get_command_name(self) -> str: diff --git a/nvflare/private/fed/server/server_engine.py b/nvflare/private/fed/server/server_engine.py index b13cb62cc8..f21d836322 100644 --- a/nvflare/private/fed/server/server_engine.py +++ b/nvflare/private/fed/server/server_engine.py @@ -13,7 +13,6 @@ # limitations under the License. import copy -import logging import os import re import shutil @@ -52,6 +51,7 @@ from nvflare.fuel.f3.cellnet.fqcn import FQCN from nvflare.fuel.f3.message import Message as CellMessage from nvflare.fuel.utils.argument_utils import parse_vars +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.zip_utils import zip_directory_to_bytes from nvflare.private.admin_defs import Message, MsgHeader from nvflare.private.aux_runner import AuxMsgTarget @@ -110,7 +110,7 @@ def __init__(self, server, args, client_manager: ClientManager, snapshot_persist self.executor = ThreadPoolExecutor(max_workers=workers) self.lock = Lock() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) self.asked_to_stop = False self.snapshot_persistor = snapshot_persistor diff --git a/nvflare/private/fed/server/server_state.py b/nvflare/private/fed/server/server_state.py index ba8f53cb33..5b0ba3ca9e 100644 --- a/nvflare/private/fed/server/server_state.py +++ b/nvflare/private/fed/server/server_state.py @@ -14,11 +14,11 @@ from __future__ import annotations -import logging from abc import ABC, abstractmethod from nvflare.apis.fl_context import FLContext from nvflare.apis.overseer_spec import SP +from nvflare.fuel.utils.log_utils import get_module_logger ACTION = "_action" MESSAGE = "_message" @@ -40,7 +40,7 @@ class ServerState(ABC): ABORT_CURRENT_RUN = {ACTION: ABORT_RUN, MESSAGE: "Abort current run"} IN_SERVICE = {ACTION: SERVICE, MESSAGE: "Server in service"} - logger = logging.getLogger("ServerState") + logger = get_module_logger(__module__, __qualname__) def __init__(self, host: str = "", port: str = "", ssid: str = "") -> None: self.host = host diff --git a/nvflare/private/fed/server/training_cmds.py b/nvflare/private/fed/server/training_cmds.py index 3c054a1740..8ad9be7b67 100644 --- a/nvflare/private/fed/server/training_cmds.py +++ b/nvflare/private/fed/server/training_cmds.py @@ -13,7 +13,6 @@ # limitations under the License. import json -import logging import time from typing import List @@ -22,6 +21,7 @@ from nvflare.fuel.hci.conn import Connection from nvflare.fuel.hci.proto import ConfirmMethod, MetaKey, MetaStatusValue, make_meta from nvflare.fuel.hci.reg import CommandModule, CommandModuleSpec, CommandSpec +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.private.admin_defs import MsgHeader, ReturnCode from nvflare.private.defs import ClientStatusKey, ScopeInfoKey, TrainingTopic from nvflare.private.fed.server.admin import new_message @@ -37,7 +37,7 @@ class TrainingCommandModule(CommandModule, CommandUtil): def __init__(self): """A class for training commands.""" super().__init__() - self.logger = logging.getLogger(self.__class__.__name__) + self.logger = get_obj_logger(self) def get_spec(self): return CommandModuleSpec( diff --git a/nvflare/private/stream_runner.py b/nvflare/private/stream_runner.py index 3bae0dc0c1..30a0cf7a3b 100644 --- a/nvflare/private/stream_runner.py +++ b/nvflare/private/stream_runner.py @@ -24,7 +24,7 @@ from nvflare.apis.streaming import ConsumerFactory, ObjectConsumer, ObjectProducer, StreamContext, StreamContextKey from nvflare.fuel.f3.cellnet.registry import Registry from nvflare.fuel.utils.config_service import ConfigService -from nvflare.fuel.utils.obj_utils import get_logger +from nvflare.fuel.utils.log_utils import get_obj_logger from nvflare.fuel.utils.validation_utils import check_callable, check_object_type, check_str from nvflare.private.aux_runner import AuxMsgTarget, AuxRunner from nvflare.security.logging import secure_format_exception @@ -109,7 +109,7 @@ def __init__(self, aux_runner: AuxRunner): self.registry = Registry() self.tx_lock = Lock() self.tx_table = {} # tx_id => _ProcessorInfo - self.logger = get_logger(self) + self.logger = get_obj_logger(self) # Note: the ConfigService has been initialized max_concurrent_streaming_sessions = ConfigService.get_int_var("max_concurrent_streaming_sessions", default=20)