]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: use __name__ for module-specific logging
authorNitzanMordhai <nmordech@ibm.com>
Tue, 3 Mar 2026 12:17:07 +0000 (12:17 +0000)
committerPatrick Donnelly <pdonnell@ibm.com>
Fri, 8 May 2026 19:38:59 +0000 (15:38 -0400)
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 <nmordech@ibm.com>
(cherry picked from commit 8c0f0d568f55b655f2a2d330ff79279196d972f1)

25 files changed:
src/pybind/mgr/dashboard/controllers/auth.py
src/pybind/mgr/dashboard/controllers/docs.py
src/pybind/mgr/dashboard/controllers/frontend_logging.py
src/pybind/mgr/dashboard/controllers/multi_cluster.py
src/pybind/mgr/dashboard/controllers/nfs.py
src/pybind/mgr/dashboard/controllers/osd.py
src/pybind/mgr/dashboard/controllers/rbd_mirroring.py
src/pybind/mgr/dashboard/controllers/smb.py
src/pybind/mgr/dashboard/grafana.py
src/pybind/mgr/dashboard/rest_client.py
src/pybind/mgr/dashboard/services/access_control.py
src/pybind/mgr/dashboard/services/auth/auth.py
src/pybind/mgr/dashboard/services/auth/oauth2.py
src/pybind/mgr/dashboard/services/ceph_service.py
src/pybind/mgr/dashboard/services/cephfs.py
src/pybind/mgr/dashboard/services/exception.py
src/pybind/mgr/dashboard/services/iscsi_client.py
src/pybind/mgr/dashboard/services/nvmeof_conf.py
src/pybind/mgr/dashboard/services/orchestrator.py
src/pybind/mgr/dashboard/services/progress.py
src/pybind/mgr/dashboard/services/rgw_client.py
src/pybind/mgr/dashboard/services/service.py
src/pybind/mgr/dashboard/services/sso.py
src/pybind/mgr/dashboard/tests/__init__.py
src/pybind/mgr/dashboard/tools.py

index d4d0f8799be7c7f056f896068ec95a93e3a4425d..2f506f23d25b5eae54cad7b838349035af7a6d90 100644 (file)
@@ -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"),
index 9ecb513621a104ddf5a4212bc141eabfbb35cb0b..42e45049382ff4e838896b67140402d0862a5df9 100644 (file)
@@ -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)
index df9ca19ccfe0826ac5a780b203451b25f2147ee6..d965736264389b7540d550a303cc52e4839a98d3 100644 (file)
@@ -2,7 +2,7 @@ import logging
 
 from . import BaseController, Endpoint, UIRouter
 
-logger = logging.getLogger('frontend.error')
+logger = logging.getLogger(__name__)
 
 
 @UIRouter('/logging', secure=False)
index 9b1cbde0ce8f679aca325bc937cb7a65e7249d7d..bd487268df843865a81298fe3d7c5b3ac5aec510 100644 (file)
@@ -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)
index 75ef63f34186ebaad4be7611403d44d3849c43a4..945ce47bf078489b6c58af520d60bd15ccad1e0e 100644 (file)
@@ -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):
index c7a61810865308cf17f46021c4eca4ab05d89142..c81c29c79ae0ee53d97a6135eb53a44ad852b75a 100644 (file)
@@ -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?"),
index 547e460a1989f94bb3e3b6a3ed07fc5e64f95daa..83f1c06a2a975a186a2f052f1add2ae6e0af1033 100644 (file)
@@ -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):
index a1a59f2a0edecf295cfff7da25fcf4042442dfcc..f505515710be8e35ba66d80fc378132af51232f1 100644 (file)
@@ -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"),
index 8edf9c57d0efbd25a3f94f2917d7604bb32b2b69..9dfdabcdd312e48837006f52d836f77179c34e47 100644 (file)
@@ -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):
index 9e27cb57802da677b12701c9e3f731f4643df584..f1b304c9f6bd8f662abde6b8fb63b609d1a79953 100644 (file)
@@ -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):
index 9e0897d2009172bde51e9bbac8fe5a21e51d0fec..392b3ab799960689672390e0d6d6a2d317926eef 100644 (file)
@@ -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'
 
 
index 7f1cdb5887c390408349b917a4d8e7e2677c2d14..7fb1e7d2c1912da4df966cf58cb0f49981e8fd7a 100644 (file)
@@ -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()
index 50878852897909086a46f3d4a4b84fe71f010b9c..dc0620ea3f9137e973336b90c07bd2d910160786 100644 (file)
@@ -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):
index 19e812eb7c9f2500732daba43dee7eca04be6e72..0dc2c03421a45f0f0c5ba0816015cc48f1bd3cc8 100644 (file)
@@ -16,7 +16,7 @@ try:
 except ImportError:
     pass  # For typing only
 
-logger = logging.getLogger('ceph_service')
+logger = logging.getLogger(__name__)
 
 
 class SendCommandError(rados.Error):
index 3e9b9e5bae218233d662b762407125b6c45a7e5b..ed990f961ea15ba40f4a82f221752fa68395a66a 100644 (file)
@@ -9,7 +9,7 @@ import cephfs
 
 from .. import mgr
 
-logger = logging.getLogger('cephfs')
+logger = logging.getLogger(__name__)
 
 
 class CephFS(object):
index e8e019b0f71e6fe6aaca9b804ab508de98f1fd06..54703b8b7dfe8b2c6dddfb32653e01dbd3954bd1 100644 (file)
@@ -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):
index c222fbb0d75b20a8aa5d225770f87e759c74e8e5..4a8095ff729f26456a1b060c01b4dd6a79325b93 100644 (file)
@@ -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):
index 4179737e8a4b27b8497b1160ca4a0c366a290a90..86fd9bddf6e443e89c72e88c1fcc9ca54526a8b9 100644 (file)
@@ -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):
index 769172b9bfade23655cbaac63f1542af7b7f3eb3..f8a2272065934f5fbded153eedb55a5c26e0d886 100644 (file)
@@ -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
index baf1f92695f6797037e1c9b6407c07b5968bd754..ff5caa5f1d9c54bf017f12b7c13b396f52650f4d 100644 (file)
@@ -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):
index 23ea7dca9ca798de95a2c64177135aa0b3ffd29d..0e7352e072ae669eb69e1dd90883d1f12e82b162 100755 (executable)
@@ -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'
index 12285b061c0b9962f88f7113e7d1c70fad77f478..d1f4ed34e593dfe19a28f09358102716df7dc12e 100644 (file)
@@ -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):
index a3b38b8bc1b24fdb44e508ed62d3005d08275267..bb555d7dd347b06035e67f51b28ca2af4d4c95df 100644 (file)
@@ -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')
index f92f25344351de01d8f4fac5ddeb89ff90f7d9be..30e8da0918837db2fb01c538806e77e855d2f6f1 100644 (file)
@@ -31,7 +31,7 @@ PLUGIN_MANAGER.hook.init()
 PLUGIN_MANAGER.hook.register_commands()
 
 
-logger = logging.getLogger('tests')
+logger = logging.getLogger(__name__)
 
 
 class ModuleTestClass(Module):
index fbf1e26bf41e968bdbfd7d683c6fadf8e7199d43..893e47d349c3302f774338c616c91423b8d10a1e 100644 (file)
@@ -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):