From: NitzanMordhai Date: Tue, 3 Mar 2026 12:17:07 +0000 (+0000) Subject: mgr/dashboard: use __name__ for module-specific logging X-Git-Tag: v21.0.0~22^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8c0f0d568f55b655f2a2d330ff79279196d972f1;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 --- diff --git a/src/pybind/mgr/dashboard/controllers/auth.py b/src/pybind/mgr/dashboard/controllers/auth.py index d4d0f8799be..2f506f23d25 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 e15a72c2ecd..7514f3a9c66 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 df9ca19ccfe..d9657362643 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 9b1cbde0ce8..bd487268df8 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 75ef63f3418..945ce47bf07 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 c7a61810865..c81c29c79ae 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 547e460a198..83f1c06a2a9 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 8926dedd5b8..6bee5f0c3b0 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 8edf9c57d0e..9dfdabcdd31 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 9e27cb57802..f1b304c9f6b 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 9e0897d2009..392b3ab7999 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 b3f966ecffe..d49a9528faa 100644 --- a/src/pybind/mgr/dashboard/services/auth/auth.py +++ b/src/pybind/mgr/dashboard/services/auth/auth.py @@ -106,7 +106,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: @@ -302,7 +302,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 50878852897..dc0620ea3f9 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 c7a070e5d48..ac55a92b2be 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 3e9b9e5bae2..ed990f961ea 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 e8e019b0f71..54703b8b7df 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 c222fbb0d75..4a8095ff729 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 da06f1b2328..97be310ff1f 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 6adcfa571bd..df059d42cb0 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 baf1f92695f..ff5caa5f1d9 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 5355a9ef185..bac8008a2af 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 12285b061c0..d1f4ed34e59 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 a3b38b8bc1b..bb555d7dd34 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 f92f2534435..30e8da09188 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 2fd24119b7f..5b4e79b32ff 100644 --- a/src/pybind/mgr/dashboard/tools.py +++ b/src/pybind/mgr/dashboard/tools.py @@ -31,7 +31,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) @@ -181,7 +181,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: @@ -272,7 +272,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() @@ -414,7 +414,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 @@ -511,7 +511,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): @@ -574,7 +574,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):