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)
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"),
NO_DESCRIPTION_AVAILABLE = "*No description available*"
-logger = logging.getLogger('controllers.docs')
+logger = logging.getLogger(__name__)
@Router('/docs', secure=False)
from . import BaseController, Endpoint, UIRouter
-logger = logging.getLogger('frontend.error')
+logger = logging.getLogger(__name__)
@UIRouter('/logging', secure=False)
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)
ReadPermission, RESTController, Task, UIRouter
from ._version import APIVersion
-logger = logging.getLogger('controllers.nfs')
+logger = logging.getLogger(__name__)
class NFSException(DashboardException):
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?"),
EndpointDoc, ReadPermission, RESTController, Task, UIRouter, \
UpdatePermission, allow_empty_body
-logger = logging.getLogger('controllers.rbd_mirror')
+logger = logging.getLogger(__name__)
class MirrorHealth(IntEnum):
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"),
from .exceptions import GrafanaError
from .settings import Settings
-logger = logging.getLogger('grafana')
+logger = logging.getLogger(__name__)
class GrafanaRestClient(object):
from mgr_util import build_url
-logger = logging.getLogger('rest_client')
+logger = logging.getLogger(__name__)
class TimeoutRequestsSession(requests.Session):
from ..security import Permission, Scope
from ..settings import Settings
-logger = logging.getLogger('access_control')
+logger = logging.getLogger(__name__)
DEFAULT_FILE_DESC = 'password/secret'
@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:
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()
except ModuleNotFoundError:
logging.error("Module 'jmespath' is not installed.")
-logger = logging.getLogger('services.oauth2')
+logger = logging.getLogger(__name__)
class OAuth2(SSOAuth):
except ImportError:
pass # For typing only
-logger = logging.getLogger('ceph_service')
+logger = logging.getLogger(__name__)
class SendCommandError(rados.Error):
from .. import mgr
-logger = logging.getLogger('cephfs')
+logger = logging.getLogger(__name__)
class CephFS(object):
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):
from ..settings import Settings
from .iscsi_config import IscsiGatewaysConfig
-logger = logging.getLogger('iscsi_client')
+logger = logging.getLogger(__name__)
class IscsiClient(RestClient):
from ..exceptions import DashboardException
from ..services.orchestrator import OrchClient
-logger = logging.getLogger('nvmeof_conf')
+logger = logging.getLogger(__name__)
class NvmeofGatewayAlreadyExists(Exception):
from .. import mgr
from ._paginate import ListPaginator
-logger = logging.getLogger('orchestrator')
+logger = logging.getLogger(__name__)
# pylint: disable=abstract-method
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):
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'
from ..settings import Settings
from .orchestrator import OrchClient
-logger = logging.getLogger('service')
+logger = logging.getLogger(__name__)
class NoCredentialsException(Exception):
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')
PLUGIN_MANAGER.hook.register_commands()
-logger = logging.getLogger('tests')
+logger = logging.getLogger(__name__)
class ModuleTestClass(Module):
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)
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:
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()
@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
# 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):
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):