]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: use __name__ for module-specific logging 67327/head
authorNitzanMordhai <nmordech@ibm.com>
Tue, 3 Mar 2026 12:17:07 +0000 (12:17 +0000)
committerNitzanMordhai <nmordech@ibm.com>
Tue, 3 Mar 2026 12:24:45 +0000 (12:24 +0000)
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>
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 e15a72c2ecdf1fa700f2eeb0568a98ec69c3bb1c..7514f3a9c667138e2bac67d72caf925bee2386b4 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 8926dedd5b849bbfb553beeda3098d81c82bb0ca..6bee5f0c3b05c0fa10b4a95efe2f3440cb9d434e 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 b3f966ecffe4097a8af47008c39db50ff076d878..d49a9528faa3f2bdb060ed581b20dbd964368d2a 100644 (file)
@@ -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()
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 c7a070e5d48e2d03e36720e54e08b4082b9397e7..ac55a92b2be7dcf922d63c3de7f88fb1b58d06dd 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 da06f1b232832f4b35096cc35dc4abd4afdba1d8..97be310ff1f4daa7f3bb4e9a8edab18132cc5799 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 6adcfa571bd0de9430907ad43f21a4d0530cc732..df059d42cb0332bee1eb05e01972a25692121014 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 5355a9ef18562530c58871c469a826413bf7faac..bac8008a2af973cc91fb0ba484ef91c45e223911 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 2fd24119b7f4428d4e4cf71a1cd533edc4a8bbbb..5b4e79b32ff770fc179aa8566c11d4824a91fc65 100644 (file)
@@ -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):