| 28 | |
| 29 | |
| 30 | def _setup_dp_logging(verbosity: int = 0, logs_stream: t.TextIO = None) -> None: |
| 31 | global _have_setup_logging |
| 32 | |
| 33 | log_level = "WARNING" |
| 34 | if verbosity == 1: |
| 35 | log_level = "INFO" |
| 36 | elif verbosity > 1: |
| 37 | log_level = "DEBUG" |
| 38 | |
| 39 | # don't configure global logging config when running as a library |
| 40 | if get_dp_mode() == DPMode.LIBRARY: |
| 41 | log.warning("Configuring datapane logging in library mode") |
| 42 | # return None |
| 43 | |
| 44 | # TODO - only allow setting once? |
| 45 | if _have_setup_logging: |
| 46 | log.warning(f"Reconfiguring datapane logger when running as {get_dp_mode().name}") |
| 47 | # raise AssertionError("Attempting to reconfigure datapane logger") |
| 48 | return None |
| 49 | |
| 50 | # initial setup via dict-config |
| 51 | _have_setup_logging = True |
| 52 | log_config = { |
| 53 | "version": 1, |
| 54 | "disable_existing_loggers": False, |
| 55 | "formatters": { |
| 56 | "colored": { |
| 57 | "()": "colorlog.ColoredFormatter", |
| 58 | "format": "[%(blue)s%(asctime)s%(reset)s] [%(log_color)s%(levelname)-5s%(reset)s] %(message)s", |
| 59 | "datefmt": "%H:%M:%S", |
| 60 | "reset": True, |
| 61 | "log_colors": { |
| 62 | "DEBUG": "cyan", |
| 63 | "INFO": "green", |
| 64 | "WARNING": "yellow", |
| 65 | "ERROR": "red", |
| 66 | "CRITICAL": "red,bg_white", |
| 67 | }, |
| 68 | "style": "%", |
| 69 | } |
| 70 | }, |
| 71 | "handlers": { |
| 72 | "console": { |
| 73 | "class": "logging.StreamHandler", |
| 74 | "level": log_level, |
| 75 | "formatter": "colored", |
| 76 | "stream": logs_stream or sys.stderr, |
| 77 | } |
| 78 | }, |
| 79 | "loggers": {"datapane": {"level": log_level, "propagate": True}}, |
| 80 | # only show INFO for anything else |
| 81 | "root": {"handlers": ["console"], "level": "INFO"}, |
| 82 | } |
| 83 | logging.config.dictConfig(log_config) |
| 84 | |
| 85 | |
| 86 | def enable_logging(): |