From: NitzanMordhai Date: Tue, 3 Mar 2026 12:17:07 +0000 (+0000) Subject: mgr/dashboard: use __name__ for module-specific logging X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=df675696f38377136fc887967125e30f6e05c8b7;p=ceph.git mgr/dashboard: use __name__ for module-specific logging Previously, using a hard-coded logger name like 'rgw_client' created a top-level logger that bypassed the 'mgr.dashboard' hierarchy. By switching to __name__, we ensure the logger identity follows the package structure (e.g., 'mgr.dashboard.services.rgw_client'). Since propagate=True is enabled, this allows log records to flow upward through the 'mgr' parent loggers, ensuring they are correctly captured, formatted, and attributed to the dashboard module rather than falling back to the root logger. Fixes: https://tracker.ceph.com/issues/74848 Signed-off-by: Nitzan Mordechai (cherry picked from commit 8c0f0d568f55b655f2a2d330ff79279196d972f1) --- diff --git a/src/pybind/mgr/dashboard/controllers/auth.py b/src/pybind/mgr/dashboard/controllers/auth.py index d4d0f8799be7..2f506f23d25b 100644 --- a/src/pybind/mgr/dashboard/controllers/auth.py +++ b/src/pybind/mgr/dashboard/controllers/auth.py @@ -20,7 +20,7 @@ from . import APIDoc, APIRouter, ControllerAuthMixin, EndpointDoc, RESTControlle if sys.version_info < (3, 8): http.cookies.Morsel._reserved["samesite"] = "SameSite" # type: ignore # pylint: disable=W0212 -logger = logging.getLogger('controllers.auth') +logger = logging.getLogger(__name__) AUTH_CHECK_SCHEMA = { "username": (str, "Username"), diff --git a/src/pybind/mgr/dashboard/controllers/docs.py b/src/pybind/mgr/dashboard/controllers/docs.py index 9ecb513621a1..42e45049382f 100644 --- a/src/pybind/mgr/dashboard/controllers/docs.py +++ b/src/pybind/mgr/dashboard/controllers/docs.py @@ -11,7 +11,7 @@ from ._version import APIVersion NO_DESCRIPTION_AVAILABLE = "*No description available*" -logger = logging.getLogger('controllers.docs') +logger = logging.getLogger(__name__) @Router('/docs', secure=False) diff --git a/src/pybind/mgr/dashboard/controllers/frontend_logging.py b/src/pybind/mgr/dashboard/controllers/frontend_logging.py index df9ca19ccfe0..d96573626438 100644 --- a/src/pybind/mgr/dashboard/controllers/frontend_logging.py +++ b/src/pybind/mgr/dashboard/controllers/frontend_logging.py @@ -2,7 +2,7 @@ import logging from . import BaseController, Endpoint, UIRouter -logger = logging.getLogger('frontend.error') +logger = logging.getLogger(__name__) @UIRouter('/logging', secure=False) diff --git a/src/pybind/mgr/dashboard/controllers/multi_cluster.py b/src/pybind/mgr/dashboard/controllers/multi_cluster.py index 9b1cbde0ce8f..bd487268df84 100644 --- a/src/pybind/mgr/dashboard/controllers/multi_cluster.py +++ b/src/pybind/mgr/dashboard/controllers/multi_cluster.py @@ -20,7 +20,7 @@ from ..tools import configure_cors from . import APIDoc, APIRouter, CreatePermission, DeletePermission, Endpoint, \ EndpointDoc, ReadPermission, RESTController, UIRouter, UpdatePermission -logger = logging.getLogger('controllers.multi_cluster') +logger = logging.getLogger(__name__) @APIRouter('/multi-cluster', Scope.CONFIG_OPT) diff --git a/src/pybind/mgr/dashboard/controllers/nfs.py b/src/pybind/mgr/dashboard/controllers/nfs.py index 75ef63f34186..945ce47bf078 100644 --- a/src/pybind/mgr/dashboard/controllers/nfs.py +++ b/src/pybind/mgr/dashboard/controllers/nfs.py @@ -19,7 +19,7 @@ from . import APIDoc, APIRouter, BaseController, Endpoint, EndpointDoc, \ ReadPermission, RESTController, Task, UIRouter from ._version import APIVersion -logger = logging.getLogger('controllers.nfs') +logger = logging.getLogger(__name__) class NFSException(DashboardException): diff --git a/src/pybind/mgr/dashboard/controllers/osd.py b/src/pybind/mgr/dashboard/controllers/osd.py index c7a618108653..c81c29c79ae0 100644 --- a/src/pybind/mgr/dashboard/controllers/osd.py +++ b/src/pybind/mgr/dashboard/controllers/osd.py @@ -24,7 +24,7 @@ from . import APIDoc, APIRouter, CreatePermission, DeletePermission, Endpoint, \ from ._version import APIVersion from .orchestrator import raise_if_no_orchestrator -logger = logging.getLogger('controllers.osd') +logger = logging.getLogger(__name__) SAFE_TO_DESTROY_SCHEMA = { "safe_to_destroy": ([str], "Is OSD safe to destroy?"), diff --git a/src/pybind/mgr/dashboard/controllers/rbd_mirroring.py b/src/pybind/mgr/dashboard/controllers/rbd_mirroring.py index 547e460a1989..83f1c06a2a97 100644 --- a/src/pybind/mgr/dashboard/controllers/rbd_mirroring.py +++ b/src/pybind/mgr/dashboard/controllers/rbd_mirroring.py @@ -22,7 +22,7 @@ from . import APIDoc, APIRouter, BaseController, CreatePermission, Endpoint, \ EndpointDoc, ReadPermission, RESTController, Task, UIRouter, \ UpdatePermission, allow_empty_body -logger = logging.getLogger('controllers.rbd_mirror') +logger = logging.getLogger(__name__) class MirrorHealth(IntEnum): diff --git a/src/pybind/mgr/dashboard/controllers/smb.py b/src/pybind/mgr/dashboard/controllers/smb.py index a1a59f2a0ede..f505515710be 100644 --- a/src/pybind/mgr/dashboard/controllers/smb.py +++ b/src/pybind/mgr/dashboard/controllers/smb.py @@ -17,7 +17,7 @@ from .. import mgr from ..security import Scope from . import APIDoc, APIRouter, Endpoint, ReadPermission, RESTController, UIRouter -logger = logging.getLogger('controllers.smb') +logger = logging.getLogger(__name__) CLUSTER_SCHEMA = { "resource_type": (str, "ceph.smb.cluster"), diff --git a/src/pybind/mgr/dashboard/grafana.py b/src/pybind/mgr/dashboard/grafana.py index 8edf9c57d0ef..9dfdabcdd312 100644 --- a/src/pybind/mgr/dashboard/grafana.py +++ b/src/pybind/mgr/dashboard/grafana.py @@ -10,7 +10,7 @@ import requests from .exceptions import GrafanaError from .settings import Settings -logger = logging.getLogger('grafana') +logger = logging.getLogger(__name__) class GrafanaRestClient(object): diff --git a/src/pybind/mgr/dashboard/rest_client.py b/src/pybind/mgr/dashboard/rest_client.py index 9e27cb57802d..f1b304c9f6bd 100644 --- a/src/pybind/mgr/dashboard/rest_client.py +++ b/src/pybind/mgr/dashboard/rest_client.py @@ -31,7 +31,7 @@ from typing import List, Optional from mgr_util import build_url -logger = logging.getLogger('rest_client') +logger = logging.getLogger(__name__) class TimeoutRequestsSession(requests.Session): diff --git a/src/pybind/mgr/dashboard/services/access_control.py b/src/pybind/mgr/dashboard/services/access_control.py index 9e0897d20091..392b3ab79996 100644 --- a/src/pybind/mgr/dashboard/services/access_control.py +++ b/src/pybind/mgr/dashboard/services/access_control.py @@ -25,7 +25,7 @@ from ..exceptions import PasswordPolicyException, PermissionNotValid, \ from ..security import Permission, Scope from ..settings import Settings -logger = logging.getLogger('access_control') +logger = logging.getLogger(__name__) DEFAULT_FILE_DESC = 'password/secret' diff --git a/src/pybind/mgr/dashboard/services/auth/auth.py b/src/pybind/mgr/dashboard/services/auth/auth.py index 7f1cdb5887c3..7fb1e7d2c191 100644 --- a/src/pybind/mgr/dashboard/services/auth/auth.py +++ b/src/pybind/mgr/dashboard/services/auth/auth.py @@ -113,7 +113,7 @@ class JwtManager(object): @classmethod def init(cls): - cls.logger = logging.getLogger('jwt') # type: ignore + cls.logger = logging.getLogger(__name__) # type: ignore # generate a new secret if it does not exist secret = mgr.get_store('jwt_secret') if secret is None: @@ -309,7 +309,7 @@ class AuthManagerTool(cherrypy.Tool): def __init__(self): super(AuthManagerTool, self).__init__( 'before_handler', self._check_authentication, priority=20) - self.logger = logging.getLogger('auth') + self.logger = logging.getLogger(__name__) def _check_authentication(self): JwtManager.reset_user() diff --git a/src/pybind/mgr/dashboard/services/auth/oauth2.py b/src/pybind/mgr/dashboard/services/auth/oauth2.py index 508788528979..dc0620ea3f91 100644 --- a/src/pybind/mgr/dashboard/services/auth/oauth2.py +++ b/src/pybind/mgr/dashboard/services/auth/oauth2.py @@ -18,7 +18,7 @@ try: except ModuleNotFoundError: logging.error("Module 'jmespath' is not installed.") -logger = logging.getLogger('services.oauth2') +logger = logging.getLogger(__name__) class OAuth2(SSOAuth): diff --git a/src/pybind/mgr/dashboard/services/ceph_service.py b/src/pybind/mgr/dashboard/services/ceph_service.py index 19e812eb7c9f..0dc2c03421a4 100644 --- a/src/pybind/mgr/dashboard/services/ceph_service.py +++ b/src/pybind/mgr/dashboard/services/ceph_service.py @@ -16,7 +16,7 @@ try: except ImportError: pass # For typing only -logger = logging.getLogger('ceph_service') +logger = logging.getLogger(__name__) class SendCommandError(rados.Error): diff --git a/src/pybind/mgr/dashboard/services/cephfs.py b/src/pybind/mgr/dashboard/services/cephfs.py index 3e9b9e5bae21..ed990f961ea1 100644 --- a/src/pybind/mgr/dashboard/services/cephfs.py +++ b/src/pybind/mgr/dashboard/services/cephfs.py @@ -9,7 +9,7 @@ import cephfs from .. import mgr -logger = logging.getLogger('cephfs') +logger = logging.getLogger(__name__) class CephFS(object): diff --git a/src/pybind/mgr/dashboard/services/exception.py b/src/pybind/mgr/dashboard/services/exception.py index e8e019b0f71e..54703b8b7dfe 100644 --- a/src/pybind/mgr/dashboard/services/exception.py +++ b/src/pybind/mgr/dashboard/services/exception.py @@ -14,7 +14,7 @@ from ..exceptions import DashboardException, ViewCacheNoDataException from ..rest_client import RequestException from ..services.ceph_service import SendCommandError -logger = logging.getLogger('exception') +logger = logging.getLogger(__name__) def serialize_dashboard_exception(e, include_http_status=False, task=None): diff --git a/src/pybind/mgr/dashboard/services/iscsi_client.py b/src/pybind/mgr/dashboard/services/iscsi_client.py index c222fbb0d75b..4a8095ff729f 100644 --- a/src/pybind/mgr/dashboard/services/iscsi_client.py +++ b/src/pybind/mgr/dashboard/services/iscsi_client.py @@ -15,7 +15,7 @@ from ..rest_client import RestClient from ..settings import Settings from .iscsi_config import IscsiGatewaysConfig -logger = logging.getLogger('iscsi_client') +logger = logging.getLogger(__name__) class IscsiClient(RestClient): diff --git a/src/pybind/mgr/dashboard/services/nvmeof_conf.py b/src/pybind/mgr/dashboard/services/nvmeof_conf.py index 4179737e8a4b..86fd9bddf6e4 100644 --- a/src/pybind/mgr/dashboard/services/nvmeof_conf.py +++ b/src/pybind/mgr/dashboard/services/nvmeof_conf.py @@ -9,7 +9,7 @@ from .. import mgr from ..exceptions import DashboardException from ..services.orchestrator import OrchClient -logger = logging.getLogger('nvmeof_conf') +logger = logging.getLogger(__name__) class NvmeofGatewayAlreadyExists(Exception): diff --git a/src/pybind/mgr/dashboard/services/orchestrator.py b/src/pybind/mgr/dashboard/services/orchestrator.py index 769172b9bfad..f8a227206593 100644 --- a/src/pybind/mgr/dashboard/services/orchestrator.py +++ b/src/pybind/mgr/dashboard/services/orchestrator.py @@ -12,7 +12,7 @@ from orchestrator import DaemonDescription, DeviceLightLoc, HostSpec, \ from .. import mgr from ._paginate import ListPaginator -logger = logging.getLogger('orchestrator') +logger = logging.getLogger(__name__) # pylint: disable=abstract-method diff --git a/src/pybind/mgr/dashboard/services/progress.py b/src/pybind/mgr/dashboard/services/progress.py index baf1f92695f6..ff5caa5f1d9c 100644 --- a/src/pybind/mgr/dashboard/services/progress.py +++ b/src/pybind/mgr/dashboard/services/progress.py @@ -14,7 +14,7 @@ from datetime import datetime, timezone from .. import mgr from . import rbd # pylint: disable=no-name-in-module -logger = logging.getLogger('progress') +logger = logging.getLogger(__name__) def _progress_event_to_dashboard_task_common(event, task): diff --git a/src/pybind/mgr/dashboard/services/rgw_client.py b/src/pybind/mgr/dashboard/services/rgw_client.py index 23ea7dca9ca7..0e7352e072ae 100755 --- a/src/pybind/mgr/dashboard/services/rgw_client.py +++ b/src/pybind/mgr/dashboard/services/rgw_client.py @@ -42,7 +42,7 @@ try: except ImportError: pass # For typing only -logger = logging.getLogger('rgw_client') +logger = logging.getLogger(__name__) _SYNC_GROUP_ID = 'dashboard_admin_group' _SYNC_FLOW_ID = 'dashboard_admin_flow' diff --git a/src/pybind/mgr/dashboard/services/service.py b/src/pybind/mgr/dashboard/services/service.py index 12285b061c0b..d1f4ed34e593 100644 --- a/src/pybind/mgr/dashboard/services/service.py +++ b/src/pybind/mgr/dashboard/services/service.py @@ -13,7 +13,7 @@ from ..exceptions import DashboardException from ..settings import Settings from .orchestrator import OrchClient -logger = logging.getLogger('service') +logger = logging.getLogger(__name__) class NoCredentialsException(Exception): diff --git a/src/pybind/mgr/dashboard/services/sso.py b/src/pybind/mgr/dashboard/services/sso.py index a3b38b8bc1b2..bb555d7dd347 100644 --- a/src/pybind/mgr/dashboard/services/sso.py +++ b/src/pybind/mgr/dashboard/services/sso.py @@ -20,7 +20,7 @@ from ..cli import DBCLICommand from ..services.auth import AuthType, BaseAuth, OAuth2, Saml2 # noqa from ..tools import prepare_url_prefix -logger = logging.getLogger('sso') +logger = logging.getLogger(__name__) try: jmespath = importlib.import_module('jmespath') diff --git a/src/pybind/mgr/dashboard/tests/__init__.py b/src/pybind/mgr/dashboard/tests/__init__.py index f92f25344351..30e8da091883 100644 --- a/src/pybind/mgr/dashboard/tests/__init__.py +++ b/src/pybind/mgr/dashboard/tests/__init__.py @@ -31,7 +31,7 @@ PLUGIN_MANAGER.hook.init() PLUGIN_MANAGER.hook.register_commands() -logger = logging.getLogger('tests') +logger = logging.getLogger(__name__) class ModuleTestClass(Module): diff --git a/src/pybind/mgr/dashboard/tools.py b/src/pybind/mgr/dashboard/tools.py index fbf1e26bf41e..893e47d349c3 100644 --- a/src/pybind/mgr/dashboard/tools.py +++ b/src/pybind/mgr/dashboard/tools.py @@ -30,7 +30,7 @@ class RequestLoggingTool(cherrypy.Tool): def __init__(self): cherrypy.Tool.__init__(self, 'before_handler', self.request_begin, priority=10) - self.logger = logging.getLogger('request') + self.logger = logging.getLogger(__name__) def _setup(self): cherrypy.Tool._setup(self) @@ -180,7 +180,7 @@ class ViewCache(object): self.latency = 0 self.exception = None self.lock = threading.Lock() - self.logger = logging.getLogger('viewcache') + self.logger = logging.getLogger(__name__) def reset(self): with self.lock: @@ -271,7 +271,7 @@ class NotificationQueue(threading.Thread): return cls._running = True cls._instance = NotificationQueue() - cls.logger = logging.getLogger('notification_queue') # type: ignore + cls.logger = logging.getLogger(__name__) # type: ignore cls.logger.debug("starting notification queue") # type: ignore cls._instance.start() @@ -413,7 +413,7 @@ class TaskManager(object): @classmethod def init(cls): - cls.logger = logging.getLogger('taskmgr') # type: ignore + cls.logger = logging.getLogger(__name__) # type: ignore NotificationQueue.register(cls._handle_finished_task, 'cd_task_finished') @classmethod @@ -510,7 +510,7 @@ class TaskManager(object): # pylint: disable=protected-access class TaskExecutor(object): def __init__(self): - self.logger = logging.getLogger('taskexec') + self.logger = logging.getLogger(__name__) self.task = None def init(self, task): @@ -573,7 +573,7 @@ class Task(object): self._end_time: Optional[float] = None self.duration = 0.0 self.exception = None - self.logger = logging.getLogger('task') + self.logger = logging.getLogger(__name__) self.lock = threading.Lock() def __hash__(self):