docstr: Get a logger for a specific module.
  
  :param module_name: str
      Logic module name.
  :param level: int
  :return: Logger
      Logger object.
docstr_tok: ["Get","a","logger","for","a","specific","module",".",":","param","module_name",":","str","Logic","module","name",".",":","param","level",":","int",":","return",":","Logger","Logger","object","."]
code: def __call__(
      self, module_name, level: Optional[int] = None
  ) -> QlibLogger:
      """
      Get a logger for a specific module.
  
      :param module_name: str
          Logic module name.
      :param level: int
      :return: Logger
          Logger object.
      """
      if level is None:
          level = C.logging_level
  
      if not module_name.startswith("qlib."):
          # Add a prefix of qlib. when the requested ``module_name`` doesn't start with ``qlib.``.
          # If the module_name is already qlib.xxx, we do not format here. Otherwise, it will become qlib.qlib.xxx.
          module_name = "qlib.{}".format(module_name)
  
      # Get logger.
      module_logger = self._loggers.setdefault(
          module_name, QlibLogger(module_name)
      )
      module_logger.setLevel(level)
      return module_logger
  
imports: import logging
  from typing import Optional, Text, Dict, Any
  import re
  from logging import config
  from time import time
  from contextlib import contextmanager
  from .config import C
label_desc: Use image node_id 3 for calling the _QLibLoggerManager obj's underlying member method code with example usage: obj.__call__(module_name, level) and returns: module_logger