(args=None, log_level=None, reset=False)
| 39 | |
| 40 | |
| 41 | def setup_logging(args=None, log_level=None, reset=False): |
| 42 | if logging.root.handlers: |
| 43 | if reset: |
| 44 | # remove all handlers |
| 45 | for handler in logging.root.handlers[:]: |
| 46 | logging.root.removeHandler(handler) |
| 47 | else: |
| 48 | return |
| 49 | |
| 50 | # log_level can be set by the caller or by the args, the caller has priority. If not set, use INFO |
| 51 | if log_level is None and args is not None: |
| 52 | log_level = args.console_log_level |
| 53 | if log_level is None: |
| 54 | log_level = "INFO" |
| 55 | log_level = getattr(logging, log_level) |
| 56 | |
| 57 | msg_init = None |
| 58 | if args is not None and args.console_log_file: |
| 59 | handler = logging.FileHandler(args.console_log_file, mode="w") |
| 60 | else: |
| 61 | handler = None |
| 62 | if not args or not args.console_log_simple: |
| 63 | try: |
| 64 | from rich.logging import RichHandler |
| 65 | from rich.console import Console |
| 66 | from rich.logging import RichHandler |
| 67 | |
| 68 | handler = RichHandler(console=Console(stderr=True)) |
| 69 | except ImportError: |
| 70 | # print("rich is not installed, using basic logging") |
| 71 | msg_init = "rich is not installed, using basic logging" |
| 72 | |
| 73 | if handler is None: |
| 74 | handler = logging.StreamHandler(sys.stdout) # same as print |
| 75 | handler.propagate = False |
| 76 | |
| 77 | formatter = logging.Formatter( |
| 78 | fmt="%(message)s", |
| 79 | datefmt="%Y-%m-%d %H:%M:%S", |
| 80 | ) |
| 81 | handler.setFormatter(formatter) |
| 82 | logging.root.setLevel(log_level) |
| 83 | logging.root.addHandler(handler) |
| 84 | |
| 85 | if msg_init is not None: |
| 86 | logger = logging.getLogger(__name__) |
| 87 | logger.info(msg_init) |
| 88 | |
| 89 | |
| 90 | setup_logging() |
no outgoing calls
no test coverage detected